在UIViewController的主视图中加载自定义UIView

时间:2010-11-25 21:25:08

标签: objective-c ipad uiview uiviewcontroller

我已经将UIView子类化并创建了一个NIB来控制我的应用程序的主要逻辑。

希望视图能够很好地扩展,我想将它用于iPhone和iPad版本的应用程序。

在iPhone上,视图将覆盖全屏。在iPad上,视图将仅覆盖屏幕的一部分。

我已经读过你不应该使用UIViewControllers来控制部分屏幕。所以,我试图使用IB将自定义UIView嵌入到主UIViewController的视图中。

如何做到这一点?

2 个答案:

答案 0 :(得分:6)

经过大量的反复试验后,我找到了一个基于以下question中解释的方法的解决方案,由Brian Webster回答。

该解决方案最初是针对Cocoa环境而提出的。我希望它在iOS环境中也有效。

  1. 使用NIB文件创建主视图控制器。在NIB中,文件所有者应该对应于主视图控制器的类。
  2. 使用NIB文件创建自定义视图控制器。在此NIB中,文件所有者应对应于自定义视图控制器的类。
  3. 在主视图控制器类中创建自定义视图控制器属性。
  4. 在主视图控制器类中创建UIView属性。它将保存您的自定义视图控制器的视图。将其定义为IBOutlet,因此可以在NIB中进行链接。
  5. 在主视图控制器的NIB中删除UIView。将其链接到主视图控制器的视图IBOutlet。它将用作自定义视图的占位符。
  6. 在主视图控制器的viewDidLoad方法中,加载自定义视图控制器NIB,确定自定义视图的帧大小,并在主视图控制器的视图中复制视图。
  7. 以下是一些代码:

    • MainViewController.h

      @interface MainViewController : UIViewController {
        CustomViewController *customViewController;
        UIView *customView;
      }
      @property (nonatomic, retain) CustomViewController *customViewController;
      @property (nonatomic, retain) IBOutlet UIView *customView;
      @end

    • MainViewController.m

      - (void)viewDidLoad {
        CustomViewController *controller = [[CustomViewController alloc] initWithNibName:@"CustomViewController" bundle:nil];
        self.customViewController = controller;
        [controller release];
        customViewController.view.frame = customView.frame;
        customViewController.view.autoresizingMask = customView.autoresizingMask;
        [customView removeFromSuperview];
        [self.view addSubview:customViewController.view];
        self.customView = customViewController.view;
        [super viewDidLoad];
      }
      

答案 1 :(得分:1)

  1. 为您的自定义UIView添加IBOutlet属性到UIViewController,以及您希望访问的任何子视图的其他出口。
  2. 转到Interface Builder,在NIB和Inspector中选择“文件所有者”对象,转到最右边的选项卡,设置其类以匹配您的UIViewController类。
  3. 将IBOutlet从“文件所有者”的第一步连接到您的自定义UIView。
  4. 在XCode中,当您需要加载视图时,请执行以下操作:
  5. -

       [[NSBundle mainBundle] loadNibNamed:@"MyNib" owner:self options:0];
       self.myCustomView.frame=self.view.bounds; // make view fill screen - customize as necessary
       [self.view addSubview:self.myCustomView];
    

    当您加载NIB时,您在步骤1中设置的插座将填充从NIB加载的对象。