Ios 在swift中不使用segue从另一个视图控制器发送信息并重新加载页面
我在同一视图中的容器视图中有一个tableView(顶部)和一个view controller(底部)。选择表行时,我需要发送信息并刷新底部视图。我希望它能像苹果股票应用程序一样工作。我最初在另一个页面上有底部视图,并使用了segue,效果非常好。但是我不知道现在没有segue怎么做 以下是选择行的代码:Ios 在swift中不使用segue从另一个视图控制器发送信息并重新加载页面,ios,swift,uicontainerview,Ios,Swift,Uicontainerview,我在同一视图中的容器视图中有一个tableView(顶部)和一个view controller(底部)。选择表行时,我需要发送信息并刷新底部视图。我希望它能像苹果股票应用程序一样工作。我最初在另一个页面上有底部视图,并使用了segue,效果非常好。但是我不知道现在没有segue怎么做 以下是选择行的代码: override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if let cell = tableView.cellForRowAtIndexPath(indexPath) {
let item = items[indexPath.row]
}
tableView.deselectRowAtIndexPath(indexPath, animated: true)
}
我之前为赛格准备的东西:
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
}
}
非常感谢您的帮助 我猜您的底视图是SNPDetailViewController 正如您在前面的代码中所看到的,您有一个名为controller的变量。实际代码中缺少该变量。尝试在第一段代码中创建它:
override func tableView(tableView:UITableView,didSelectRowAtIndexPath:nsindepath){
如果let cell=tableView.cellforrowatinexpath(indexPath){
let item=items[indexPath.row]
}
let controller=SNPDetailViewController()
//然后可以在其他视图中调用_itemToEdit_方法
如果让indexPath=tableView.indexPathForCell(发送方为UITableViewCell){
controller.itemToEdit=items[indexPath.row]
}
tableView.declerowatinexpath(indexPath,动画:true)
}
在表视图控制器中,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处。将同级[1]
修改为同级[0]
,如果情况正好相反
您可能需要为itemToEdit实现setter方法,以便在值更改时重新加载标签等。itemToEdit是一个变量。所以我需要设置它,然后以某种方式刷新SNPDetailViewController。所以我调用了viewDidLoad方法,它就工作了。这是重新加载的“正确”方式吗?谢谢哈,我以为这是一种方法,然后是的。我不知道这是否是“正确”的方法,但这是我使用的方法。因此,这样做会导致我在SNPDetailViewController中的所有iboutlets设置为nil。我正在尝试更改它们的文本值,很明显,这些值现在不起作用。您是否先将
itemToEdit
设置为默认值?谢谢!这就是我遗漏的一部分,父母/孩子的关系。到目前为止,它似乎正在这样做。谢谢