如何更新DetailView

我有一个基于Master-Detail模板的快速应用程序。 MasterView表中的每一行都基于从nib收到的自定义单元格。 每个单元格都包含UIlabelUIbutton 。 该应用程序的逻辑如下。 如果用户点击一行DetailView显示一些细节取决于选定的行。 该行上的button不调用tableView(_, didSelectRowAtIndexPath) 。 如果用户点击一行内的button,只有属于DetailView的图像应该被更改( DetailView上的其他元素保持不变),但不是。 如果我select另一行并且select上一行,则更改后的图像将显示在DetailView ,如前所述。 问题是如何通过点击button来重绘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,使用标签更新tableview CellForRow之外的UITableView自定义单元格标签

我find了解决scheme。 我使用了协议委托机制。 现在的代码是:

 //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() } } 

这个解决scheme很可能是过于复杂的,但它的工作原理和容易可以适应各种目的。

Interesting Posts