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