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

Posted

技术标签:

【中文标题】在 UIViewController 的主视图中加载自定义 UIView【英文标题】:Loading custom UIView in UIViewController's main view 【发布时间】:2010-11-25 21:25:07 【问题描述】:

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

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

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

我读到你不应该使用 UIViewControllers 来控制屏幕的一部分。因此,我正在尝试使用 IB 将自定义 UIView 嵌入到主 UIViewController 的视图中。

如何做到这一点?

【问题讨论】:

【参考方案1】:

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

该解决方案最初建议用于 Cocoa 环境。我希望它在 ios 环境中也有效。

    使用 NIB 文件创建主视图控制器。在 NIB 中,File's Owner 应该对应于您的主视图控制器的类。 使用 NIB 文件创建自定义视图控制器。在此 NIB 中,File's Owner 应与您的自定义视图控制器的类相对应。 在主视图控制器类中创建自定义视图控制器属性。 在主视图控制器类中创建一个 UIView 属性。它将保存您的自定义视图控制器的视图。将其定义为 IBOutlet,以便在 NIB 中链接。 在主视图控制器的 NIB 中放置一个 UIView。将其链接到主视图控制器的视图 IBOutlet。它将用作自定义视图的占位符。 在主视图控制器的 viewDidLoad 方法中,加载自定义视图控制器的 NIB,确定自定义视图的帧大小并将视图复制到主视图控制器的视图中。

这是一些代码:

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];

【讨论】:

【参考方案2】:
    将您的自定义 UIView 的 IBOutlet 属性添加到 UIViewController,并为您希望访问的任何子视图添加其他插座。 转到 Interface Builder,在您的 NIB 中选择“File's Owner”对象,然后在 Inspector 中转到最右侧的选项卡,设置其类以匹配您的 UIViewController 的类。 将“文件所有者”第一步中的 IBOutlet 连接到您的自定义 UIView。 在 XCode 中,当您需要加载视图时,请执行以下操作:

--

   [[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 加载的对象。

【讨论】:

尝试了您的建议,但没有成功。我已经调整了我原来的问题来反映这一点。还有什么想法吗? 提出了我自己的解决方案并编辑了原始问题。 没有 Interface Builder 怎么办? 当我们在xib中添加了customview,为什么还要添加using [self.view addSubview:self.myCustomView]?

以上是关于在 UIViewController 的主视图中加载自定义 UIView的主要内容,如果未能解决你的问题,请参考以下文章

在 UIScrollView Swift3 中加载 UIViewController

在 UIView 中加载 UITableView

在 MainWindow.xib 中加载视图 .xib

为啥我的 UIViewController 不在其视图的响应者链中?

在初始化程序中加载 webview 内容

如何从情节提要以编程方式加载 UIViewController?