【问题标题】:Pass Data to Detail View by Tapping TableView Cell通过点击 TableView 单元将数据传递到详细视图
【发布时间】:2018-04-03 04:10:06
【问题描述】:

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

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

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

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

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

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

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

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

通过使用这个 segue 动作,我可以通过 prepare(:segue) 方法传递数据,以便在详细视图中编辑选定的朋友姓名

如果我从详细视图的文本字段中编辑朋友姓名,则会有edit 按钮触发展开转场

所以我在详细视图控制器中覆盖 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()
    }
}

这是传达表格视图及其详细视图的正确方式吗?

【问题讨论】:

    标签: ios swift uitableview segue


    【解决方案1】:

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

    prepare 方法没有执行 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 对象从 perform 调用中传递数据。
    • 常见的错误是假设目标控制器始终是您的细节控制器。它可以是导航控制器,然后您必须从导航控制器中提取详细信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-03
      • 2014-01-07
      • 2014-05-23
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      • 2013-07-29
      相关资源
      最近更新 更多