2009-07-13 3 views
1

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

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

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

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

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

Вот мой код в виде А:

- (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]; 
} 

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

ответ

3

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

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

1

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

 Смежные вопросы

  • Нет связанных вопросов^_^