У меня есть UITableView, где пользователь нажимает на аксессуар. Аксессуар запускает UIView в модальном виде (с использованием presentViewController
).Обновление UITableView работает только при перемещении таблицы?
Когда он возвращается, он предназначен для обновления ячейки tableview с требуемыми данными.
В настоящее время я использую Singleton для захвата userData внутри словаря; но даже если я использую NSNotification, у меня такая же проблема.
Моя проблема заключается в том, что когда модальный диалог отклоняется, табличное представление никогда не обновляется; однако , если я прокручиваю или иным образом физически перемещаю затем таблицу, запись в ячейке обновляется.
Я получаю те же результаты, если попытаюсь перезагрузить ячейку или весь стол с помощью NSNotifications.
Мне интересно, смогу ли я помочь в этом; как я могу перезагрузить ячейку?
Код, относящийся к отображению ячеек и способу представления модальности ниже;
Примечания;
_eventName is just a NSString
-(void) viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
if ([[MySingleton sharedInstance].userData objectForKey:@"eventName"] !=nil) {
_eventName = [[MySingleton sharedInstance].userData objectForKey:@"eventName"];
}
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
NSDictionary *dict;
NSString *name;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
dict = [_template objectAtIndex:indexPath.row];
name = [dict objectForKey:@"name"];
cell.textLabel.text = name;
NSString *key = [[dict objectForKey:@"key"] lowercaseString];
if ([[key lowercaseString] isEqualToString:@"name"]==YES) {
cell.detailTextLabel.text = _eventName;
}
return cell;
}
-(void) tableView:(UITableView *)tv accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
NSDictionary *dict = [_template objectAtIndex:indexPath.row];
NSString *key = [[dict objectForKey:@"key"] lowercaseString];
NSString *name = @"";
if ([key isEqualToString:@"name"]==YES) {
EventNameVC *nameEditor = [[EventNameVC alloc] initWithNibName:@"EventNameVC" bundle:nil];
if (_eventName !=nil) {
nameEditor.txtName.text = _eventName;
} else {
nameEditor.txtName.text = name;
}
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:nameEditor];
// When we return from the view, reload the cell.
[self presentViewController:nav animated:YES completion:^{
[self.tv reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationRight];
}];
nav = nil;
}
}
Edit: Пытались использовать уведомления для обнаружения закрытия модального в; но у меня все еще есть одна и та же проблема, то есть UITableView отображает только обновленные данные, когда я физически перемещаю таблицу.
На мой взгляд, контроллер я это делаю;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
self.notificationObserver = [[NSNotificationCenter defaultCenter]
addObserverForName:@"dismissModalView"
object:nil
queue:mainQueue
usingBlock:^(NSNotification *notification) {
NSLog(@"Notification received!");
NSDictionary *userInfo = notification.userInfo;
_eventName = [userInfo objectForKey:@"eventName"];
NSLog(@"received._eventName = %@", _eventName);
[self performSelectorOnMainThread:@selector(updateTable) withObject:nil waitUntilDone:YES];
}];
}
return self;
}
-(void) updateTable {
NSLog(@"%s", __PRETTY_FUNCTION__);
[self.tv reloadData];
}
я запускаю мой modalView внутри accessoryButtonTappedForRowWithIndexPath
метода
EventNameVC *nameEditor = [[EventNameVC alloc] initWithNibName:@"EventNameVC" bundle:nil];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:nameEditor];
[self presentViewController:nav animated:YES completion:nil];
Итак, когда мы начинаем модальное представление с использованием presentViewController
и об увольнении, уведомление обжигают.
В моем модального зрении
-(IBAction) btnSave:(id)sender {
[self.txtName resignFirstResponder];
///[[MySingleton sharedInstance].userData setObject:self.txtName.text forKey:@"eventName"];
NSDictionary *userInfo = [NSDictionary dictionaryWithObject:self.txtName.text forKey:@"eventName"];
[[NSNotificationCenter defaultCenter] postNotificationName:@"dismissModalView" object:self userInfo:userInfo];
[self dismissViewControllerAnimated:YES completion:nil];
}
Когда я запускаю это, updateTable правильно выстрелил и вошел в консоли.
Пока все хорошо.
Но табличное представление все еще не обновило его данные; Мне все же приходится физически перемещать таблицу, чтобы сделать обновление ячейки.
Что я могу сделать, чтобы заставить ячейки обновиться правильно?
Попробуйте вызвать 'reloadData' в представлении таблицы, чтобы заставить его обновиться. –
Когда вы говорите, поместите reloadData в tableView, в каком методе? Вы имеете в виду в блоке завершения '[self presentViewController: nav animated: YES complete ..." или в другом месте? – zardon
Я попытался поместить reloadData внутри 'viewWillAppear ', например' [self.tv reloadData]; 'это не приводит к корректному отображению ячейки. – zardon