我的申请表有问题。任何帮助将不胜感激。基本上它是从视图A到视图B,然后从视图B返回。
在视图A中,它具有从数据库加载的动态数据,并显示在表视图中。在此页面中,它还有编辑按钮,而不是导航栏。当用户选中编辑按钮时,它会进入视图B,其中显示了选择视图。用户可以在这里进行任何更改。完成后,用户选中导航栏上的后退按钮,将更改保存到NSUserDefaults中,然后弹出视图B返回到视图A.
当回到视图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];
}
我做得对吗?还是有什么我错过的?
答案 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的相同功能。