从另一个视图返回后从表视图重新加载数据

时间:2009-07-13 14:34:35

标签: cocoa-touch uiviewcontroller uikit reload

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

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

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

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

视图A和视图B都是UIViewController的子类,UITableViewDelegateUITableViewDataSource

以下是我在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 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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