Получение флажков для отражения их состояния в NSTableColumn - PullRequest
1 голос
/ 01 февраля 2011

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

    - (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;
}

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

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

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

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

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

1 Ответ

4 голосов
/ 01 февраля 2011

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

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

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

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

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

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

...