【问题标题】:Load custom UIView with XIB from a View Controller's view using IB使用 IB 从 View Controller 的视图中加载带有 XIB 的自定义 UIView
【发布时间】:2012-10-23 09:13:07
【问题描述】:

我有一个使用 Interface Builder 构建的自定义 UIView (MyCustomUIView)。我想将此自定义视图放在MyViewController 的视图中,该视图也是使用IB 设计的。我在MyViewController 的XIB 中放置了一个UIView 作为子视图,并将它的类设置为MyCustomUIView。问题是,当我运行代码时,只出现一个空白视图。 (当我在代码中实例化MyCustomUIView 时,它显示得很好。)

我只是在MyCustomUIView.m 中通过以下方式覆盖initWithFrame: 方法:

- (id)initWithFrame:(CGRect)frame
{
    [[NSBundle mainBundle] loadNibNamed:@"MyCustomUIView" owner:self options:nil];
    self = self.view;
    return self;
}

我应该怎么做才能使视图正确加载? initWithCoder: 应该是什么样子?

【问题讨论】:

    标签: ios uiview xib nib initwithcoder


    【解决方案1】:

    你是对的。 IB 使用 initWithCoder。 initWithCoder 看起来应该与您的其他 init 方法非常相似:

    - (id)initWithCoder:(NSCoder *)aDecoder {
        self = [super initWithCoder:aDecoder];
        if (self) {
            // CUSTOM INITIALIZATION HERE
        }
        return self;
    }
    

    一旦你在 IB 中分配了你的类,你就不需要从包中实例化它,除非我误解了你的意图。

    【讨论】:

    • 我已经尝试过这个实现,但仍然只是出现了一个空白的白色矩形。我必须在视图控制器中做其他事情吗?我刚刚放置了 UIView 并设置了它的 Class 属性。 Xcode 如何知道要查找哪个 xib?如果我在 initWithCoder 中插入 loadNibNamed,我会得到一个无限循环。
    • 您只需要在 IB 中的 uiview 对象上设置类,它应该会选择它。您需要做的第一件事是确定您的视图是否实际出现。在您的视图控制器中创建一个弱引用,启动应用程序并输出视图描述。如果它仍然是一个普通的旧 UIView,那么仔细检查你的 nib(或故事板),验证类名是否在检查器中,然后保存文件以备不时之需。
    • 如果你没有使用 initWithCoder,那么从你的视图类中删除它。您不需要调用 loadNibNamed。 IB 会为您解决这些问题。
    • 如果我上传一个基本的演示项目,你能快速浏览一下吗?看完你们的cmets,我还是不知道自己做错了什么!
    • k ...我已经为您解决了这个问题。你走在正确的道路上。我没有意识到您正在访问其他笔尖。实际答案可以在这里找到:stackoverflow.com/questions/3944964/… ...随时查看更新的示例项目:aworldonfire.com/TestProjectUpdated.zip 祝你好运!
    【解决方案2】:

    不要在 IB 中视图控制器的视图部分放置任何东西。相反,将 IB 中视图控制器的 nib 名称设置为包含视图的 nib 的名称。在包含视图的 nib 中,将文件的所有者设置为视图控制器类,并将其 view 属性连接到视图。

    结果将是,当视图控制器被实例化时,如果它是从 nib 实例化的(你还没有证明这是真的会发生什么,但我们只是说它是),它会找到 nib 并加载它的景色。

    基本上,规则是视图控制器的来源没有区别,它会以相同的顺序执行相同的步骤来查找其视图,正如我在书中所解释的那样:

    http://www.apeth.com/iOSBook/ch19.html#_view_controller_and_view_creation

    在这个网络广播中:

    http://www.youtube.com/watch?v=zIufcKpDIRo

    【讨论】:

      猜你喜欢
      • 2013-10-08
      • 2015-02-03
      • 2017-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多