在堆栈中嵌入 2 个或更多导航控制器

Posted

技术标签:

【中文标题】在堆栈中嵌入 2 个或更多导航控制器【英文标题】:having 2 or more navigation controllers embedded on a stack 【发布时间】:2014-12-11 14:44:27 【问题描述】:

我试图在同一个堆栈上获取两个导航控制器,并在它们之间传递数据,解释这一点的最佳方法是下图。

第一个导航控制器(最左边的那个)连接到 TabBarController。

当将数据从 TEST tableViewController 传递到第二个 tableViewController (subDuaList) 时,我在 prepareForSegue 方法中的代码中遇到错误...

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

        var subDua:subDuaList = segue.destinationViewController as subDuaList //ERROR OCCURS HERE

        var Index = tableView!.indexPathForSelectedRow()?.row

        var duaIndex = 130 - Index!

        var selectedDua = self.packagedChapter[duaIndex]
        println(selectedDua.title)

        subDua.duaArray = selectedDua.dataArray
        subDua.rowPressed = Index

    

在导航控制器中嵌入第二个 tableViewController 的原因是 我可以在导航栏中添加一个栏按钮项。

【问题讨论】:

我认为您不需要添加第二个导航控制器即可将 UIBarButtonItem 添加到您的“subDuaList”。 (我不太了解 Swift,所以我会在 Objective-c 中发布代码)只需从情节提要中删除第二个导航控制器并在您的 subDuaList 类(或 prepareForSegue: 方法)中写入 subDua.navigationItem.rightBarButtonItem = yourBarButtonItem; 跨度> 【参考方案1】:

编辑

正如@Shim 正确评论的那样,我的回答只是解释了错误输出的原因,但没有说明我在对您的问题的评论中已经说过的事情

不允许在现有导航堆栈上推送UINavigationController。因此,您应该删除第二个导航控制器,只需将 UIBarButtonItem 添加到您的 subDuaList 视图控制器的 navigationItem


您的错误的原因是,segue.destinationViewController 是第二个 UINavigationController 而不是 subDuaList 视图控制器。

如果允许,您可以通过以下方式修复您的代码

var subDua:subDuaList = segue.destinationViewController as subDuaList //ERROR OCCURS HERE 

var navCtrl:UINavigationController = segue.destinationViewController as UINavigationController 
var subDua:subDuaList = navCtrl.childViewControllers[0] as subDuaList

【讨论】:

即使你解决了这个问题,AFAIK 也不支持将导航控制器推送到现有的导航堆栈上(虽然可以通过模态演示来完成,但这不是一回事),所以它仍然会崩溃(最近在一个 Objective C 项目中遇到这个问题,大概也适用于 Swift)。 你是对的。这就是我在上述问题下的评论中所说的。应该相应地编辑我的答案。【参考方案2】:

您不需要新的导航控制器来添加条形按钮项。您可以通过将它拖到导航栏上来在情节提要中添加一个条形按钮项目(如果视图控制器在导航堆栈中并且您没有看到,请检查检查器中的模拟指标),或者您可以将其添加到代码如下:

self.navigationItem.rightBarButtonItem = myBarButtonItem;

【讨论】:

以上是关于在堆栈中嵌入 2 个或更多导航控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何快速隐藏嵌入在导航堆栈中的视图控制器中的选项卡栏?

内存警告后的导航控制器堆栈问题

将模态视图控制器解散回嵌入在 TabBarController 中的导航控制器堆栈导致崩溃

将导航堆栈移动到更多选项卡

在导航堆栈中以模态方式呈现视图控制器

如何创建以 TabBarViewController 为根的导航堆栈?