我在同一视图中的容器视图中有一个tableView(顶部)和一个视图控制器(底部)。我需要在选择表格行时发送信息并刷新底部视图。我希望它像苹果股票应用程序一样工作。我最初在另一个页面上有底部视图并使用了segue,它运行得很好。但我现在还不确定如何在没有赛格的情况下做到这一点。
以下是选择行的代码:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if let cell = tableView.cellForRowAtIndexPath(indexPath) {
let item = items[indexPath.row]
}
tableView.deselectRowAtIndexPath(indexPath, animated: true)
}
我以前对segue的所作所为:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let controller = segue.destinationViewController as SNPDetailViewController
if let indexPath = tableView.indexPathForCell(sender as UITableViewCell) {
controller.itemToEdit = items[indexPath.row]
}
}
当我在(现在)底部视图中使用segue时工作正常:
override func viewDidLoad() {
super.viewDidLoad()
if let item = itemToEdit {
title = item.name
snpDetails.text = item.details
}
}
非常感谢任何帮助!
答案 0 :(得分:1)
在表视图控制器中,self.parentViewController
将指向容器视图控制器。然后,您可以通过容器的childViewControllers
属性获取对现有详细信息视图控制器的引用:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if let cell = tableView.cellForRowAtIndexPath(indexPath) {
let item = items[indexPath.row]
if let vc = self.parentViewController {
let siblings = vc.childViewControllers
if siblings.count > 1 {
if let detailVC = siblings[1] as? SNPDetailViewController {
detailVC.itemToEdit = item
} else {
println("Odd, that detail view controller is not the right class")
abort()
}
} else {
println("Odd, there is no detail view controller")
abort()
}
} else {
println("Strange, I'm not embedded in a parent view controller")
abort()
}
}
tableView.deselectRowAtIndexPath(indexPath, animated: true)
}
这假设您的表视图控制器位于childViewControllers
的索引0处,并且详细视图控制器位于索引1处。如果相反,请将siblings[1]
修改为siblings[0]
。< / p>
您可能需要为itemToEdit实现setter方法,以便在值更改时重新加载标签等。
答案 1 :(得分:0)
我猜你的底层视图是 SNPDetailViewController
正如您在上一段代码中所看到的,您有一个名为 controller 的变量。您的实际代码中缺少该变量。尝试在您的第一段代码中创建它:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if let cell = tableView.cellForRowAtIndexPath(indexPath) {
let item = items[indexPath.row]
}
let controller = SNPDetailViewController()
// then you can call the _itemToEdit_ method in your other view
if let indexPath = tableView.indexPathForCell(sender as UITableViewCell) {
controller.itemToEdit = items[indexPath.row]
}
tableView.deselectRowAtIndexPath(indexPath, animated: true)
}
我不完全确定这是否有效,但想法是你需要像底层视图的实例来访问它的方法。如果有帮助,请告诉我。