2011-02-01 2 views
1

Я делаю эту программу с NSTableView с четырьмя столбцами, две из которых сделаны из флажков. Я только пытаюсь заставить работать сейчас, и я застрял.
Во-первых, здесь мой соответствующий код:Получение флажков для отражения их состояния в NSTableColumn

- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView { 

    NSString *filePathThree = [[NSBundle mainBundle] pathForResource:@"mydictionary" ofType:@"plist"]; 
    NSData *myDataThree = [[NSData alloc]initWithContentsOfFile:filePathThree]; 
    self.flozzCodeAndName = (NSMutableDictionary *)[NSPropertyListSerialization 
                propertyListFromData:myDataThree 
                mutabilityOption:NSPropertyListMutableContainersAndLeaves 
                format:NULL 
                errorDescription:NULL]; 

    return [[flozzCodeAndName objectForKey:@"name"] count]; 
} 

- (void)tableView:(NSTableView *)tableView 
    setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)rowIndex 
{ 

    NSButtonCell *cell; 
    cell = [[NSButtonCell alloc] init]; 
    [cell setButtonType:NSSwitchButton]; 
    [cell setTitle:@""]; 
    [cell setTag:rowIndex]; 
    NSLog(@"%d", [cell tag]); 
    [cell setCellAttribute:NSCellEditable to:3]; 
    [cell setImagePosition:NSImageOnly]; 
    [cell setState:NSOnState]; 

    NSLog(@"%d", [cell state]); 
    [havzColumn setDataCell:cell]; 
    [myTableVeew reloadData]; 
    [cell release]; 

} 




- (id)tableView:(NSTableView *)aTableView 
objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex { 

    NSString *filePathThree = [[NSBundle mainBundle] pathForResource:@"mydictionary" ofType:@"plist"]; 
    NSData *myDataThree = [[NSData alloc]initWithContentsOfFile:filePathThree]; 
    self.flozzCodeAndName = (NSMutableDictionary *)[NSPropertyListSerialization 
                propertyListFromData:myDataThree 
                mutabilityOption:NSPropertyListMutableContainersAndLeaves 
                format:NULL 
                errorDescription:NULL]; 

    NSArray *myArray = [flozzCodeAndName objectForKey:[aTableColumn identifier]]; 

    NSString *myStringValue = [myArray objectAtIndex:rowIndex]; 

    return myStringValue; 
} 

Как вы можете видеть, я использую метод источника данных для этой таблицы, а не привязок. Книга, которую я прочитал для Cocoa, сделала некоторые флажки с тегами, но я думаю, что они были в массиве, так что это может быть не самое лучшее.

В любом случае, когда я запустил это, отладчик покажет мне тег (который равен строке) вместе с состоянием кнопки (1 для всех из-за NSOnState). Моя проблема заключается в том, что я не могу получить поля для проверки и снятия галочки в зависимости от их состояния. Я прочитал этот вопрос: Checkbox on table column won't register click

И затем ссылка на источник данных NSTableView. По словам г-на Ноцци в связанном вопросе, мне кажется, что нужен массив, содержащий состояния для ящиков, поэтому я попробовал это, установив [cell state] в NSNumber, чтобы получить его в NSMutableArray. Я FUBAR'd это и не думаю, что это было правильно. В этой таблице 454 строки (теги идут до 453 из-за массивов, начинающихся с 0), для всех четырех столбцов.

Я также задаюсь вопросом, должен ли я помещать элементы определения ячейки, которые находятся в tableview: setObjectValue: в 'awakeFromNib'. Я поместил ячейку ячейки флажка в IB, но раньше у меня были проблемы с этим, поэтому я решил сделать это программно. Во всех этих случаях я сделал и все еще имею [myTableVeew reloadData] в методе setObjectValue.

Помощь приветствуется, если какая-либо другая информация необходима, я могу ее получить.

ответ

4

У вас есть две проблемы: Ваш источник данных продолжает получать сдувается, и вы не используете ... objectValue ... метод правильно.

Источник данных: Вы сносит источник данных в вашем -numberOfRowsInTableView: метод и заменяя его каждый раз, когда таблица должна сделать обновление. Вам нужно кэшировать (измененную копию) ваш словарь только тогда, когда вам нужно (например, при запуске приложения), а только ссылаться на него из методов источника данных таблицы. Возможно, вы должны перенести его в переменную экземпляра и использовать соответствующие аксессоры.

Кроме того, в документации упоминается, что, поскольку методы источника данных вызываются очень часто, они должны быть быстрыми, поэтому только с точки зрения производительности это не очень хорошая идея. Вы должны делать только то, что нужно, чтобы ответить на вопрос, который создает метод делегата, чтобы поддерживать таблицу с большими наборами данных.

Объекта Значение:. Вы должны ТОЛЬКО возвращение значения объекта из этого метода (как правило, объект NSNumber, содержащий состояние флажка предназначаются для переключения

Вы должны установить -dataCell вашей колонки таблицы, когда вид загружается или при запуске приложения. Еще проще: перетащите ячейку флажка в столбец таблицы в Interface Builder, чтобы установить это как ячейку данных без кода.

Дополнительные наблюдения: Если вы планируете сохраняются изменения в этой информации в любом случае, обратите внимание, что вы не должны никогда полагаться на расслоении прикладная программа для записи и никогда не должны пытаться переписать файлы ресурсов, как тот, который вы» повторная загрузка из вашего пакета. Вам нужно будет сохранить информацию в другом месте, используя копию вашего пакета как копию шаблона только.