我倾向于使用故事板和代码组合来设置我的UI。我有一段时间没有触及objective-c,但我确实记得让UI代码正常工作,我必须在ViewDidLoad下添加这样的'performSelectorOnMainThread'代码。 (如果你不这样做,并将代码置于viewDidLoad下的uiSetup下,或者甚至在没有performSelectorOnMainThread的情况下调用[self uiSetup],代码将无法运行,因为我认为是懒惰加载)
[self performSelectorOnMainThread:@selector(uiSetup) withObject:nil waitUntilDone:NO];
然后在'uiSetup'这样的事情......
- (void)uiSetup
{
NSArray *colors = [NSArray arrayWithObjects:[UIColor redColor], [UIColor greenColor], [UIColor blueColor], nil];
for (int i = 0; i < colors.count; i++) {
CGRect frame;
frame.origin.x = self.scrollView.frame.size.width * i;
frame.origin.y = 0;
frame.size = self.scrollView.frame.size;
UIView *subview = [[UIView alloc] initWithFrame:frame];
subview.backgroundColor = [colors objectAtIndex:i];
[self.scrollView addSubview:subview];
}
self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width * colors.count, self.scrollView.frame.size.height);
}
我正在尝试正确地完成这个项目,所以我想知道,有没有更有效的方法来做到这一点?也许我应该覆盖另一种方法?
答案 0 :(得分:0)
是的,这正是您将故事板与编程设置相结合的方式。只需确保从家庭中选择正确的功能:viewDidLoad:
viewWillApear:
viewDidAppear:
。此外,您不需要使用performSelectorOnMainThread: withObject: waitUntilDone:
来调用uiSetup
功能。如果您遇到问题,那么您可以考虑发布另一个问题。
答案 1 :(得分:0)
你应该可以像这样覆盖viewDidLoad
:
- (void)viewDidLoad
{
[super viewDidLoad];
[self uiSetup];
}
请务必致电[super viewDidLoad];
,将您所拥有的课程选为故事板中视图控制器的课程,并将scrollView
连接到故事板中的滚动视图。< / p>
始终在UI(主)线程上调用
viewDidLoad
,因此没有理由使用performSelectorOnMainThread
答案 2 :(得分:0)
听起来你在故事板上启用了Autolayout,但你的uiSetup方法依赖于非零帧值。在Autolayout下,不在viewDidLoad中计算帧,而是在生命周期中稍后计算帧。添加performSelectorOnMainThread调用会在主线程上对uiSetup进行排队,以便在布局完成后执行,但是您已经注意到这不是最好看的代码。
或者:
viewDidLayoutSubviews
调用它(您需要注意更频繁地调用此方法)或viewDidAppear