从另一个视图控制器发送信息并重新加载页面,而没有swue中的segue

时间:2014-12-22 18:47:12

标签: ios swift uicontainerview

我在同一视图中的容器视图中有一个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
    }
}

非常感谢任何帮助!

2 个答案:

答案 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)

}

我不完全确定这是否有效,但想法是你需要像底层视图的实例来访问它的方法。如果有帮助,请告诉我。