Swift / XCode 6.4:导航控制器的问题(后退按钮和prepareForSegue

时间:2015-09-04 22:54:42

标签: ios xcode swift uitableview segue

我的前提是我对XCode和Swift完全不熟悉,所以我知道我犯的是愚蠢的错误,但我不知道在哪里。这是我的iOS应用故事板的一部分:

enter image description here

其中第一个表视图和第二个导航控制器之间的segue称为myTaskDetailSegue,其类型为Show(例如Push)。现在我有一些问题:

1)既没有在第一个表视图控制器也没有在第二个显示后退按钮,我不知道为什么。许多人告诉我导航栏和后退按钮在导航控制器中是默认的,但它们没有出现

2)在第一个表视图控制器的类中,这里是方法prepareForSegue()

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if (segue.identifier == "myTaskDetailSegue" ) {
        let indexPath = self.tableView.indexPathForSelectedRow()
        let task = self.taskCollection[indexPath!.row] as Task

        let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailsMyTasksViewController

        controller.detailItem = task

        println("segue mostra task \(task.id)")
        controller.navigationItem.leftItemsSupplementBackButton = true
    }
}

所以你可以读到segue标识符是正确的,但是当点击一行时没有任何反应,并且没有显示第二个表视图控制器。

由于我的经验不足,我真的不知道自己错过了什么......如果你能帮助我并向我解释这些事情,我将非常感激。 感谢所有

以下是完整的故事板: enter image description here

1 个答案:

答案 0 :(得分:5)

您不需要两个UINavigationController来实现您想要达到的目标。需要注意的是,每次推送(使用segue或手动)时,新的UIViewController都会添加到导航堆栈中。

根据Apple

  

推送视图控制器会在导航界面中显示其视图,并相应地更新导航控件。您通常推送视图控制器以响应当前视图控制器中的用户操作 - 例如,响应用户点击表中的行。

因此,您可以删除故事板中的第二个UINavigationController并将segue直接发送到DetailsMyTaskViewController并以下列方式更新您的prepareForSegue

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

   if (segue.identifier == "myTaskDetailSegue" ) {

       let indexPath = self.tableView.indexPathForSelectedRow()
       let task = self.taskCollection[indexPath!.row] as Task

       let controller = segue.destinationViewController as! DetailsMyTasksViewController

       controller.detailItem = task
       println("segue mostra task \(task.id)")
   }
}

如前所述,您的后退按钮应默认显示。不过,我强烈建议您阅读以下两个指南:

为了更好地理解导航堆栈等,

我希望这对你有所帮助。