繁体   English   中英

如何初始化从xib加载的UIView子类?

[英]How to initialize a UIView subclass loaded from a xib?

关于如何对UIView进行子类化,有无数的答案,但是似乎没有一个对我有帮助。

我有一个UIView子类

#import <UIKit/UIKit.h>

@interface DarkSeparatorUIView : UIView

@end

并执行:

#import "DarkSeparatorUIView.h"

@implementation DarkSeparatorUIView

- (id)initWithFrame:(CGRect)frame {
  if ((self = [super initWithFrame:frame])) {
    // Do something
  }
  return self;
}

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

@end

在单独的xib中,我正在创建UIView并将其类标记为“ DarkSeparatorUIView”。 我希望在视图加载时会调用initWithCoder,但事实并非如此。 我想念什么吗?

编辑:我尝试了awakeFromNib,它也无法正常工作。

Edit2:这适用于新项目,但不适用于我当前的项目。 我不知道有什么不同?

- (id)initWithFrame:(CGRect)frame
{
  self = [super initWithFrame:frame];
   if (self) {
    // Initialization code
  self = [[[NSBundle mainBundle] loadNibNamed:@"DarkSeparatorUIView" owner:self options:nil] objectAtIndex:0];
}
  return self;
}

确保您的xib名为DarkSeparatorUIView.xib

我的问题是,当我创建DarkSeparatorUIView时,并未将其包含在所有构建目标中。 如果在创建文件时未执行此操作,则可以在“项目浏览器”中单击该文件,然后选择“文件浏览器”,然后选择希望该文件可用于的目标。

Apple已在UINibloading.h中声明的NSBundle上创建了一个类别。 它将方法loadNibNamed:owner:optionsNSBundle ,这使得从捆绑中加载笔尖非常容易。

为此,我在UIView上创建了一个类别。 它定义了一个方法:

+(instancetype)viewFromNib

在自定义UIView子类的标题中包含此类别,以启用使用此衬板从笔尖加载它的方法:

MyView *view = [MyView viewFromNib];

我将类别归为要点 ,但加载笔尖的代码如下所示:

NSString *className = NSStringFromClass([self class]);
NSArray *bundle = [[NSBundle mainBundle] loadNibNamed:className owner:self options:nil];

id view = nil;
for (id object in bundle) {
    if ([object isKindOfClass:[self class]]) {
        view = object;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM