【问题标题】:UIViewController: set self.view to my view or add my view as subview?UIViewController:将 self.view 设置为我的视图或将我的视图添加为子视图?
【发布时间】:2009-09-15 04:45:52
【问题描述】:

我有一个关于UIViewController的子视图的问题,我创建了一个UIView子类MainView,它具有屏幕的确切大小,我想知道添加MainView的更好方法,考虑以下因素:

1 由于MainView与整个屏幕大小相同,因此MainView本身可能有子视图,但在保存级别没有与MainView一样的视图(即我不需要在self.view中添加其他子视图)。

2 如果我使用 self.view = mainView,我是否将代码放在 loadView 中(因为 viewDidLoad 方法意味着视图(self.view)已经加载)?我看到loadView方法默认被注释掉了,如果我在这个方法中添加代码,我还需要把其他代码放在一起吗(例如初始化应用程序的其他方面)?

3 如果我通过 [self addSubview:mainView] 添加 mainView,实际上是否有两个屏幕外缓冲区?一个给self.view,一个给mainView,都和屏幕一样大,一个叠在另一个上面(这样会浪费内存)?

非常感谢!

【问题讨论】:

    标签: iphone uiviewcontroller


    【解决方案1】:

    我不确定我是否完全理解您的问题,但我会尝试回答您的一些问题。

    首先,如果屏幕上有多个 UIView,它们都会被加载到内存中。您必须执行 -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;
    }
    

    【讨论】:

      【解决方案2】:

      我会通过在 xib 中解决所有这些问题!如果您在 xib 中创建 UIView,则可以更改它的类(当您选择 UIView 时,身份检查器的 Class Identity 部分中应该有一个文本字段* - 在此处输入“MainView”!)

      然后,通过调用创建视图控制器

      myViewController = [[MainViewController alloc] initWithNibName:@"MyNibName" bundle:nil]; 
      

      这应该可以解决您的问题;它是您的视图控制器的主要子视图(可从 self.view 直接访问),您无需担心内存使用情况,只有一个视图 :)

      山姆

      NB * 单击工具 -> 身份检查器。直到我不得不写下这个答案,我才知道它被称为这个!

      【讨论】:

      • 这种方式可行,但有一个问题,适用于不同的设备,如 iPhone 3.5、4.0 和 iPad 等。
      【解决方案3】:

      如果您确实使用 NIB 初始化视图控制器,则必须实现 loadView

      UIViewController 负责适当地调整其“主”视图的大小。这就是您需要做的所有事情:

      - (void)loadView
      {
          UIView* mainView = [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
          self.view = mainView;
      }
      

      【讨论】:

        【解决方案4】:

        是的,上面显示的第一个 code-sn-p 是“标准”方法,AFAIK,当不使用(邪恶!)NIB 文件时 - 即通过 loadView 在代码中分配视图时。

        请注意,似乎也可以使用以下内容,而不是对屏幕矩形大小进行硬编码:

        UIView *myView = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame]; 
        self.view = myView; 
        [myView release];
        

        请注意,您肯定想要进行 [myView release] 调用,因为确实,如上所述,self.view(对于UIView) 是一个保留 属性。

        干杯,-dk

        【讨论】:

          【解决方案5】:

          也许最重要的事情是确保您具备以下条件:

          self.view.userInteractionEnabled = YES;
          

          虽然可能并非一直都需要它,但它解决了 self.view 无响应的问题。偶尔会出现这个问题。

          【讨论】:

            猜你喜欢
            • 2010-12-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-21
            • 1970-01-01
            相关资源
            最近更新 更多