如何更新DetailView [英] How to update DetailView

查看:145
本文介绍了如何更新DetailView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个基于Master-Detail模板的快捷应用程序. MasterView表中的每一行均基于从笔尖收到的自定义单元格.每个单元格都包含UIlabelUIbutton.该应用程序的逻辑如下.如果用户点击行,DetailView将显示一些详细信息,具体取决于所选行.该行上的按钮不调用tableView(_, didSelectRowAtIndexPath).如果用户点击行内的按钮,则仅应更改属于DetailView的图像(DetailView上的其他元素保持不变),但不是.如果我选择另一行而不是选择返回上一行,则更改后的图像将按预期显示在DetailView上.问题是如何仅通过点击按钮在DetailView中重新绘制图像. 我尝试执行以下操作,但没有成功:

I have a swift app based on Master-Detail template. Every row in MasterView table is based on custom cell received from a nib. Every cell includes UIlabel and UIbutton. The logic of the app is following. If user taps on a row DetailView shows some details depending on selected row. The button on the row does not call tableView(_, didSelectRowAtIndexPath). If user taps on the button inside a row only an image belongs to DetailView should be changed (other elements on DetailView remain the same) but it isn't. If I select another row and than select previous row back, changed image is shown on the DetailView as it was foreseen. The question is how to redraw the image in the DetailView just by tapping on the button. I've tried to do following but with no success:

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!
}

推荐答案

我已经找到了解决方案.我已经使用了协议委托机制.现在的代码是:

I've found the solution. I've used protocol-delegate mechanism. Now the code is:

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

此解决方案很可能过于复杂,但它可行且容易实现,可用于各种目的.

It may well be that this solution is excessively complex, but it works and easy could be adapted for various purposes.

这篇关于如何更新DetailView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆