在解除显示的VC时,呈现视图控制器会丢失子视图

我在使用两个以直接方式交互的视图控制器时遇到了一些麻烦:

homeViewController使用addTask按钮显示待办事项列表。 addTask按钮将启动另一个viewController,作为用户填写的“表单”。

然而,在打电话

self.dismissViewControllerAnimated(true, completion: nil); 

呈现的视图控制器内部,我返回到我的主页,但它是空白的,似乎没有任何东西可以看到,除了可以看到故事板上的最高级别视图(即覆盖整个屏幕的那个)。

我的所有视图,场景等都在故事板中设置了autolayout。 我已经浏览了Stack Overflow,这导致我使用自动resize的子视图参数,即:

 self.view.autoresizesSubviews = false; 

无济于事。 我要么修复自动resize参数错误(在错误的视图中,或者只是设置错误),或者有其他问题。

提前致谢

编辑:

我将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。 我希望有人可以告诉我关于我不理解视图控制器是如何呈现/被解雇的确切内容。

在这种情况下,我通常选择两条路线中的一条。 在AddNewTaskViewController上设置委托,或使用展开segue。

使用委托方法,设置协议:

 protocol AddNewTaskViewControllerDelegate { func didDismissNewTaskViewControllerWithSuccess(success: Bool) } 

添加一个可选属性,表示AddNewTaskViewController的委托

 var delegate: AddNewTaskViewControllerDelegate? 

然后在您要解除AddNewTaskViewController时调用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类之外]

通过展开segue方法,看看这个Ray Wenderlich示例: http ://www.raywenderlich.com/113394/storyboards-tutorial-in-ios-9-part-2

此方法涉及从IBAction按住Ctrl键拖动到视图控制器上方的出口对象,然后从弹出菜单中选择正确的操作名称