1

私は現在、BigNerdRanchの人たちによるMacOSXCocoaの本の第3版を読んでおり、テーブルビューを含めるようにプログラムを編集しています。ここに、TableViewから必要なプロトコルメソッドを実装する必要があるAppController.mファイルのコードを示します。

-(id)init{
    self = [super init];

    voiceArray = [NSSpeechSynthesizer availableVoices];
    speechSynth = [[NSSpeechSynthesizer alloc] initWithVoice:nil];
    [speechSynth setDelegate:self];
    return self;
}

-(int)numberOfRowsInTableView:(NSTableView *)tv{
    NSLog(@"Getting number of rows in table view: %lu", [voiceArray count]);
    return [voiceArray count];
}

-(id)tableView:(NSTableView *)tv objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row{

    NSString *v = [voiceArray objectAtIndex:row];
    NSDictionary *dict = [NSSpeechSynthesizer attributesForVoice:v];
    NSLog(@"Voice Name %@", [dict objectForKey:NSVoiceName]);
    return [dict objectForKey:NSVoiceName];
}

-(void)tableViewSelectionDidChange:(NSNotification *)notification{
    int row = [tableView selectedRow];
    NSLog(@"row selected %d", row);
    if(row == 1){
        return;
    }
    NSString *selectedVoice = [voiceArray objectAtIndex:row];
    [speechSynth setVoice:selectedVoice];
    NSLog(@"new voice %@ ", selectedVoice);
}

アプリが最初に読み込まれると、次の出力が得られます。

2012-05-27 15:02:29.040 Speakline [42836:f03]テーブルビューの行数の取得:24
2012-05-27 15:02:29.042 Speakline [42836:f03]選択された行2
2012-05-27 15 :02:29.043 Speakline [42836:f03]新しい音声com.apple.speech.synthesis.voice.Alex 2012-05-27 15:02:29.162 Speakline [42836:f03]音声名Agnes
2012-05-27 15:02 :29.163 Speakline [42836:f03]音声名アルバート

ここで何が起こっているのかを完全に理解したいと思います。これを行うために、いくつか質問があります。

  1. numberOfRowsInTableView:メソッドの後にメソッドが自動的に呼び出されたようinitです。これは正しいです?

  2. どのくらいの頻度でobjectValueForTableColumn:呼び出されますか?そのメソッドが呼び出されるように促すイベントは何ですか?また、そこのコードでは、returnステートメントは私を混乱させました。この戻り値は正確にどこに行きますか?

  3. 補足として、彼らは私にアウトレットとAppControllerをcontrol +クリック(接続パネルを介して)で接続し、そのようにリンクすることを望んでいました。これを行わずに、デリゲートとデータソースをさまざまな種類のビューに接続するために利用できる代替手段はありますか?コントローラのヘッダーファイルを追加NSTableViewDelegateするのは一方向かもしれないと思います。コントロール+クリックですべてのビューをアウトレットなどに接続するオプションと、プログラムですべてを設定するオプションがある場合は、この時点での好みの問題ですか?何が起こっているのかを理解するためには、自分でコードを書くほうがよいように思えます。

4

1 に答える 1

2

1)numberOfRowsInTableViewとobjectValueForTableColumn:Rowの両方:nibがアーカイブ解除された直後に呼び出されるため(正確な順序はわかりません)、テーブルビューにデータを入力できます。

2)テーブルのロード、新しいデータのリロードまたは追加、およびスクロールにより、objectValueForTableColumn:row:が(テーブルビューによって)呼び出されます。設定されている行ごとに呼び出されます。値はテーブルビューに送られ、それがデータを取得する方法です。

3)デリゲートを接続するもう​​1つの方法は、setDelegate:を使用してコードで接続することですが、NSTableViewDelegateを.hファイルに配置しても、それは行われません。これは、デリゲートメッセージの一部またはすべてを実装することをコンパイラに約束するだけです。 。

于 2012-05-27T23:13:45.763 に答える