3

IBOutlet へのアクセスに問題があります。

テーブルビュー、ツールバー、UILabel (ビューにカプセル化) がある NIB があります。コントローラー (ファイルの所有者) は次のように定義されます。

@interface ChoixPeriodeController : UIViewController <UITableViewDelegate> { 
 IBOutlet UILabel* __periodeInitialeLabel;
}

@property(nonatomic, retain) UILabel* periodeInitialeLabel;

- (void) setSelectedPeriode:(Tache_TypePeriode)typePeriode;

@synthetize periodeInitialeLabel = __periodeInitialeLabel;

.m ファイルでは、この関数は親ウィンドウによって呼び出され、 Label を初期化します。

- (void) setSelectedPeriode:(Tache_TypePeriode)typePeriode {
 NSMutableString* tmpString = [NSMutableString string];

 [tmpString appendFormat:some text format....];

 self.periodeInitialeLabel.text = tmpString;
}

この関数では、self.periodeInitialeLabel が nil になっていることがわかります。理由がわかりません。すべてが IB に接続されています... 何が問題なのか分かりますか?

4

4 に答える 4

5

ここで問題になるのは、操作の順序です。テキスト ラベルがまだ nil の場合は、まだ設定されていない可能性があります。代わりに、UIViewController メソッド内でこのメソッドを呼び出してviewDidLoad、Interface Builder では実行できなかった「追加の構成」を実行する必要があるこのような操作を処理できます。

もありawakeFromNibます。これらは非常に似ていますが、NIB ファイルがパッケージ化されていないときに awakeFromNib がONCEと呼ばれる点が異なります。viewDidLoadは何度も呼び出すことができます。たとえば、メモリが不足している場合 (iOS4 でよく発生します)、ビューはviewDidUnload.

于 2011-01-16T01:32:31.670 に答える
0

次のように、プロパティも IBOutlet で定義する必要があると思います。

@property(nonatomic, retain) IBOutlet UILabel* periodeInitialeLabel; 

@synthesize実装ファイルのプロパティに必要でありperiodeInitialeLabel、IB で正しく接続されていることを確認します (つまり、`__periodeInitialeLabel' ではありません)。

アップデート:

合成ステートメントが次のようになっている場合:

@synthesize periodeInitialeLabel;

それはおそらくあなたの問題です。私はそれがこれでなければならないと思います:

@synthesize periodeInitialeLabel = __periodeInitialeLabel;

あなたのフィールドに接続します。

于 2011-01-15T12:52:01.710 に答える
0

このインターフェースを考えると:

@interface ChoixPeriodeController : UIViewController <UITableViewDelegate> {    
    UILabel* __periodeInitialeLabel;
}

// I think it's more appropriate to mark a property with IBOutlet,
// rather than an ivar
@property(nonatomic, retain) IBOutlet UILabel* periodeInitialeLabel;

- (void) setSelectedPeriode:(Tache_TypePeriode)typePeriode;

// ...

@end

その実装は次のようになります。

@implementation ChoixPeriodeController

@synthesize
periodeInitialeLabel = __periodeInitialeLabel;

// the rest of your implementation goes here
// ...

@end

Google Objective-C Style Guideもご覧になることをお勧めします。先頭に 2 つのアンダースコアを付けて ivar に名前を付けるのは、最良の選択ではない場合があります。

于 2011-01-15T13:14:27.683 に答える