1

xib ファイルからロードされるカスタム UIView (MyView) オブジェクトがあります。MyView.m には、初期化を行う initWithCoder で呼び出されるメソッドがあります。これはほとんどの場合機能しますが、ここでいくつかの IBOutlet ラベル プロパティにテキストを設定しようとしましたが、機能していませんでした。プロパティがこの時点で初期化されていないためです。

drawRect メソッドでアウトレットのテキストを設定してみましたが、うまくいきました。しかし、必要のない場合に drawRect を実装すると、パフォーマンスが低下する可能性があることを読んだと思います。私の質問は、IBOutlet ラベル プロパティのテキストを設定するのに最適な場所はどこでしょうか? (私が実際に行っているのは、xib にあるもののローカライズされたバージョンに設定することです。ローカライズされた xib ファイルについては知っていますが、コードでテキストを設定したいと考えています。)


ここにいくつかのコードがあります。ビューコントローラーでビューを初期化する方法は次のとおりです。

NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"MyView"
                                                     owner:self
                                                   options:nil];
_myView = [nibContents objectAtIndex:0];

MyView.m の initWithCoder メソッドは次のとおりです。

- (id)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];
    if (self) {
        [self localizeLabels];
    }
    return self;
}

localizeLabels メソッドは次のとおりです。

- (void)localizeLabels
{
    self.powerPlant.text = NSLocalizedString(@"POWERPLANTBREAKDOWN_HEADERCOLUMN1", nil);
    self.output.text = NSLocalizedString(@"POWERPLANTBREAKDOWN_HEADERCOLUMN2", nil);
    self.capacity.text = NSLocalizedString(@"POWERPLANTBREAKDOWN_HEADERCOLUMN3", nil);
}

これらのメソッドがブレークポイントを使用して呼び出されること、およびプロパティが localizeLabels メソッドで nil であることを確認しました。

4

2 に答える 2

2

UPDATED :MyView.mクラスは、最初はこのようになっている必要があります。

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"MyView"
                                                         owner:self
                                                       options:nil];
        UIView *_myView = [nibContents objectAtIndex:0];
        [self addSubview: _myView];
        [self localizeLabels];
    }
    return self;
}

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

そしてあなたのviewcontrollerinitializeあなたはこのようにする必要がありますMyView

MyView _view = [[MyView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
[self.view addSubview:_view];
于 2013-01-02T16:55:02.183 に答える
0

IBOutletプロパティ、InterfaceBuilderのxibに適切に接続されている場合に初期化されます。初期化は、xibがアプリに読み込まれるときに行われます。これらのプロパティは、結局のところ、xibインスタンス化されたオブジェクトへの弱参照にすぎません。

したがって、私の推測では、IBOutletsをそれぞれのxibオブジェクトに接続していないと思います。InterfaceBuilderで確認してください。

于 2013-01-02T16:32:09.960 に答える