【问题标题】:Instantiating UIView subclass loaded from xib实例化从 xib 加载的 UIView 子类
【发布时间】:2012-10-29 22:57:19
【问题描述】:

我有一个从 xib 文件加载的 UIView 子类。在我的 CustomView.h 文件中,我只是忽略了 initWithFrame: 方法中的 CGRect 参数:

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

现在我的问题是:每当我实例化我的自定义视图时,我应该传递的框架是什么?

例如,我试过这个:

CustomView *cv = [[CustomView alloc] initWithFrame:CGRectZero];

人们会假设因为框架是在 xib 中设置的,所以在这里传递什么并不重要。但是,这会导致我的自定义视图对用户交互没有响应。

【问题讨论】:

  • 这不是 loadNibNamed 的工作方式。我很惊讶这不会导致崩溃。返回类型是根级别对象的 NSArray。如果你真的想让一个对象使用它们,你必须设置一个所有者。附言不要这样,太奇怪了。
  • 有什么更好的方法?你能详细说明吗?否则您将如何在 xib 中创建自定义视图并在视图控制器中使用它?
  • 您无需担心。这就是 XIB 文件的重点。你通常实例化一个view controller而不是一个view。您可以使用 initWithNibName:bundle 创建视图控制器:您可以在 XIB 中更改视图的类。如果你不知道怎么做,那里有很多信息供你学习。之后,如果您想要一些自定义初始化,您可以覆盖 initWithCoder: 就像下面的答案一样。

标签: objective-c ios


【解决方案1】:

你应该改用 initWithCoder

- (id)initWithCoder:(NSCoder*)coder {
    self = [super initWithCoder:coder];
    if (self){
        // Initialization code

    }
    return self;
}

【讨论】:

  • 你能给我一个 initWithCoder wrt UIViews 的例子吗?
  • 您能更详细地解释一下您要做什么吗?在 Cocoa 中有多种加载视图的方法,最佳方法取决于您的应用程序的结构以及您需要完成的操作。
猜你喜欢
  • 1970-01-01
  • 2018-02-15
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多