iOS:结合故事板和程序化UI设置

时间:2013-03-16 21:49:37

标签: iphone ios objective-c xcode

我倾向于使用故事板和代码组合来设置我的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);
}

我正在尝试正确地完成这个项目,所以我想知道,有没有更有效的方法来做到这一点?也许我应该覆盖另一种方法?

3 个答案:

答案 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进行排队,以便在布局完成后执行,但是您已经注意到这不是最好看的代码。

或者:

  • 更改您的uiSetup方法以使用Autolayout约束或固定帧大小(这将是我的首选选项,我是autolayout lover
  • viewDidLayoutSubviews调用它(您需要注意更频繁地调用此方法)或viewDidAppear
  • 关闭故事板上的Autolayout(如here所述。