我有一个关于UIViewController的子视图的问题,我创建了一个UIView子类MainView,它具有确切的屏幕大小,我想知道哪个是添加MainView的更好方法,请考虑以下因素:
1由于MainView与整个屏幕的大小相同,MainView本身可能有子视图,但在MainView中没有保存级别的视图(即我不需要向self.view添加其他子视图)。 / p>
2如果我使用self.view = mainView,我是否将代码放在loadView中(因为viewDidLoad方法意味着视图(self.view)已经加载)?我看到默认情况下注释了loadView方法,如果我将代码添加到此方法,我需要将其他代码放在一起(例如,初始化应用程序的其他方面)?
3如果我通过[self addSubview:mainView]添加mainView,实际上有两个屏幕外缓冲区吗?一个用于self.view,一个用于mainView,两个都与屏幕大小相同,一个层叠在另一个上面(因此浪费内存)?
非常感谢!
答案 0 :(得分:2)
我不确定我完全明白你在问什么,但我会尝试回答你的一些问题。
首先,如果你在屏幕上有多个UIViews,它们都被加载到内存中。您必须执行-removeFromSuperview并释放它们以获取内存。
您可以将UIView指定为UIViewController的视图。例如:
MainView *mainView = [[MainView alloc] initWithFrame:CGRectMake(320.0, 480.0)];
self.view = mainView;
[mainView release]; //since the .view property is a retained property
在这种情况下,您在-init方法中拥有视图的初始化代码。只需重新定义它:
- (id)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
//initializations
}
return self;
}
答案 1 :(得分:1)
我在xib中解决所有这些问题!如果在xib中创建UIView,则可以更改它的类(当您选择UIView时,Identity检查器的Class Identity部分中应该有一个文本字段* - 在此处键入'MainView'!)
然后,通过调用
创建视图控制器myViewController = [[MainViewController alloc] initWithNibName:@"MyNibName" bundle:nil];
那应该可以解决你的问题;它是你的视图控制器的主要子视图(可以从self.view直接访问),你不需要担心内存使用,只有一个视图:)
萨姆
NB *点击工具 - >身份检查员。在我不得不写这个答案之前,我不知道它被称为这个!
答案 2 :(得分:1)
如果使用NIB初始化视图控制器,则必须实现loadView
。
UIViewController负责适当调整其“主”视图的大小。这就是你需要做的所有事情:
- (void)loadView
{
UIView* mainView = [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
self.view = mainView;
}
答案 3 :(得分:0)
是的,上面显示的第一个代码片段是“标准”方法AFAIK,当不使用(邪恶的!)NIB文件时 - 即通过loadView在代码中分配视图时。
请注意,似乎人们也可以使用以下内容,而不是硬编码屏幕大小:
UIView *myView = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
self.view = myView;
[myView release];
请注意肯定想要执行 [myView release] 调用,因为事实上,如上所述, self.view (for UIView)是保留的属性。
干杯,-dk
答案 4 :(得分:0)
也许最重要的事情是确保您拥有以下内容:
self.view.userInteractionEnabled = YES;
虽然可能并非一直需要它,但它修复了self.view没有响应的问题。这个问题偶尔会出现。