2009-07-13 32 views
1

我的应用程序出现问题。任何帮助将不胜感激。基本上它是从视图A到视图B,然后从视图B回来。从其他视图回来后从表视图重新加载数据

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

当回到视图A时,它应该得到来自UIUserDefaults的新数据,它就这样做了。我用NSLog打印出控制台并显示正确的数据。它也应该调用viewWillAppear:方法来获取表视图的新数据,但它没有。它甚至没有调用tableView:numberOfRowsInSection:方法。我在这个方法中放置了一条NSLog语句,但没有在控制台中打印出来。

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

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

这里是我的视图中的代码:

- (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方法获取新数据,然后调用tableView上的reloadData方法来重新填充表视图。

您可能想要尝试的是将数据获取和设置功能从viewDidLoad方法中提取出来,并将其放置在它自己的getData方法中。在getData方法结束时,您可以放置​​一个[self.tableView reloadData];来重置/重新填充表视图。从B类,你可以调用[self getData],并尽量减少你在B类中的工作量。这将有助于提高代码的可重用性,并且可以防止调用viewDidLoad方法的副作用。

1

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

相关问题