如何从另一个ViewController修改UITableView的单元格

时间:2018-01-29 16:38:35

标签: ios swift uitableview

在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我试图修改,因为我相信?

有更简单的方法吗?

4 个答案:

答案 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

如果你不明白,请告诉我