1

AppDelegate のインターフェイスには、次のプロパティ宣言があります。

@property (strong) NSArray *fileNamesInCurrentDirectory;

そして、実装では:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    [self setFileNamesInCurrentDirectory:[NSArray arrayWithObject:@"hello"]];

}

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
    return [self.fileNamesInCurrentDirectory count];
}

numberOfRowsInTableView呼ばれるとfileNamesInCurrentDirectoryですnil。なんで?

前もって感謝します。

4

3 に答える 3

2

ドキュメントに記載されているため、

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification    

アプリケーションが起動されて初期化された後、デフォルトの通知センターから送信されます

つまり、アプリケーションが完全に読み込まれ、すべてのビューが構築されてから、メソッドが呼び出されるということです。

アプリケーションのロード後にメソッド呼び出しを行う必要がある理由はありますか?

于 2012-11-12T20:12:59.540 に答える
2

applicationDidFinishLaunching前に呼ばれるとは言いませんnumberOfRowsInTableView

最初に呼び出されるメソッドはinitメソッドで、次にapplicationDidFinishLaunching.

メソッドを使用して、initすべての変数を初期化します。xib ファイルにある変数を除いて、まだ読み込まれていません。xib からロードされたアウトレットは、applicationDidFinishLaunching(またはawakeFromNib) で初期化できます。

于 2012-11-12T20:19:47.403 に答える
2

Ramy Al Zuhouri が言ったように、それはタイミングの問題です。起動時に使用できるメソッドの一部を次に示します。実行順序を確認できます。

@implementation AppDelegate

- (id)init {
    if (self = [super init])
        NSLog(@"In init");
    return self;
}

+(void)initialize {
    NSLog(@"Initialize");
}

-(void)awakeFromNib {
    NSLog(@"awakeFromNib");
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    NSLog(@"applicationDidFinishLaunching");
}

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
    NSLog(@"numberOfRowsInTableView");
    return [self.fileNamesInCurrentDirectory count];
}

ログはこれを示しています:

2012-11-12 14:23:56.880 TableViewTimingProblem[1399:303] Initialize
2012-11-12 14:23:56.881 TableViewTimingProblem[1399:303] In init
2012-11-12 14:23:56.885 TableViewTimingProblem[1399:303] awakeFromNib
2012-11-12 14:23:56.893 TableViewTimingProblem[1399:303] numberOfRowsInTableView
2012-11-12 14:23:56.937 TableViewTimingProblem[1399:303] applicationDidFinishLaunching
于 2012-11-12T22:26:56.273 に答える