В настоящее время я просматриваю 3-е издание книги Mac OSX Cocoa от ребята Big Nerd Ranch, и я редактирую свою программу, чтобы включить представление таблицы. Вот код из файла AppController.m, где я должен реализовать необходимые методы протокола от TableView:Когда объект objectValueForTableColumn: вызывается?
-(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] Голос Имя Агнес
2012-05-27 15: 02: 29,163 Speakline [42836: f03] Голос Имя Альберт
Я хочу, чтобы убедиться, что я полностью понимаю, что здесь происходит , Для этого у меня есть пара вопросов.
Похоже, метод
numberOfRowsInTableView:
автоматически вызывается после методаinit
. Это верно?Как часто вызывается
objectValueForTableColumn:
? Какие события подсказывают этот метод для вызова? Кроме того, в коде там операторreturn
смутил меня. Где именно это возвращается?В качестве примечания стороны хотели, чтобы я подключил выходные и AppController через управление + щелчок (через панель соединений) и связывание их таким образом. Какие альтернативы существуют для подключения делегатов и источников данных к разным видам представлений без этого? Я предполагаю, что добавление
NSTableViewDelegate
в заголовочный файл контроллера может быть одним из способов. Если у вас есть возможность управления + щелчок, соединяющий все ваши взгляды с выходами и т. Д. Vs программно настраивая все это, это просто вопрос предпочтения на данный момент? Мне просто кажется, что для того, чтобы понять, что происходит, лучше всего написать код самостоятельно.
«Похоже ...' numberOfRowsInTableView: '... был автоматически вызван после ...' init' .... Это правильно? »Это единственный раз, когда его можно назвать. Единственный способ, которым это можно было бы назвать * во время * вашего метода 'init', - это если ваш' init' загрузил нить или иначе создал представление таблицы, установил его источник данных и поместил его в иерархию представлений. Тогда представление таблицы * может * задавать вещи своего источника данных в какой-то момент в этом процессе, прежде чем 'init' вернется.Как написано, nib загружается в другое место, поэтому ваш 'init' должен быть уже возвращен до всего между табличным представлением и вами, может произойти его источник данных. –