Как обновить DetailView

У меня есть быстрое приложение, основанное на шаблоне Master-Detail . Каждая строка в таблице MasterView основана на пользовательской ячейке, полученной от наконечника. В каждую ячейку входят UIlabel и UIbutton . Логика приложения следующая. Если пользователь DetailView на строку DetailView некоторые детали отображаются в зависимости от выбранной строки. Кнопка в строке не вызывает tableView(_, didSelectRowAtIndexPath) . Если пользователь нажимает кнопку внутри строки, следует изменить только изображение, входящее в DetailView (другие элементы в DetailView остаются теми же), но это не так. Если я выберу другую строку и выберем предыдущую строку назад, измененное изображение будет показано в DetailView как это было предусмотрено. Вопрос заключается в том, как перерисовать изображение в DetailView просто нажав на кнопку. Я пытался сделать следующее, но без успеха:

 class MasterViewCell: UITableViewCell { weak var detailViewController: DetailViewController? @IBAction func buttonTap(sender: AnyObject) { //method to set new image detailViewController!.setNewImage() detailViewController!.view.setNeedsDisplay() } } class MasterViewController: UITableViewController { override func viewDidLoad() { super.viewDidLoad() let nib = UINib(nibName: "itemCell", bundle: nil) tableView.registerNib(nib, forCellReuseIdentifier: "Cell") if let split = self.splitViewController { let controllers = split.viewControllers self.detailViewController = (controllers[controllers.count-1] as! UINavigationController).topViewController as? DetailViewController } } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as? MasterViewCell cell?.detailView = self.detailViewController return cell! } 

Вам нужно использовать обработчик

 typealias ButtonHandler = (Cell) -> Void class Cell: UITableViewCell { var changeImage: ButtonHandler? func configureButton(changeImage: ButtonHandler?) { self.changeImage = changeImage } @IBAction func buttonTap(sender: UIButton) { changeImage?(self) } } 

И в вашем MasterView

  override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! Cell cell.configureButton(setNewImage()) return cell } private func setNewImage() -> ButtonHandler { return { [unowned self] cell in let row = self.tableView.indexPathForCell(cell)?.row //Get the row that was touched //set the new Image } } 

ИСТОЧНИК: iOS Swift, обновить пользовательскую метку ячейки UITableView за пределами таблицы. CellForRow с использованием тега

Я нашел решение. Я использовал механизм протокола-делегата. Теперь код:

 //protocol declaration: protocol MasterViewCellDelegate: class { func updateImage(sender: MasterViewCell, detVC: DetailViewController) } // cell class class MasterViewCell: UITableViewCell { weak var masterViewCellDelegate: MasterViewCellDelegate? // protocol property weak var masterViewController: MasterViewController? { didSet { // set delegate self.masterViewDelegate = masterViewController!.detailViewController } } @IBAction func buttonTap(sender: AnyObject) { var detVC: DetailViewController? if let split = masterViewController!.splitViewController { let controllers = split.viewControllers detVC = (controllers[controllers.count - 1] as! UINavigationController).topViewController as? DetailViewController } // call delegate masterViewCellDelegate?.updateImage(self, detVC: detVC) } class MasterViewController: UITableViewController { override func viewDidLoad() { super.viewDidLoad() let nib = UINib(nibName: "itemCell", bundle: nil) tableView.registerNib(nib, forCellReuseIdentifier: "Cell") if let split = self.splitViewController { let controllers = split.viewControllers self.detailViewController = (controllers[controllers.count-1] as! UINavigationController).topViewController as? DetailViewController } } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as? MasterViewCell cell?.masterViewController = self return cell! } // declare detailviewcontroller as delegate class DetailViewController: UIViewController, MasterViewCellDelegate { func updateImage(sender: MasterViewCell, detVC: DetailViewController){ detVC.setNewImage() } } 

Вполне возможно, что это решение является чрезмерно сложным, но оно работает и легко может быть адаптировано для различных целей.

  • Двойная инициализация члена подкласса UIViewController в Swift
  • Обнаруживать, если устройство iPhone X
  • Передача объекта NSManagedObject эффективно с помощью раскадровки
  • Представление UIImageJpg позволяет удвоить разрешение изображения
  • Добавление и сохранение нового контакта в AddressBook
  • Преобразование местоположения касания UITapGestureRecognizer для SpriteKit - Swift
  • UIButton addTarget Selector не работает
  • Ошибка XCode 6 Beta 4 - «При запуске была обнаружена ошибка (Domain = com.apple.CoreSimulator.SimError, Code = 146)»
  • Быстрая ошибка dynamicCast при вводе нового объекта в базу данных
  • Эффект вибрации на UIButton в интерфейсе Builder
  • Изменение шрифта UITableViewCell в iOS 8 и быстрый
  • Давайте будем гением компьютера.