最佳位置放置UIViewController的设置代码在哪里?

3

我对界面构建器感到非常沮丧,现在尝试通过代码创建我的视图控制器。我已经成功设置了窗口,并创建了导航控制器并将其添加为根视图控制器...

我不确定应该从哪里开始添加按钮并设置它们的目标...

我应该把做这件事的代码放在UIViewController的子类中,还是其他地方更好?

另外一旦我完成这个任务...最好的放置自动布局约束的位置是哪里?

任何帮助都将不胜感激。


https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/ViewLoadingandUnloading/ViewLoadingandUnloading.html - LE SANG
是的...那是我在提问后找到的苹果文档。我不知道是否应该回答自己的问题,但苹果希望你重写loadView方法。 - Matt Zera
重写loadView时要小心,只用于自定义VC的topView。如果使用XIB或StoryBoard,请在viewDidLoad中设置。还要检查在viewWillAppear和viewDidLayOutSubViews中设置。 - LE SANG
3个回答

4
每一个视图控制器子类应该创建和释放它自己的按钮、控件、子视图等。你可以通过覆盖UIViewController方法来完成所有的视图控制器设置。
- (void)viewDidLoad
{
   [super viewDidLoad];
   ...
   UIButton* newButton = [UIButton buttonWithType:...];
   // other button config (including constraints)
   [self addSubview:newButton];
   ...
   // create and setup other subviews
}

我一直在查看 Apple 的文档,我认为他们希望你覆盖 UIViewController 的 loadView 方法,并在那里设置整个视图。他们甚至提到设置约束。 - Matt Zera
@MattZera 如果你完全不使用 nib,我认为两者都没有优势。viewDidLoad 也允许你混合使用 nib/代码,所以为了一致性,我使用它。 - Justin Meiners
@MattZera 在不使用 NIB/XIB 的情况下,正确使用 loadView 和 viewDidLoad 方法的 UIViewController - Justin Meiners
"[super viewDidLoad];" 应该始终首先被调用。这个想法是告诉超类先做它的事情,然后根据需要进行修改。如果你最后调用 super,你的修改可能会被覆盖。 - Elise van Looij

2
每个视图控制器都应该是自己的自定义类,继承于UIViewController(或者UITableViewController等)。这样每个视图控制器的逻辑就都包含在它自己的类中。
我的做法是重写viewDidLoad方法(不要忘记调用[super viewDidLoad];),来创建、设置和添加视图控制器所需的所有子视图。这也是你设置每个子视图约束条件或自动调整掩码的地方。
如果您需要进行任何自定义布局,则可在viewWillLayoutSubviews方法中进行。

0
非常感谢您的协助。我已经在苹果文档中搜索了这个主题,发现苹果希望您覆盖UIViewControllerloadView方法并在那里设置整个视图。他们甚至提到了设置约束的内容。我认为您可以在视图加载后设置它们,因为如果您不覆盖该函数,它会给您一个空视图,但我想按照苹果建议的方式来做,以确保安全。
如果我浪费了您的时间,我很抱歉。在提问之前,我应该更仔细地查看资料。
- (void)loadView
{
    CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame];
    UIView *contentView = [[UIView alloc] initWithFrame:applicationFrame];
    contentView.backgroundColor = [UIColor blackColor];
    self.view = contentView;

    levelView = [[LevelView alloc] initWithFrame:applicationFrame viewController:self];
    [self.view addSubview:levelView];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接