当用户返回到 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 的子级时,滚动不起作用

呈现新的 ViewController 后 Deinit UITabBarController

用户选择选项卡时如何重置 UITabBarController 的选项卡(或选项卡控制器)?