iOS:从viewDidAppear更改视图

时间:2014-11-27 11:19:19

标签: ios objective-c

我正在玩视图生命周期&我无法从不同视图的负载更改视图。

在我的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错误。

如何从视图设置阶段更改视图?

更新的 使用上面的代码,内部&在viewDidLoadviewWillAppear& viewDidAppear或者导致ViewController2的动画显示的无限循环,或者第二次尝试segue(来自循环的结果)崩溃。

2 个答案:

答案 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;
}