通过点击TableView单元格将数据传递到详细信息视图

时间:2017-10-22 14:38:57

标签: ios swift uitableview segue

我正在尝试在tableview和它的详细视图之间进行通信

请你检查我的方式并给我一些建议

所以,我将导航控制器嵌入到表视图

我没有使用tableview(_:didSelectedRowAt)方法。

Stackoverflow中的一些答案,他们说覆盖prepare(:)方法并在performSegue(withIdentifier:)

中编写tableview(_:didSelectedRowAt)方法

但如果我像上面那样编写代码,则会显示两个屏幕。

(我认为因为segue动作被触发了两次)

我只是将segue动作(推送)从表格视图单元格(朋友姓名单元格)拖放到详细视图

通过使用此segue操作,我可以通过prepare(:segue)方法传递数据,以便在详细信息视图中编辑所选的朋友姓名

如果我从详细视图的文本字段编辑好友名称,则会有edit按钮触发展开segue

所以我在详细视图控制器中重写prepare(:segue)方法

并在Table View的ViewController中编写了以下代码

@IBAction func getEditedNameFromDetailView(_ sender:UIStoryboardSegue){
    if sender.source is DetailViewController {
        if let senderVC = sender.source as? DetailViewController {
            data[(self.someTableView.indexPathForSelectedRow?.row)!] = senderVC.editedData!
        }
        someTableView.reloadData()
    }
}

这是传递表视图及其详细视图的正确方法吗?

1 个答案:

答案 0 :(得分:1)

根据您的描述,您可能有2个segues。一个在StoryBoard中,一个在你的代码中。

准备方法不执行segue。它只是让您有机会执行与segue相关的操作,例如将数据传递到目标控制器。如果你已经在StoryBoard中创建了一个,请不要调用perform segue,反之亦然。

prepare的常见用法如下:

   override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        //get the destination controller and cast it to your detail class
        if let destinationController  = segue.destination as? YourDetailClassHere {
           //set the properties you want
            destinationController.someProperty = someValue
        }
    }

几个笔记 -

  • 您可以使用sender对象从执行调用中传递数据。
  • 常见错误是假设目标控制器始终是您的详细控制器。它可以是导航控制器,然后你必须从导航控制器中提取细节。