如何更新DetailView [英] How to update DetailView
问题描述
我有一个基于Master-Detail
模板的快捷应用程序. MasterView
表中的每一行均基于从笔尖收到的自定义单元格.每个单元格都包含UIlabel
和UIbutton
.该应用程序的逻辑如下.如果用户点击行,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屋!