Xcode:将信息从 UITableViewController 传递到 UIViewController

Posted

技术标签:

【中文标题】Xcode:将信息从 UITableViewController 传递到 UIViewController【英文标题】:Xcode: Passing Information from UITableViewController to UIViewController 【发布时间】:2017-06-16 12:47:04 【问题描述】:

我有一个 UIViewController,它应该根据在 UITableViewController 中按下的单元格向我显示 DetailInformations。

目前我正在通过续集传递它们:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        if segue.identifier == "show" 
            var ctrl = segue.destination as! DetailViewController
            ctrl.information = _informationList[id]
        
    

id变量通过:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        id = indexPath.row

    

现在在我的 UIViewController 中,我更改了以下信息:

override func viewDidLoad() 
        super.viewDidLoad()
        setInformation(i: information)
    

现在我的问题是,如果我按下,让我们说单元格 2。它切换到 ViewController 并显示单元格 1 的信息。然后我回到 tableview 并按下单元格 3。然后它显示单元格 2。

简而言之,viewController 似乎在设置新信息之前已加载(带有最后的信息)。

有没有更好的办法解决这个问题?

【问题讨论】:

如果您在情节提要中创建了从UITableViewCellUIViewController 的segue,这可以解释这种行为,因为它会在didSelectRowAt: 之前调用prepareForSegue()。因此,创建从UITableViewControllerUIViewController 的segue,并在didSelectRowAt: 中称自己为self.performSegue("show"...) 工作完美,你 【参考方案1】:

尝试在prepareForSegue 中使用indexPathForSelectedRow,因为看起来您已经创建了从UITableViewCell 到目标ViewController 的segue,以便prepareForSegue 将在didSelectRowAt 之前调用。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if segue.identifier == "show" 
        var ctrl = segue.destination as! DetailViewController
        if let indexPath = self.tableView.indexPathForSelectedRow 
            ctrl.information = _informationList[indexPath.row]
        
    

【讨论】:

【参考方案2】:

根据您所描述的内容,我假设您在 Storyboard 中使用了 segue 直接从单元格链接到详细视图控制器。如前所述,这不是您想要做的,因为您没有得到您期望的事件顺序。您可以为此使用委托设计模式,但假设您想坚持使用转场,则需要将表 VC 本身的“显示”转场设置为细节 VC。然后,您从 tableView didSelectRowAt 代码中手动调用 segue。

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    id = indexPath.row
    performSegue(withIdentifier: "show", sender: self)

最后,您可以在返回时使用 unwind segue 来捕获在详细信息 VC 中启动的任何数据更改。

【讨论】:

以上是关于Xcode:将信息从 UITableViewController 传递到 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章

无法将数据从集合视图传递到 Xcode 中的详细视图

更新 XCode 项目模板详细信息

如何从 XCUITest(来自 Xcode 11)中的 xcresult 文件中提取详细信息?

使用 Xcode 从 iPhone 项目到 iPad 项目

xcode - 大写标签输出

将 xib 文件迁移到 Xcode 4.4