簡體   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