Перезагрузить данные из табличного представления после возврата из другого представления

У меня проблема в моем приложении. Любая помощь будет оценена. По сути, это переход от вида А к виду Б, а затем возврат из вида Б.

В представлении A динамические данные загружаются из базы данных и отображаются в виде таблицы. На этой странице у него также есть кнопка редактирования, а не на панели навигации. Когда пользователь нажимает кнопку редактирования, он переходит к представлению B, которое показывает представление выбора. И пользователь может вносить любые изменения здесь. Как только это будет сделано, пользователь нажимает кнопку «Назад» на панели навигации, сохраняет изменения в NSUserDefaults, возвращается к представлению A, открывая представление B.

При возвращении к представлению A он должен получить новые данные из UIUserDefaults, что и было сделано. Я использовал NSLog для вывода на консоль, и он показывает правильные данные. Также он должен вызвать метод viewWillAppear: для получения новых данных для табличного представления, но этого не произошло. Он даже не вызывал метод tableView:numberOfRowsInSection:. Я поместил оператор NSLog в этот метод, но не распечатал его в консоли.

В результате представление A все еще содержит старые данные. единственный способ получить новые данные в представлении A — остановить и запустить приложение.

И вид A, и вид B являются подклассом UIViewController с UITableViewDelegate и UITableViewDataSource.

Вот мой код в представлении A:

- (void)viewWillAppear:(BOOL)animated {
    NSLog(@"enter in Schedule2ViewController ...");

    // load in data from database, and store into NSArray object

    //[self.theTableView reloadData];
    [self.theTableView setNeedsDisplay];
    //[self.theTableView setNeedsLayout];
}

Здесь «theTableView» — это переменная UITableView. И я пробовал все три случая «reloadData», «setNeedsDisplay» и «setNeedsLayout», но, похоже, не сработал.

В представлении B вот метод, соответствующий кнопке «Назад» на панели навигации.

- (void)viewDidLoad {
    UIBarButtonItem *saveButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSave target:self action:@selector(savePreference)];
    self.navigationItem.leftBarButtonItem = saveButton;
    [saveButton release];
}

- (IBAction) savePreference {
    NSLog(@"save preference.");

    // save data into the NSUSerDefaults

    [self.navigationController popViewControllerAnimated:YES];
}

Правильно ли я поступаю? Или есть что-то, что я пропустил?


person user129677    schedule 13.07.2009    source источник


Ответы (2)


Когда представление загружается впервые, оно вызывает метод viewDidLoad. Если вы создаете стек, переходите к нему (от A к B), а затем возвращаетесь (от B к A), viewDidLoad не вызывается снова на A. Что вы можете попробовать, так это передать A в B (путем передачи себя ) и вызовите метод viewDidLoad, чтобы получить новые данные, а затем метод reloadData для tableView, чтобы заполнить табличное представление.

Что вы можете попробовать, так это взять функциональность извлечения и установки данных из метода viewDidLoad и поместить ее в собственный метод getData. В конце метода getData вы можете поместить [self.tableView reloadData]; для сброса/пополнения представления таблицы. Из класса B вы можете вызвать [self getData] и свести к минимуму объем работы, который вы бы сделали в классе B. Это поможет повысить возможность повторного использования этого кода и может предотвратить вызов метода viewDidLoad побочными эффектами.

person Zach    schedule 28.07.2009

Вы также можете использовать viewDidAppear. Он вызывается каждый раз, когда появляется экран. Из соображений производительности установите флаг, чтобы не повторять одну и ту же функциональность в viewDidLoad с viewDidAppear для первого просмотра экрана.

person Neffster    schedule 22.03.2010