0

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

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

4

3 回答 3

0

您应该能够viewDidLoad像这样覆盖:

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self uiSetup];
}

确保调用[super viewDidLoad];,您拥有的类被选为 Storyboard 中 View Controller 的类,并且您已连接scrollView到 Storyboard 中的滚动视图。

viewDidLoad总是在 UI(主)线程上调用,所以应该没有理由使用performSelectorOnMainThread

于 2013-03-16T22:15:18.430 回答
0

听起来您在情节提要上启用了自动布局,但您的 uiSetup 方法取决于非零帧值。在 Autolayout 下,帧不是在 viewDidLoad 时计算的,而是在生命周期的后期计算的。添加 performSelectorOnMainThread 调用会在主线程上对 uiSetup 的调用进行排队,因此它会在布局完成执行,但是您已经注意到这不是最好看的代码。

任何一个:

  • 更改您的 uiSetup 方法以使用自动布局约束或固定帧大小(这将是我的首选选项,我是自动布局爱好者
  • 调用它viewDidLayoutSubviews(你需要小心,因为这个方法被更频繁地调用)或者viewDidAppear
  • 关闭情节提要上的自动布局(如此所述。
于 2013-03-17T07:32:17.103 回答
0

是的,这正是您将故事板与程序设置相结合的方式。只需确保从系列中选择正确的功能:viewDidLoad: viewWillApear: viewDidAppear:. 此外,您不需要使用performSelectorOnMainThread: withObject: waitUntilDone:来调用您的uiSetup函数。如果您对此有疑问,那么您可能会考虑发布另一个关于此的问题。

于 2013-03-16T21:58:53.473 回答