测试“presentsViewController是UIViewController”在一种情况下工作正常,在其他

时间:2017-06-28 07:42:59

标签: ios swift uiviewcontroller

按照Apple的文档添加和编辑信息Apple guide here我有一个带有tableview的Viewcontroller。 tableview包含带有“Add new”按钮的标题。如果选择了表行,则将detailViewController压入堆栈。 detailViewController也嵌入在UINavigationController中,就像在Apple的文档中一样。如果按下“Add new”,则执行另一个segue,它以模态方式显示UINavigationController,它依次显示detailViewController。这很好用,动画清楚地显示了一个模态呈现的ViewController。

detailViewController在NavigationBar中包含一个取消按钮。如果按下,则运行以下代码:

@IBAction func cancel(_ sender: UIBarButtonItem) {
    // Depending on style of presentation (modal or push presentation), this view controller needs to be dismissed in two different ways.
    var isPresentingInAddActionMode = false
    if let presentingVC = self.presentingViewController{
     isPresentingInAddActionMode = presentingVC is UINavigationController

    }
    streekgidsModel.undoManager.endUndoGrouping()
    print("undo grouping ended and undone")
    streekgidsModel.undoManager.undo()
    if isPresentingInAddActionMode {
        dismiss(animated: true, completion: nil)
    }
    else if let owningNavigationController = navigationController{
        owningNavigationController.popViewController(animated: true)
    }
    else {
        fatalError("The MealViewController is not inside a navigation controller.")
    }
}

第一个if语句检查属性presentViewController是否存在,如果是,则为UINavigationController类型。如果是这样,viewController以模态方式呈现,应该被解除。如果不是它被推入堆栈并且owningNavigationController应该弹出detailViewController。 运行此代码不像Apple描述的那样工作。对showsViewController的检查显示它存在,但类型检查返回“无效”。这被视为错误。 owningNavigationController上的测试成功(我认为它应该失败)并执行popViewController。由于没有推送,视图控制器不会弹出或关闭,仍然可见。第二次按“取消”会再次执行func取消,这会导致错误,因为撤消管理器中不再启动任何组。

令人困惑的是,我在另一个viewcontroller中有相同的代码,具有类似的UIViewTable和导航,并且工作正常。

所以提出问题:为什么这不像Apple描述的那样工作,为什么我的其他视图控制器按预期工作?任何意见都表示赞赏。

BTW,致命错误文本直接来自文档,因此命名不相关,永远不会执行。

1 个答案:

答案 0 :(得分:0)

我首先要检查谁是主持人。

根据Apple的文档:

  

当您使用present(_:animated:completion :)方法以模态方式(显式或隐式)呈现视图控制器时,显示的视图控制器将此属性设置为呈现它的视图控制器。如果视图控制器没有以模态方式呈现,但其中一个祖先是,则此属性包含呈现祖先的视图控制器。如果当前视图控制器或其任何祖先都没有以模态方式呈现,则此属性中的值为nil。

如果文档是正确的,那么你的演示者应该是你的“具有桌面视图的Viewcontroller”,我猜,这不是UINavigationController。如果是这种情况,那么你应该理解你的代码失败的原因。

这当然取决于你的背景,但我只是简单地用这种方式简化检查:

var isPresentingInAddActionMode = self.presentingViewController != nil 
... // your other code
if isPresentingInAddActionMode {
    dismiss(animated: true, completion: nil)
}
else if let owningNavigationController = navigationController{
    owningNavigationController.popViewController(animated: true)
}

如果我正确地理解了您的问题和意图,那么您(哪个班级)提出您的detailVC并且您只关心您的detailVC是如何呈现的 - 无论是推入导航视图控制器还是以模态方式呈现,都无关紧要。我想只需检查presentingViewController属性即可获取该信息。