Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在swift中不使用segue从另一个视图控制器发送信息并重新加载页面_Ios_Swift_Uicontainerview - Fatal编程技术网

Ios 在swift中不使用segue从另一个视图控制器发送信息并重新加载页面

Ios 在swift中不使用segue从另一个视图控制器发送信息并重新加载页面,ios,swift,uicontainerview,Ios,Swift,Uicontainerview,我在同一视图中的容器视图中有一个tableView(顶部)和一个view controller(底部)。选择表行时,我需要发送信息并刷新底部视图。我希望它能像苹果股票应用程序一样工作。我最初在另一个页面上有底部视图,并使用了segue,效果非常好。但是我不知道现在没有segue怎么做 以下是选择行的代码: override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)

我在同一视图中的容器视图中有一个tableView(顶部)和一个view controller(底部)。选择表行时,我需要发送信息并刷新底部视图。我希望它能像苹果股票应用程序一样工作。我最初在另一个页面上有底部视图,并使用了segue,效果非常好。但是我不知道现在没有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)

}
我之前为赛格准备的东西:

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
设置为默认值?谢谢!这就是我遗漏的一部分,父母/孩子的关系。到目前为止,它似乎正在这样做。谢谢