我在玩两个以直接方式交互的视图控制器时遇到了一些麻烦:
homeViewController使用addTask按钮显示待办事项列表。 addTask按钮将启动另一个viewController,它充当用户填充的“表单”。
然而,在致电
时 self.dismissViewControllerAnimated(true, completion: nil);
在呈现的视图控制器中我返回到我的主页,但它是空白的,除了可以看到故事板上的最高级别视图外,似乎什么都看不到(即覆盖整个屏幕。)
我的所有视图,场景等都在故事板中设置了自动布局。我已经浏览了Stack Overflow,这导致我玩自动调整大小子视图参数,即:
self.view.autoresizesSubviews = false;
无济于事。我要么修复自动调整大小参数错误(在错误的视图中,或者只是设置错误),或者遇到其他问题。
提前致谢
编辑:
我将VC呈现如下:
func initAddNewTaskController(){
let addNewTaskVC = self.storyboard?.instantiateViewControllerWithIdentifier("AddNewTaskViewController") as! AddNewTaskViewController;
self.presentViewController(addNewTaskVC, animated: true, completion: nil);
}
EDIT2:
虽然我接受使用委托或解开segue确实可以规避我遇到的问题(正如campbell_souped建议的那样),但当我解除导致空白屏幕的视图控制器时,我仍然不明白发生了什么。
我理解调用dismissViewControllerAnimated会传递给呈现视图控制器(在本例中是我的homeViewController)。由于我不需要做任何解雇前或解雇后的配置,因此我认为(在我看来)代表的使用是不必要的。
我目前的想法是出于某种原因,当我调用
时dismissViewControllerAnimated(true, completion:nil);
在我的addNewTaskViewController中,它实际上是在释放我的homeViewController。我希望有人可以告诉我关于我不理解视图控制器如何被呈现/解散的具体内容。
答案 0 :(得分:5)
在这种情况下,我通常选择两条路线中的一条。在AddNewTaskViewController
上设置委托,或使用展开segue。
使用委托方法,设置协议:
protocol AddNewTaskViewControllerDelegate {
func didDismissNewTaskViewControllerWithSuccess(success: Bool)
}
添加一个可选属性,代表AddNewTaskViewController
var delegate: AddNewTaskViewControllerDelegate?
然后在您即将解雇didDismissNewTaskViewControllerWithSuccess
时调用AddNewTaskViewController
:
如果成功添加了记录:
self.delegate?.didDismissNewTaskViewControllerWithSuccess(true)
self.dismissViewControllerAnimated(true, completion: nil);
或者如果取消/失败:
self.delegate?.didDismissNewTaskViewControllerWithSuccess(false)
self.dismissViewControllerAnimated(true, completion: nil);
最后,将自己设置为委托,修改以前的代码段:
func initAddNewTaskController(){
let addNewTaskVC = self.storyboard?.instantiateViewControllerWithIdentifier("AddNewTaskViewController") as! AddNewTaskViewController;
self.presentViewController(addNewTaskVC, animated: true, completion: nil);
}
到此:
func initAddNewTaskController() {
guard let addNewTaskVC = self.storyboard?.instantiateViewControllerWithIdentifier("AddNewTaskViewController") as AddNewTaskViewController else { return }
addNewTaskVC.delegate = self
self.presentViewController(addNewTaskVC, animated: true, completion: nil);
}
...
}
// MARK: AddNewTaskViewControllerDelegate
extension homeViewController: AddNewTaskViewControllerDelegate {
func didDismissNewTaskViewControllerWithSuccess(success: Bool) {
if success {
self.tableView.reloadData()
}
}
}
[扩展名在homeViewController
类之外]
使用unwind segue方法,看看这个Ray Wenderlich示例: http://www.raywenderlich.com/113394/storyboards-tutorial-in-ios-9-part-2
此方法涉及从IBAction按住Ctrl键拖动到视图控制器上方的退出对象,然后从弹出菜单中选择正确的操作名称