У меня есть UITable с источником данных, который настроен на «копию» исходных данных. Я использую эту копию для отображения отфильтрованных результатов («Все» или только те, которые «отмечены» с помощью переключателя UIS в каждой строке). Моя логика для фильтрации здесь:
-(void)filterItems {
[tableData removeAllObjects];
if (checkedOrNotSwitch.selectedSegmentIndex == 0) {
[tableData addObjectsFromArray:self.defaultChecklistItemsArray];
} else {
for (NSMutableDictionary *sectionDict in self.defaultChecklistItemsArray) {
NSMutableArray *newItemsArray = [[NSMutableArray alloc] init];
[newItemsArray removeAllObjects];
for (NSMutableDictionary *itemDict in [sectionDict objectForKey:@"categoryItems"]) {
if ([[itemDict objectForKey:@"isComplete"] boolValue]) {
[newItemsArray addObject:itemDict];
}
}
if ([newItemsArray count] > 0) {
NSMutableDictionary *newSectionDict = [[NSMutableDictionary alloc] initWithDictionary:sectionDict];
[newSectionDict setObject:newItemsArray forKey:@"categoryItems"];
[tableData addObject:newSectionDict];
[newSectionDict release];
}
}
}
[checklistTable reloadData];
}
Сама фильтрация теперь работает правильно. В моей пользовательской ячейке у каждой строки есть переключатель UIS. Коммутатор запускает эту функцию при ее изменении:
-(IBAction) switchValueChanged{
NSIndexPath *indexPath = [(UITableView *)self.superview indexPathForCell: self];
[self.parentController updateCompletedStatusAtIndexPath:indexPath toStatus:isCompleted.on];
}
Вышеприведенная функция находится в классе для самой ячейки таблицы. Функция, которую я вызываю в суперпредставлении, такова:
-(void)updateCompletedStatusAtIndexPath:(NSIndexPath *)indexPath toStatus:(BOOL)status{
NSUInteger section = [indexPath section];
NSUInteger row = [indexPath row];
NSMutableDictionary *currentsection = [[NSMutableDictionary alloc] initWithDictionary:[tableData objectAtIndex:section]];
NSMutableArray *itemsArray = [[NSMutableArray alloc] initWithArray:[currentsection objectForKey:@"categoryItems"] copyItems:YES];
NSMutableDictionary *tempDict = [[NSMutableDictionary alloc] initWithDictionary:[itemsArray objectAtIndex:row]];
NSLog(@"BOOL = %@\n", (status ? @"YES" : @"NO"));
[tempDict setValue:[NSNumber numberWithBool:status] forKey:@"isComplete"];
[itemsArray replaceObjectAtIndex:row withObject:tempDict];
[currentsection setValue:itemsArray forKey:@"categoryItems"];
[tableData replaceObjectAtIndex:section withObject:currentsection];
[tempDict release];
[itemsArray release];
[currentsection release];
[checklistTable reloadData];
}
До того, как я реализовал фильтрацию и использовал приведенную выше логику непосредственно в self.defaultChecklistItemsArray, он работал и сохранял данные при переключении переключателя.
Теперь, когда я впервые захожу в приложение, оно загружает массив данных из nsuserdefaults. Я перехожу к представлению с таблицей, и оно отображает данные там правильно, когда UIS переключает все в правильном положении, учитывая данные (некоторые включены, некоторые выключены). Когда я нажимаю на один из переключателей, затем нажимаю на сегментированный элемент управления, который выполняет фильтрацию, данные возвращаются обратно в состояние, в котором они были загружены, подразумевая, что переключение переключателя фактически не влияло на данные вообще (хотя я не Я думаю, что я сделал глубокую копию где-то здесь, поэтому я решил, что это должно быть правильно). Есть предложения?