UIViewController:将self.view设置为我的视图或将我的视图添加为子视图?

时间:2009-09-15 04:45:52

标签: iphone uiviewcontroller

我有一个关于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,两个都与屏幕大小相同,一个层叠在另一个上面(因此浪费内存)?

非常感谢!

5 个答案:

答案 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没有响应的问题。这个问题偶尔会出现。