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 似乎在设置新信息之前已加载(带有最后的信息)。
有没有更好的办法解决这个问题?
【问题讨论】:
如果您在情节提要中创建了从UITableViewCell
到UIViewController
的segue,这可以解释这种行为,因为它会在didSelectRowAt:
之前调用prepareForSegue()
。因此,创建从UITableViewController
到UIViewController
的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的主要内容,如果未能解决你的问题,请参考以下文章