Работа с редактируемыми элементами в отфильтрованном UITable с копией NSMutableArray - PullRequest
1 голос
/ 18 октября 2010

У меня есть 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 переключает все в правильном положении, учитывая данные (некоторые включены, некоторые выключены). Когда я нажимаю на один из переключателей, затем нажимаю на сегментированный элемент управления, который выполняет фильтрацию, данные возвращаются обратно в состояние, в котором они были загружены, подразумевая, что переключение переключателя фактически не влияло на данные вообще (хотя я не Я думаю, что я сделал глубокую копию где-то здесь, поэтому я решил, что это должно быть правильно). Есть предложения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...