1

我的申请有问题。任何帮助将不胜感激。基本上是从视图 A 到视图 B,然后从视图 B 回来。

在视图 A 中,它具有从数据库中加载的动态数据,并显示在表视图上。在这个页面中,它也有编辑按钮,而不是在导航栏上。当用户点击编辑按钮时,它会转到视图 B,其中显示了选择视图。用户可以在此处进行任何更改。完成后,用户点击导航栏上的后退按钮,将更改保存到 NSUserDefaults 中,然后通过弹出视图 B 返回视图 A。

返回视图 A 时,它应该从 UIUserDefaults 中获取新数据,并且确实如此。我使用 NSLog 打印到控制台,它显示了正确的数据。它还应该调用 viewWillAppear: 方法来获取表格视图的新数据,但它没有。它甚至没有调用 tableView:numberOfRowsInSection: 方法。我在这个方法中放置了一个 NSLog 语句,但没有在控制台中打印出来。

结果,视图 A 仍然有旧数据。在视图 A 中获取新数据的唯一方法是停止并启动应用程序。

视图 A 和视图 B 都是UIViewControllerUITableViewDelegate和的子类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];
}

我做对了吗?或者有什么我错过的吗?

4

2 回答 2

3

首次加载视图时,它会调用 viewDidLoad 方法。如果您创建一个堆栈,深入了解它(从 A 到 B)然后返回(B 到 A)viewDidLoad 不会在 A 上再次调用。您可能想要尝试的是将 A 传递给 B(通过传入 self ) 并调用 viewDidLoad 方法来获取新数据,然后调用 tableView 上的 reloadData 方法来重新填充表格视图。

您可能想要尝试的是从 viewDidLoad 方法中取出数据获取和设置功能,并将其放在它自己的 getData 方法中。在 getData 方法的末尾,您可以放置​​一个[self.tableView reloadData];来重置/重新填充表格视图。从类 B 中,您可以调用[self getData]并最小化您将在类 B 中执行的工作量。这将有助于提高该代码的重用能力,并可能防止调用 viewDidLoad 方法的副作用。

于 2009-07-28T21:38:20.867 回答
1

您也可以使用 viewDidAppear。每次出现屏幕时都会调用它。出于性能原因,请设置一个标志,这样您就不会在第一个屏幕视图中使用 viewDidAppear 在 vi​​ewDidLoad 中重复相同的功能。

于 2010-03-22T22:43:29.550 回答