以编程方式创建 UIView 和 UIViewController 并链接在一起的正确方法

Posted

技术标签:

【中文标题】以编程方式创建 UIView 和 UIViewController 并链接在一起的正确方法【英文标题】:Correct method to programmatically create UIView and UIViewController and link together 【发布时间】:2012-05-30 10:51:17 【问题描述】:

我是 ios 开发新手。为了让我的 iOS 应用程序很好地划分,我想以编程方式创建 UIView 和 UIViewController,并在创建后将它们绑定在一起。

所以,我执行以下操作:在我的视图控制器中,我有这个:

-(void)loadView     
   NSLog(@"HPSMainMenuViewController loadView starting"); 
   HPSMainMenuView* mainmenuView = [[HPSMainMenuView alloc]initWithFrame:CGRectZero];
   self.view = mainmenuView; 

在我看来,我有这个:

-(id)initWithFrame:(CGRect)frame 
   self = [super initWithFrame:frame];
   if (self) 
      // Initialization code
      NSLog(@"HPSMainMenuView initWithFrame starting");
      [self setup];
   
   return self; 

-(void)setup 

     UIButton* btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
     btn.tag = E_PROFILE_BUTTON;
     [btn setTitle:@"Option1" forState:UIControlStateNormal];

     [self.view addSubview:btn ];

     btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
     btn.tag = E_CONTACTS_BUTTON;
     [btn setTitle:@"Option2" forState:UIControlStateNormal];

     [self.view addSubview:btn ];

     self.title = @"Hello"; 

这是正确的方法吗(假设我想要完全的程序控制)。在 ViewController 中动态构建视图似乎是错误的,因此我的方法是在实际的 UIView 类中构建视图。

最后,我正在使用 loadView;我应该使用viewDidLoad 吗?如果有,为什么?

非常感谢。

【问题讨论】:

【参考方案1】:

你所做的是正确的,实际上是好的。许多开发人员将他们的视图控制器和视图紧密联系在一起,但如果你想将它们分开,那就太好了。

loadView 是您应该创建和初始化所有内容的地方。如果由于内存警告(例如)而卸载/重新加载视图,则可以多次调用 viewDidLoad。所以viewDidLoad 是您可以恢复保存状态、使您的视图正确反映您的模型或在loadView 中无法进行的任何其他初始化的地方。

【讨论】:

迈克,谢谢。那么,如果视图和控制器是分开的,那么处理方向变化的正确位置在哪里?控制器是否应该要求视图布局控件并允许重新定位代码位于视图内? 将布局内容保留在您的视图中。如果视图需要知道界面方向的值 (UIInterfaceOrientation),您需要将其从各种视图控制器旋转方法之一传递给视图。像view.interfaceOrientationToLayoutFor = newInterfaceOrientation; [view setNeedsLayout]; 这样的东西。然后在-layoutSubviews 中读取该属性。如果您的视图更灵活一点并且只关心调整大小时,您应该像往常一样在视图类中处理-layoutSubviews,并在那里布局所有控件。编辑:稍微改变了示例行 迈克,当我模拟内存警告时,我的应用程序现在崩溃了。我在 loadView 中定义的对象的范围可以吗? 如果没有更多信息,很难知道为什么会发生崩溃。

以上是关于以编程方式创建 UIView 和 UIViewController 并链接在一起的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式创建的 UIView 的框架为 0

如何以编程方式向以编程方式创建的 UIView 添加约束?

以编程方式创建的 uiview 在第一次单击时没有响应

在以编程方式创建的 UIView 层次结构之上添加子视图

以编程方式创建的 UIView 约束,未应用锚点

如何以编程方式创建控制器和 UIView 而不使用界面构建器? [关闭]