【发布时间】:2016-04-12 10:11:51
【问题描述】:
我的视图控制器层次结构如下:
- 入口点是
UINavigationController,其根视图控制器是通常的UITableViewController。表格视图显示字母列表。 - 当用户点击一个单元格时,push segue 被触发,视图转换为
ContainerViewController。它包含一个嵌入的ContentViewController,其作用是在屏幕上显示选定的字母。
内容视图控制器将要显示的字母存储为属性letter: String,应在其视图被推送到屏幕之前设置。
class ContentViewController: UIViewController {
var letter = "-"
@IBOutlet private weak var label: UILabel!
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
label.text = letter
}
}
相反,容器视图控制器不应该知道任何关于该字母的信息(内容不知道),因为我正在尝试构建它以使其尽可能可重用。
class ContainerViewController: UIViewController {
var contentViewController: ContentViewController? {
return childViewControllers.first as? ContentViewController
}
}
我尝试在我的表视图控制器中相应地写prepareForSegue():
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let containerViewController = segue.destinationViewController as? ContainerViewController {
let indexPath = tableView.indexPathForCell(sender as! UITableViewCell)!
let letter = letterForIndexPath(indexPath)
containerViewController.navigationItem.title = "Introducing \(letter)"
// Not executed:
containerViewController.contentViewController?.letter = letter
}
}
但是 contentViewController 在调用此方法时尚未创建,并且从未设置 letter 属性。
值得一提的是,当直接在 Content View Controller 上设置 segue 的目标视图控制器时,这确实有效——在相应地更新 prepareForSegue() 之后。
您知道如何实现这一目标吗?
【问题讨论】:
-
“容器视图控制器不应该对字母一无所知”似乎是一个奇怪的要求。用户看到了一个表格视图,他们点击了一行,出现了另一个视图控制器......当然它应该知道这些数据。听起来您正在寻找真正的问题的解决方案。
-
嗯...我不同意那个。容器视图控制器的目的是(可以?)改变其子视图控制器的呈现方式,而不是格式化和传递数据本身。以
UISplitViewController为例:它不应该知道所呈现的数据——UIPageViewController或UINavigationController类似。 -
或者我在这里遗漏了一些重要的东西......在这种情况下,我将非常感谢您的反馈:)
标签: ios swift cocoa-touch