2

サブクラス化しようとしていUILabelます。最初の試行では、カスタムUILabelでプロパティadjustsFontSizeToFitWidthを に設定するだけYESです。問題は、私が iOS プログラミングに不慣れで、このコードをどこに置くべきかわからないことです。以下のコードを試しましたが、呼び出されません。

- (id)initWithFrame:(CGRect)frame
{
NSLog(@"init custom label");
self = [super initWithFrame:frame];
if (self) {
    // Initialization code
    self.adjustsFontSizeToFitWidth=YES;
}
return self;
}

- (id)init
{
NSLog(@"init custom label");
self = [super init];
if (self) {
    // Initialization code here.
    self.adjustsFontSizeToFitWidth=YES;
}

return self;
}

私はそれを使用して動作させました:

lblCustom = [lblCustom init];

しかし、この呼び出しを自動的に呼び出す方法はありますか?

4

3 に答える 3

3

私は個人的に離れてinitWithCoder:、代わりに使用awakeFromNibします。理由は次のとおりです ( Apple UIKit ドキュメント):

nib 読み込みインフラストラクチャは、アーカイブ内のすべてのオブジェクトが読み込まれて初期化された後にのみ、nib アーカイブから再作成された各オブジェクトに awakeFromNib メッセージを送信します。オブジェクトが awakeFromNib メッセージを受信すると、すべてのアウトレットとアクション接続がすでに確立されていることが保証されます。

プログラムにはさまざまな UI サブクラスがあり、クラスで思いついたソリューションを次に示しますBaseLabel

- (id)initWithFrame:(CGRect)frame 
{
    self = [super initWithFrame:frame];

    if(self)
    {
        // We were not loaded from a NIB
        [self labelDidLoad:NO];
    }

    return self; 
}

- (void)awakeFromNib 
{
    [super awakeFromNib];

    // We were loaded from a NIB
    [self labelDidLoad:YES]; 
}

- (void)labelDidLoad:(BOOL)loadedFromNib
{
    // Do some initialization here...
}

これで、すべてのサブクラスが単純にオーバーライドされます{type}didLoad:(BOOL)loadedFromNib

たとえばbuttonDidLoad:textFieldDidLoad:、およびtableViewDidLoad:(おわかりでしょう)。

于 2013-11-22T14:16:12.377 に答える
1

UIView で init のみを呼び出すことは、initWithFrame: を zero-rect で呼び出すことと同じです。したがって、nib ファイルを使用している場合は、initWithFrame または initWithCoder をオーバーライドする必要があります。

于 2013-11-11T09:26:18.670 に答える