1

通常,我通过覆盖 drawRect 来创建自定义 UIView。是否可以创建一个自定义 UIView 与它相关联的笔尖?(不询问从笔尖创建自定义 UIView )。或者这通常是通过包含在第一个视图控制器中的第二个视图控制器来完成的?

我仍然希望能够调用 initWithFrame 来实例化它。

谢谢

编辑#1 我想有与按钮相关联的自定义操作等......这个功能是否只能在 VC 中使用,或者自定义视图可以工作吗?

4

2 回答 2

1

是的,您可以这样做,但要注意 nib 文件存储在磁盘上而不是 RAM 中,因此它比不使用 nib 慢约 10,000 倍。如果您正在创建大量视图,请不要这样做。

基本上,您的 init 方法加载 nib 文件,获取 nib 中的视图(应该定义为同一个类),而不是像大多数 init 方法一样返回 self ,而是返回 nib 中的视图。

如果您查找语言文档,您会发现 init 方法返回与“self”不同的对象是很常见的。

如果您不使用 ARC,则必须释放 self 并保留返回的视图。

这是我将如何实现它(nib 文件必须与类名匹配):

- (instancetype)initWithFrame:(CGRect)frame
{
  if (!(self = [super initWithFrame:frame]))
    return nil;

  NSArray *loadedObjects = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:nil options:@{}];
  id newView = nil;
  for (id loadedObject in loadedObjects) {
    if ([loadedObject isMemberOfClass:[self class]]) {
      newView = loadedObject;
      break;
    }
  }

  // if ARC is disabled, you must do this:
  // [self release];
  // [newView retain];

  self = newView;

  self.frame = frame;

  return self
}
于 2013-07-06T23:50:05.207 回答
1

很难达到你所追求的目标。使用 nib 是加载视图的一种方式,另一种是以编程方式创建视图。

所以,试图回答你的问题:

  1. 是的,可以通过IB 中的Identity Inspector将 nib 与自定义视图相关联。但是,这也是“从 nib 创建自定义 UIView”。这不是你要找的吗?
  2. 您不必使用视图控制器容器来从 nib 加载视图。
  3. 能够调用initWithFrame:根本不是使用 nib 的一部分,因为 nib 需要使用 anNSCoder并且是从磁盘膨胀的。-initWithCoder:应改为使用。
  4. 是的,您绝对可以在 nib 中使用自定义视图来响应来自其子视图(UIButtons等)的事件。您可以IBActions正常连接到自定义视图子类。这不完全是视图控制器的一部分,尽管根据 MVC,这可能违反了“规则”。

从笔尖加载自定义视图非常困难。

为您的自定义视图创建一个强大的属性(在您的视图控制器中是一个好地方)

@property (strong, nonatomic) BBCustomView *customView;

然后实例化它:

self.customView = [[[NSBundle mainBundle] loadNibNamed:@"View" owner:nil options:nil] lastObject];

此时initWithCoder将在自定义视图上调用。然后,您可以像往常一样将该自定义视图添加到现有视图层次结构中。

不要忘记在 nib 文件中为自定义视图设置正确的类。

希望这能把事情弄清楚一点!

于 2013-07-07T02:17:50.960 回答