我正在玩视图生命周期&我无法从不同视图的负载更改视图。
在我的ViewController.h中,我有:
-(void)viewDidAppear:(BOOL)animated{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ViewController2 *viewController = (ViewController2 *)[storyboard instantiateViewControllerWithIdentifier:@"ViewController2"];
[self presentViewController:viewController animated:YES completion:nil];
}
然而,这只会导致视图在ViewController和ViewController2之间出现在动画中(在循环中)。
我使用了viewDidLoad
中的代码但是这两个视图都没有加载(从阅读开始直到viewWillAppear才能更改视图)
更新:使用viewWillAppear
中的代码时,会引发whose view is not in the window hierarchy
错误。
如何从视图设置阶段更改视图?
更新的
使用上面的代码,内部&在viewDidLoad
,viewWillAppear
& viewDidAppear
或者导致ViewController2的动画显示的无限循环,或者第二次尝试segue(来自循环的结果)崩溃。
答案 0 :(得分:1)
<强>编辑:强>
我不确定你到底想要做什么,但假设你想要出现第一个视图控制器,然后第二个视图控制器立即在第一个视图控制器上动画,你应该能够完成使用几个选项:
首先,您可以在dispatch_async调用中包装您的调用:
dispatch_async(dispatch_get_main_queue(), ^{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ViewController2 *viewController = (ViewController2 *)[storyboard
instantiateViewControllerWithIdentifier:@"ViewController2"];
[self presentViewController:viewController animated:YES completion:nil];
});
或者您可以使用show modally segue:
- (void)viewDidLoad {
[super viewDidLoad];
dispatch_async(dispatch_get_main_queue(), ^{
[self performSegueWithIdentifier:@"myModalSegue" sender:self];
});
}
或者您可以使用导航控制器并使用标准的show segue(正式推送)。这个不需要dispatch_async:
- (void)viewDidLoad {
[super viewDidLoad];
[self performSegueWithIdentifier:@"myshowsegue" sender:self];
}
我已经发布了所有三个的工作示例:github
答案 1 :(得分:0)
最好用loadView
方法交换视图。
- (void)loadView {
CGRect rect = [[UIScreen mainScreen] applicationFrame];
MyView *view = [[MyView alloc] initWithFrame:rect];
[view setAutoresizingMask:UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth];
self.view = view;
}