Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone ViewDidLoad方法调用行为_Iphone_Ios_Nsthread_Performselector - Fatal编程技术网

Iphone ViewDidLoad方法调用行为

Iphone ViewDidLoad方法调用行为,iphone,ios,nsthread,performselector,Iphone,Ios,Nsthread,Performselector,在myviewDidLoad中,我调用一个函数: [common startActivityIndicatorOnView:self.view]; 此方法在self.view的中心添加一个带有活动指示器的视图。 我的当前视图被推送到导航堆栈上。这是该方法返回后视图的处理方式(活动指示器视图不在中心): 但是,如果我这样调用相同的方法: [common performSelectorOnMainThread:@selector(startActivityIndicatorOnView:) wi

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

[common startActivityIndicatorOnView:self.view];
此方法在
self.view
的中心添加一个带有活动指示器的视图。 我的当前视图被推送到导航堆栈上。这是该方法返回后视图的处理方式(活动指示器视图不在中心):

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

[common performSelectorOnMainThread:@selector(startActivityIndicatorOnView:) withObject:self.view waitUntilDone:NO];
该视图如下图所示(活动指示器视图位于中间):

我不明白,如果呼叫线路写在
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];
}

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

但是,您的viewController视图(和子视图)仍然没有添加到任何视图中

yourViewController.view.superView = nil;
因此,它的视图具有您在xib中设置的框架,但是如果您告诉它在其superview内调整大小,当您添加它时(例如,使用推送或addsubview),它的框架会更改,但您的 微调器不会更改其位置

调用performSelectorOnMainThread只会在稍后调用您的方法,当当前线程向前推进并可能推送了viewController.view时,因此,在执行时,存在viewController.view.superView,因此view.frame已经更改

试着把你的电话转到

[common startActivityIndicatorOnView:self.view];
在ViewWillAppeard方法中:此时,应调整ViewController.view的大小以适合其superView

编辑:

@帕维尔问题:


在什么时候之后,ViewController.view.superView将不为零

平庸:将其视图添加到视图时。也就是说,首先分配并初始化它(使用nib或via代码初始化)

比如:

yourViewControllerInstance = [[YourViewController alloc]initWithNibName:@"yourViewControllerNib" bundle:nil];
[currentViewController.view addSubview:yourViewController.view];
此时将调用类中的方法
viewDidLoad
(但是yourViewController.view.superview 0 nil)

稍后,您通常会使用新的viewController,因此您可以将其“推”到navigationController的堆栈中,或者将其视图添加到当前的viewController中。view。。。比如:

yourViewControllerInstance = [[YourViewController alloc]initWithNibName:@"yourViewControllerNib" bundle:nil];
[currentViewController.view addSubview:yourViewController.view];
可以想象,在这一行之后,yourViewController.view.superView=currentViewController.view,并且调用了yourViewController的方法
viewwillbeen
,因此可以在其中使用superView

请注意,此时您的viewController.view在屏幕上仍然不可见,因此您可以在此处调整大小、移动或添加视图,而用户看不到任何更改


在此之后,您的ViewController将显示,并在最后调用ViewController的方法
viewdide
(对于任何其他代码,以防万一)

尝试self.navigationController.view而不是self.view。@Prince我已经知道调用
performselectornmainthread
会调用主线程中的方法。但我是在
viewDidLoad
中执行此操作的,它本身在主线程中被调用。所以,应该没有区别。逻辑:)。在ViewController.view.superView中,它将出现。在什么时候你的ViewController.view.superView将不为零?@Pavel:看我的新adit(给我一分钟)@meronix,太好了,谢谢!