按照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,致命错误文本直接来自文档,因此命名不相关,永远不会执行。答案 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
属性即可获取该信息。