Перезагрузить данные из табличного представления после возврата из другого представления - PullRequest
1 голос
/ 13 июля 2009

У меня проблема с приложением. Любая помощь будет оценена. В основном это из вида A в вид B, а затем вернуться из вида B.

В представлении 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];
}

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

Ответы [ 2 ]

3 голосов
/ 29 июля 2009

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

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

1 голос
/ 23 марта 2010

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

...