Как обновить 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() } } 

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

  • UIBlurEffect в пользовательской модальной презентации
  • Swift - используйте другой init-метод для dequeueReusableCellWithIdentifier
  • Ошибка при изменении имени папки проекта в XCode
  • Программно вернуться к предыдущему ViewController в Swift
  • Панель навигации не отображается в раскадровке в Xcode 6
  • Результаты не будут добавлены от JSON
  • productsRequest не работает в быстрой для покупок в приложении
  • Синхронизация UILabel Autoshrink
  • Быстрая плоская карта и дженерики
  • Как перенаправить обратно в приложение iOS после входа на страницу входа FitBit?
  • прозрачная панель навигации ios
  • Interesting Posts

    iOS – запретить удаление профиля конфигурации iPhone или проверить, установлен ли он

    Использование низкого приоритета GPU для фонового рендеринга

    NSFetchedResultsController пытается вставить нулевой объект

    UIButton titleLabel не отображается

    Проверить значение аргумента, переданное в функцию в модульном тесте

    Вызов веб-службы JSON с параметрами – Objective C – iOS

    Диалоговое окно «Канал фида» продолжает запрашивать разрешение

    Swift 3.0. Добавить виды в UISearchBar

    Отображение фотографий из NSDocumentDirectory

    Можно ли использовать Dropbox, Google Drive, Skydrive и т. Д. В качестве серверного пространства?

    WKWebKit: нет параметров dataDetectorTypes

    Реагирование Нарожденное меню разработки замораживания в эмуляторе iOS

    Делегат UItextView не вызывается с использованием пользовательской клавиатуры

    Идентификатор файла ResourceString для iOS

    Должен ли я по-прежнему регистрироваться для удаленных уведомлений, чтобы включить «Молчаливые уведомления» в моем приложении?

    Давайте будем гением компьютера.