在VC#1中,我有一个UITableView。当我点击一个单元格时,我被带到VC#2,其中显示有关该单元格的信息。
我希望能够在VC#2中按一个按钮来改变它在VC#1中对应的单元格的标题,但是我对如何做到这一点很困惑?
我应该在VC#2中创建一个变量来保存被轻击的单元格的indexPath,然后从VC#2调用VC#1中使用该indexPath来更新单元格的函数吗?如果我这样做,VC#1不需要是静态的,所以我知道我正在修改VC#1的正确实例吗?我正在使用push segue和导航控制器返回,所以创建一个新的VC#1实例不会引用相同的VC我试图修改,因为我相信?
有更简单的方法吗?
答案 0 :(得分:1)
您应该使用委托模式。
VC1应该知道VC2正在显示什么单元格。你应该在VC1中有一个IndexPath
属性来存储VC2当前显示的单元格,对吧?
现在,创建一个名为VC2Delegate
的协议:
protocol VC2Delegate : class {
func titleDidChange(_ vc2: VC2, to title: String)
}
现在,在VC2中添加此属性:
weak var delegate: VC2Delegate?
现在,当您认为单元格的标题应该更改时,请调用委托:
delegate?.titleDidChange(self, to: "Some Title")
这对VC2来说都是。
使VC1符合VC2Delegate
:
extension VC1: VC2Delegate {
func titleDidChange(_ vc2: VC2, to title: String) {
// set the text of the table cell here...
}
}
现在,当您从VC1向VC2传递数据时,可能在prepareForSegue
方法中,执行
vc2.delegate = self
详细了解代表here。
答案 1 :(得分:0)
这是你追求的错误做法。您必须将数据层与表示层分开。因此在VC#2中编辑可视化数据,然后VC#1重新加载数据以更新其视图。
答案 2 :(得分:0)
简短的回答:你根本不应该这样做。
视图控制器不应修改其他视图控制器的视图。
您应该修改VC2中的数据模型,然后将消息发送回VC1,告诉它更新单元格。
(在push segue中,您可以将VC1设置为VC2的委托,然后定义VC2用于向VC1通知需要更新的数据模型的indexPath的协议。)
答案 3 :(得分:0)
您可以使用委托
通过视图控制器传递所需的每个数据首先根据需要创建协议
protocol ViewControllerDelegate {
func getSelected(value:Int)
}
从您希望传递数据的ViewController创建一个变量
var delegate: ViewControllerDelegate?
在didSelectRowAt方法中,您将执行
if delegate != nil {
delegate.getSelected(value: indexPath.row)
}
self.navigationController?.popViewController(animated: true)
在接收数据的ViewController上,您必须执行此操作
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let vc = segue.destination as? SecondViewController {
vc.delegate = self
}
}
extension YourViewController: ViewControllerDelegate {
fun getSelected(value:Int) {
// Get value from another view controller and manage it
}
}
此代码位于Swift 4
中如果你不明白,请告诉我