当前位置:  开发笔记 > IOS > 正文

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

如何解决《在解除显示的VC时,呈现视图控制器会丢失子视图》经验,为你挑选了1个好方法。

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

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.我希望有人可以告诉我关于我不理解视图控制器如何呈现/解除的确切含义.



1> Campbell_Sou..:

在这种情况下,我通常选择两条路线中的一条.设置委托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班级之外]

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

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

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有