Обновление флажков в NSTableView с помощью флажка «Выбрать все»

#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, но почему-то он не был подключен. Еще раз спасибо! Я бы никогда не подумал об этом.