【问题标题】:Problems with Navigation Controller (back button and prepareForSegue)导航控制器的问题(后退按钮和 prepareForSegue)
【发布时间】:2015-12-01 04:16:27
【问题描述】:

我保证我对 Xcode 和 Swift 完全陌生,所以我知道我犯了一些愚蠢的错误,但我不知道在哪里。这是我的 iOS 应用故事板的一部分:

第一个表格视图和第二个导航控制器之间的segue称为myTaskDetailSegue,其类型为Show (e.g. 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 标识符是正确的,但是当点击一行时没有任何反应并且第二个表格视图控制器没有显示。

由于缺乏经验,我真的不知道自己缺少什么。

这是完整的故事板:

【问题讨论】:

  • 两个UINavigationViewControllers的目的是什么?
  • 我认为他们需要有一个导航栏和后退按钮......在第一个表格视图和第二个表格视图中......这是错误的吗?
  • 是的,您只需要一个位于堆栈“顶部”的导航控制器
  • 对不起,我不明白...为什么我需要一个?
  • 因为导航控制器管理着它下面出现的所有视图控制器。当您推送一个新场景时,您会将其推送到现有的导航堆栈中。您没有返回按钮的原因是因为您正在推送一个新的控制器堆栈,所以您推送的场景是顶部并且无处可返回。

标签: ios xcode swift uitableview segue


【解决方案1】:

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

根据Apple

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

因此,您可以删除 Storyboard 中的第二个 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)")
   }
}

并且您的后退按钮应该默认出现,如您之前所说。尽管如此,我还是强烈建议您阅读以下两个指南:

为了更好地理解导航栈等

希望对你有所帮助。

【讨论】:

  • 感谢 Victor 的帮助,但它仍然无法正常工作,segue 和后退按钮都没有显示...我该怎么做才能发现错误?
  • 您是否删除了第二个UINavigationController,然后将单元格中的push segue添加到DetailsMyTaskViewController
  • 好的,我刚刚又完成了一遍......现在segue完美运行,我看到从第二个表格视图控制器到第一个的后退按钮,但仍然没有第二个后退按钮(来自第一个表视图控制器的那个)
  • @LoryLory 你永远不会在第一个UITableViewController 中看到后退按钮,而是rootViewController,导航堆栈中的第一个,那么它会去哪里?
  • 嗯...我不这么认为。我刚刚上传了完整故事板的屏幕截图。第一个只是一个片段。所以,根据你所说的......我只需要一个导航控制器对吗?而且我应该把它放在登录屏幕截图之后和标签栏控制器之前,对吧?
猜你喜欢
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多