#ios #reloaddata #uitableview
#iOS #reloaddata #uitableview
Вопрос:
Мы с другом работаем над приложением списка покупок и у нас возникли некоторые проблемы с [TableView reloadData];. Мы храним наши списки покупок в plists и имеем подпросмотр добавления товаров. Когда вы покидаете это вложенное представление, чтобы вернуться к списку, список не содержит новых элементов, даже несмотря на то, что мы обновляем список и вызываем reloadData в viewWillAppear. Однако это работает; если мы вернемся к основному списку всех списков, а затем обратно в конкретный список, в который мы только что добавили элементы, элементы затем появятся. Аналогично, мы хотим удалить элементы из списка, просто выбрав строку и поставив галочку рядом с элементом. Список не обновляется автоматически при выборе строки, хотя мы также вызываем reloadData в didSelectRowAtIndexPath. Опять же, изменение проявляется, если мы возвращаемся к основному списку, а затем возвращаемся к отдельному списку. Я проверил, и делегат и источник данных в файлах nib правильно связаны с владельцем файла.
Вот код для просмотра, который появится:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
// THIS IS WHERE YOU PASS THE VARIABLE
iGrocerAppDelegate *passTest = [[UIApplication sharedApplication] delegate];
NSString *listName = [passTest passList];
[passTest setPassList:listName];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask,
YES);
NSString *fullListName = [NSString stringWithFormat:@"%@.plist", listName];
NSString *file = [[paths lastObject] stringByAppendingPathComponent:fullListName];
self.list = [[NSArray alloc] initWithContentsOfFile:file];
[listTableView reloadData];
}
и didSelectRowAtIndexPath:
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView cellForRowAtIndexPath:
indexPath];
cell.accessoryType = UITableViewCellAccessoryCheckmark;
[tableView deselectRowAtIndexPath:indexPath animated:YES];
int row = [indexPath row];
NSString *deleteItem = [self.list objectAtIndex:row];
[self.itemsToDelete addObject:deleteItem];
// RECEIVE PASSED VARIABLE
iGrocerAppDelegate *test = (iGrocerAppDelegate *)[[UIApplication sharedApplication] delegate];
NSString *listName = [test passList];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask,
YES);
NSString *fullListName = [NSString stringWithFormat:@"%@.plist", listName];
NSString *file = [[paths lastObject] stringByAppendingPathComponent:fullListName];
//NSMutableArray *groceryLists = [[NSMutableArray alloc] initWithContentsOfFile:file];
//NSMutableArray *groceryList1 = [[NSMutableArray alloc] initWithContentsOfFile:file];
NSMutableArray *groceryList = [[NSMutableArray alloc] initWithContentsOfFile:file];
NSMutableArray *removeFromList = self.itemsToDelete;
int itemCount = [removeFromList count];
NSLog(@"Count: %d", itemCount);
for(int i=0; i < itemCount; i ) {
NSString *item = [removeFromList objectAtIndex:i];
NSLog(@"%@", item);
[groceryList removeObject:item];
NSLog(@"Middle ARRAY: %@", groceryList);
//[groceryList addObjectsFromArray: addToList];
}
NSLog(@"FINAL ARRAY: %@", groceryList);
if(![groceryList writeToFile:file atomically:YES]) {
NSLog(@"unsuccessful");
} else {
NSLog(@"successful");
}
NSLog(@"file name: %@",file);
self.list = [[NSArray alloc] initWithContentsOfFile:file];
NSLog(@"updated grocery list: %@", self.list);
[listTableView beginUpdates];
//[listTableView reloadData];
[listTableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
[listTableView endUpdates];
printf("list table view reloaded");
}
Любая помощь была бы высоко оценена! Заранее спасибо!
Ответ №1:
Решено.
Это просто должно было быть:
[self.tableView reloadData];