ViewDidLoad方法调用行为

时间:2013-04-09 10:05:40

标签: iphone ios nsthread performselector

在我的viewDidLoad中,我调用了一个函数:

[common startActivityIndicatorOnView:self.view];

此方法在self.view的中心添加一个带有活动指示符的视图。 我当前的视图被推送到导航堆栈。这是此方法返回后视图的显示方式(活动指示器视图不在中心): enter image description here

但是,如果我用这种方式调用相同的方法:

[common performSelectorOnMainThread:@selector(startActivityIndicatorOnView:) withObject:self.view waitUntilDone:NO];

视图如下图所示(活动指示器视图位于中心):

enter image description here

我不明白,如果调用行是用viewDidLoad编写的,它会有什么不同。 如果有人能帮助我做到这一点,请提前感谢。

仅供参考, 方法如下所示:

-(void) startActivityIndicatorOnView:(UIView *)view {
    if ([NSRunLoop currentRunLoop] != [NSRunLoop mainRunLoop]) {
        [self performSelectorOnMainThread:@selector(startActivityIndicatorOnView:) withObject:view waitUntilDone:NO];
        return;
    }
    view.userInteractionEnabled = NO;
    activityBgView = [[UIView alloc] initWithFrame:CGRectMake((view.frame.size.width/2) - 50, (view.frame.size.width/2) - 50, 100, 100)];
    activityBgView.center = view.center;
    activityBgView.backgroundColor = [UIColor grayColor];
    activityBgView.alpha = 0.8;
    spinner = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake((activityBgView.frame.size.width/2)-10, (activityBgView.frame.size.width/2)-10, 20, 20)];
    spinner.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
    spinner.center = view.center;

    [view addSubview:activityBgView];
    [view addSubview:spinner];
    [spinner startAnimating];
}

1 个答案:

答案 0 :(得分:0)

加载viewControllers时调用ViewDidLoad(通过nib / xib或在loadView方法中以编程方式创建),这意味着xcode创建所有视图并实例化并分配xib中的所有对象...

但是,你的viewController视图(和子视图)仍未添加到任何视图......

yourViewController.view.superView = nil;

所以,它的视图有你在xib中设置的帧,但如果你告诉它在超级视图中调整大小,当你添加它时(例如使用push或addsubview),它的帧会改变,但你的 旋转器不会改变它的位置。

调用performSelectorOnMainThread只是稍后调用你的方法,当你的当前线程提前一步并且可能已经推送了你的viewController.view,因此,当你执行时,你的ViewController.view.superView存在,所以view.frame已经改变了。 / p>

尝试将您的电话转移至

[common startActivityIndicatorOnView:self.view];
在viewWillAppear方法中的

:此时你的viewController.view应该已经调整大小以适应它的superView

修改

@ pavel问题:

  

在什么时候你的ViewController.view.superView将不是nil?

平庸地:将视图添加到视图中时。也就是说,你分配并初始化它(使用nib或通过代码初始化)

类似的东西:

yourViewControllerInstance = [[YourViewController alloc]initWithNibName:@"yourViewControllerNib" bundle:nil];

此时调用类中的方法viewDidLoad(但是你的ViewController.view.superview 0 nil)

稍后,您通常会使用新的viewController,因此您可以在navigationController的堆栈中“推送”它,或者只是将其视图添加到当前的viewController.view ...类似于:

[currentViewController.view addSubview:yourViewController.view];

在这一行之后,如您所想,调用yourViewController.view.superView = currentViewController.view和yourViewController的方法viewWillAppear,因此您可以在其中使用superView。

请注意,此时您的viewController.view仍然无法在屏幕上显示,因此您可以在此处调整尺寸,移动或添加视图,而无需用户看到任何更改。

之后,yourViewController将显示,最后,调用yourViewController的方法viewDidAppear(对于任何其他代码,以防万一)