私は現在、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]音声名アルバート
ここで何が起こっているのかを完全に理解したいと思います。これを行うために、いくつか質問があります。
numberOfRowsInTableView:
メソッドの後にメソッドが自動的に呼び出されたようinit
です。これは正しいです?どのくらいの頻度で
objectValueForTableColumn:
呼び出されますか?そのメソッドが呼び出されるように促すイベントは何ですか?また、そこのコードでは、return
ステートメントは私を混乱させました。この戻り値は正確にどこに行きますか?補足として、彼らは私にアウトレットとAppControllerをcontrol +クリック(接続パネルを介して)で接続し、そのようにリンクすることを望んでいました。これを行わずに、デリゲートとデータソースをさまざまな種類のビューに接続するために利用できる代替手段はありますか?コントローラのヘッダーファイルを追加
NSTableViewDelegate
するのは一方向かもしれないと思います。コントロール+クリックですべてのビューをアウトレットなどに接続するオプションと、プログラムですべてを設定するオプションがある場合は、この時点での好みの問題ですか?何が起こっているのかを理解するためには、自分でコードを書くほうがよいように思えます。