2012-05-27 2 views
1

В настоящее время я просматриваю 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] Голос Имя Альберт

Я хочу, чтобы убедиться, что я полностью понимаю, что здесь происходит , Для этого у меня есть пара вопросов.

  1. Похоже, метод numberOfRowsInTableView: автоматически вызывается после метода init. Это верно?

  2. Как часто вызывается objectValueForTableColumn:? Какие события подсказывают этот метод для вызова? Кроме того, в коде там оператор return смутил меня. Где именно это возвращается?

  3. В качестве примечания стороны хотели, чтобы я подключил выходные и AppController через управление + щелчок (через панель соединений) и связывание их таким образом. Какие альтернативы существуют для подключения делегатов и источников данных к разным видам представлений без этого? Я предполагаю, что добавление NSTableViewDelegate в заголовочный файл контроллера может быть одним из способов. Если у вас есть возможность управления + щелчок, соединяющий все ваши взгляды с выходами и т. Д. Vs программно настраивая все это, это просто вопрос предпочтения на данный момент? Мне просто кажется, что для того, чтобы понять, что происходит, лучше всего написать код самостоятельно.

+0

«Похоже ...' numberOfRowsInTableView: '... был автоматически вызван после ...' init' .... Это правильно? »Это единственный раз, когда его можно назвать. Единственный способ, которым это можно было бы назвать * во время * вашего метода 'init', - это если ваш' init' загрузил нить или иначе создал представление таблицы, установил его источник данных и поместил его в иерархию представлений. Тогда представление таблицы * может * задавать вещи своего источника данных в какой-то момент в этом процессе, прежде чем 'init' вернется.Как написано, nib загружается в другое место, поэтому ваш 'init' должен быть уже возвращен до всего между табличным представлением и вами, может произойти его источник данных. –

ответ

2

1) Оба numberOfRowsInTableView и objectValueForTableColumn: Row: дозвонились вскоре после того, как СИБ разархивирован (я не уверен в точном порядке вещей), так как таблица может быть заполнен данными.

2) Загрузка таблицы и перезагрузка или добавление новых данных, а также прокрутка вызовет objectValueForTableColumn: row: для вызова (по представлению таблицы). Он вызывается для каждой заполняемой строки. Значение относится к представлению таблицы, вот как он получает свои данные.

3) Другой способ подключения делегатов - сделать это в коде с помощью setDelegate :, но установка NSTableViewDelegate в файле .h не делает этого - это просто обещание компилятору, что вы будете реализовывать некоторые или все сообщений делегатов.

+0

Хорошо, я понимаю сейчас..и думаю. Просто чтобы подтвердить, что если numberOfRowsInTableView возвращает 24 в моем случае, то строка objectValueForTableColumn: (NSTableColumn *) tableColumn: (NSInteger) будет вызываться 24 раза, отправляя в столбец таблицы (вы устанавливаете количество столбцов в инспекторе атрибутов) и строка (соответствующая количеству строк) – cspam

+0

@cspam: ее не нужно называть ровно 24 раза, не более и даже не меньше. Он будет вызываться столько раз, сколько на экране есть строки, поэтому в представлении таблицы могут отображаться возвращаемые значения; представление таблицы может вызывать его для дополнительных строк и/или ждать, пока пользователь не прокрутит другие строки в представлении. Он также может или не может забывать ранее возвращенные значения (компромисс между пространством и временем). Не беспокойтесь о том, сколько раз это вызовет табличное представление; ваша первоначальная оптимизация должна заключаться в том, чтобы следовать рекомендациям в документации, что должно сделать этот метод максимально эффективным. –

+0

ОК спасибо за комментарии и помощь в вопросах. *принято* – cspam

Смежные вопросы