以编程方式创建 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 并链接在一起的正确方法的主要内容,如果未能解决你的问题,请参考以下文章