#cocoa #nstableview
#cocoa #nstableview
Вопрос:
Я искал, читал, пробовал разные подходы и т.д. последние пару недель пытаюсь решить эту проблему, но безуспешно… Любая помощь приветствуется.
У меня есть NSTableView, который использует мой класс контроллера в качестве источника данных, точнее, NSMutableArray (validPropertyList) из NSDictionaries. У меня есть словари, содержащие один NSNumber numberWithBool с ключом @»checkboxValue» и одну NSString с ключом @»address». Изначально я установил для всех значений флажка значение YES.
for (int i =0; i<properties.count; i ) {
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithObjectsAndKeys:[properties objectAtIndex:i],@"address",[NSNumber numberWithBool:YES],@"checkboxValue", nil];
[validPropertyList addObject:dict];
}
В моей таблице есть 2 столбца, идентификаторы которых соответствуют ключевым именам моих словарей.
В IB я перетащил ячейку флажка в столбец «Значения флажка». Необходимые методы приведены ниже для таблицы.
-(NSInteger)numberOfRowsInTableView:(NSTableView *)tableView{
return [validPropertyList count];
}
-(id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row{
NSString *identifier = [tableColumn identifier];
return [[validPropertyList objectAtIndex:row]valueForKey:identifier];
}
Все это работает нормально. Таблица загружает (выбранный) флажок в первый столбец и мой объект string в другой для каждого словаря в моем массиве.
Я реализовал приведенный ниже метод для обработки изменений состояния флажков в таблице…
-(void)tableView:(NSTableView *)tableView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row{
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:[validPropertyList objectAtIndex:row]];
[dict setValue:object forKey:@"checkboxValue"];
[validPropertyList replaceObjectAtIndex:row withObject:dict];
// NSLog(@»значение теперь равно %@», [[validPropertyList objectAtIndex:строка]valueForKey:@»Значение флажка»]);
}
Похоже, это тоже работает. Нажатие на флажок визуально изменяет его состояние. Он также обновляет значение [NSNumber numberWithBool] в моем массиве, как и должно быть.
У меня есть флажок вне таблицы, который я пытаюсь использовать, чтобы либо выбрать все, либо снять все флажки в таблице. У меня в моем классе есть переменная bool (selectAllValue), которая привязана к состоянию этого флажка, и этот флажок вызывает действие, описанное ниже…
- (IBAction)selectAll:(id)sender {
if (selectAllValue == YES) {
for (int i=0; i<[validPropertyList count]; i ) {
NSMutableDictionary *dict = [validPropertyList objectAtIndex:i];
[dict setValue:[NSNumber numberWithBool:YES] forKey:@"checkboxValue"];
[validPropertyList replaceObjectAtIndex:i withObject:dict];
}
}
else{
for (int i=0; i<[validPropertyList count]; i ) {
NSMutableDictionary *dict = [validPropertyList objectAtIndex:i];
[dict setValue:[NSNumber numberWithBool:NO] forKey:@"checkboxValue"];
[validPropertyList replaceObjectAtIndex:i withObject:dict];
NSLog(@"new value in array when should be no is: %@",[validPropertyList objectAtIndex:i]);
}
}
[tv reloadData];
}
Это действительно устанавливает все значения в моем массиве в правильные значения, а затем я вызываю [tv reloadData] для обновления таблицы. Однако это визуально не изменяет значения флажков. Это моя проблема.
Я пробовал добавлять флажки в свой словарь вместо NSNumbers, но без разницы. Я пытался привязать флажки в таблице к bool selectAllValue, но без разницы.
Я читал другие сообщения на SO, которые касаются флажков в таблицах, но ни один из них на самом деле не касается этого. Опять же, любая помощь приветствуется.
Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.
Спасибо, Скотт
Комментарии:
1. возвращает 1; из -(id)TableView: (NSTableView *)TableView objectValueForTableColumn:(NSTableColumn *)Строка столбца таблицы: (NSInteger) метод строки. это работает?
2. Спасибо за ответ. Я не могу вернуть значение int для этого, потому что оно ищет объект.
3. если ([[[TableColumn headerCell] stringValue] сравнить:@»check_box»] == NSOrderedSame) возвращает 1;
4. Это выглядит нормально, за исключением того, что вам не нужно каждый раз заменять объект в массиве, вы редактируете изменяемый словарь, чтобы объект в массиве был готов.
tv
Определенно имеет значение при вызове reloadData? Если это значение равно нулю, это может вызвать вашу проблему. В противном случае, обновляются ли значения в флажках при прокрутке табличного представления?5. Привет, jrturton- tv был равен нулю. Большое вам за это спасибо! Я настроил соединение, перетащив элемент управления в файл заголовка в Xcode, но почему-то он не был подключен. Еще раз спасибо! Я бы никогда не подумал об этом.