从 nib 文件加载的 UIView,我可以将所有者设置为它自己的视图吗?

Posted

技术标签:

【中文标题】从 nib 文件加载的 UIView,我可以将所有者设置为它自己的视图吗?【英文标题】:UIView that loaded from nib files , can i set the owner to the view it self? 【发布时间】:2015-05-15 03:45:58 【问题描述】:

最常用的初始化方法是

UIView *rootView = [[[NSBundle mainBundle] loadNibNamed:@"MyRootView" owner:self options:nil] objectAtIndex:0];

在我的例子中,self 是指视图控制器,但我必须将所有者设置为视图本身,因为 .m 和 .xib 之间有很多出口,如何处理这种情况?

【问题讨论】:

没有正确解释您的问题。 问题是在上面的 loadNibNamed 中,我必须将 uiview 的 xib 的文件所有者设置为视图控制器(因为我在视图控制器中使用此视图),这导致许多插座连接崩溃(因为插座是在自定义视图类中定义的,而不是视图控制器类)。 您需要将 uiview 的 xib 的文件所有者设置为视图类(而不是视图控制器)。 并且在代码集中所有者为 nil? 创建自定义 UIView.. 在情节提要中为其设置标识符。并将此类分配给您的 rootViewControllers 视图。并将“MyRootView”设置为您的 RootViewController 作为情节提要标识符。 【参考方案1】:

您应该在 view.m 类中使用 init 方法,例如:

- (id)initWithNibNamed:(NSString *)nibName
     NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:nibName owner:nil options:nil];
     self = [nibContents lastObject];
     if(self)

        //do your code here
      
     return self;
 

并从视图控制器调用此方法。将视图连接到视图 xib。

【讨论】:

添加一个init方法不如为UIView创建一个类别方便。【参考方案2】:

感谢栈溢出,这类问题已经有了完美的解决方案。 https://github.com/PaulSolt/CompositeXib 关键是在自定义视图的实现中调用 loadNibNamed,而不是在创建视图的控制器中。

【讨论】:

我认为这是一种不同的方法~在链接中的示例代码中,我们不需要做任何事情来混合控制器和视图。控制器是控制器,视图是视图。没有视图的所有者是控制器。但仍然非常感谢您的大力帮助:) @AshokLondhe 没关系,但我也告诉过你。 我想也许你在故事板项目中告诉我同样的事情:) 但我无法得到它,因为我不经常使用故事板:)

以上是关于从 nib 文件加载的 UIView,我可以将所有者设置为它自己的视图吗?的主要内容,如果未能解决你的问题,请参考以下文章

NSObject 用 nib 加载 UIView 但文件所有者是 UIViewController

无法将 NIB 文件加载到 UIView

从 nib 文件加载 UIView?

如何在加载了 nib 文件的 UIView 中调整子视图的大小

UIView 在加载 NIB 文件后立即显示?

是否可以从加载到的视图中访问/操作 nib 文件中的约束?