当用户返回到 UITabBarController 选项卡时如何刷新表数据
Posted
技术标签:
【中文标题】当用户返回到 UITabBarController 选项卡时如何刷新表数据【英文标题】:How to Refresh Table Data When User Returns to UITabBarController Tab 【发布时间】:2011-07-19 19:15:18 【问题描述】:我有一个使用标准选项卡栏应用程序项目模板 (UITabBarController) 的 iPhone 应用程序(在 XCode 4 中)。
我的第一个视图有一个从 JSON 提要获取数据的 UITableView。这是控制器加载数据的地方:
#import "FirstViewController.h"
#import "SBJson.h"
#import "WheelRecord.h"
#import "WheelTableCell.h"
#import "UIImageView+WebCache.h"
@implementation FirstViewController
@synthesize wheels, wheelsTable;
- (NSMutableArray *) wheels
if (!wheels)
SBJsonParser *parser = [[SBJsonParser alloc] init];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://wheelspotting.com/recent.json"]];
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSString *json_string = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];
NSArray *wheelData = [parser objectWithString:json_string error:nil];
self.wheels = [NSMutableArray array];
for (NSDictionary *wheel in wheelData)
WheelRecord *currentWheel = [[[WheelRecord alloc] init] autorelease];
currentWheel.title = [wheel objectForKey:@"title"];
currentWheel.smallImage = [wheel objectForKey:@"small_image"];
currentWheel.mediumImage = [wheel objectForKey:@"medium_image"];
currentWheel.largeImage = [wheel objectForKey:@"large_image"];
[self.wheels addObject:currentWheel];
return wheels;
每当用户选择不同的选项卡然后返回到第一个选项卡时,我都会尝试重新加载该数据。
我尝试在 viewDidLoad 和 viewWillAppear 中将***设置为 nil,但是当我切换选项卡并返回第一个选项卡时,它永远不会更新(我对要测试的数据进行了更改)。
【问题讨论】:
【参考方案1】:我不相信 ViewDidLoad 会再次被调用,因为所有视图控制器都会一直存在。我会认为 viewWillAppear 应该被调用。
愚蠢的问题,但你确定数据没有被更新?也许只是您的表格视图没有使用新数据进行更新?您是在 viewWillAppear 或 viewDidAppear 方法中的某处调用 [yourTableView reloadData] 吗?或者,在 if 代码结束之前弹出一个 [yourTableView reloadData],例如
[self.wheels addObject:currentWheel];
[yourTableView reloadData]; // where yourTableView is the pointer to your table view
标签栏控制器使用起来可能很尴尬,我知道我个人花了很多时间对它们发誓。要尝试的一件事是,如果您以任何方式对 UIViewController 进行了子类化,或者正在使用 UITableViewController 或 UINavigationController,请确保您已在检查器中为相关选项卡设置正确的对象类型 - 由于忘记,我遇到了无穷无尽的问题过去这样做。
【讨论】:
是的,我没有调用 reloadData ...我假设将***设置为 nil 会迫使它再次获取数据,因为表使用***。但我想它会保留数据,直到调用 reloadData。我还不太明白,但它可以工作。谢谢。 第一次初始化表格视图时,它会询问(通过它的数据源)方法来获取部分和单元格的数量。然后,每当一个单元格变得可见时(即通过滚动),它就会询问该单元格的内容,所以理论上如果您的数据已更新并且表格没有重新加载,那么您可能会在滚动视图时看到一些数据,但也可能导致数组超出范围等(因为总计数尚未更新)。每当视图所依赖的数据发生变化时,始终最好为视图重新加载数据。【参考方案2】:你试过[self reloadData]
吗?考虑到它是您要更新的 UITableView FirstViewController。
【讨论】:
以上是关于当用户返回到 UITabBarController 选项卡时如何刷新表数据的主要内容,如果未能解决你的问题,请参考以下文章
UITabBarController 和模式视图的自动旋转问题
从 UITabBarController 内部呈现 UINavigationController
是否在 UITabBarController 中多次调用 viewDidLoad?
当 UITableViewController 是 UITabBarController 的子级时,滚动不起作用