2012-05-18 48 views
1

我有两个问题,我想解决,一个是刷新选项卡控制器本身,另一个是刷新tabcontroller的内容。iPhone刷新tabcontroller和内容

我希望刷新标签控制器本身的原因是我的应用程序有一个Web调用,它返回一个JSON,它设置标签的顺序并设置每个标签的内容。我有它,这样你背出申请,并重新进入应用程序时,标签控制器是通过把

exit(0) 

在AppDelegates ApplicationDidEnterBackground这样,当用户备份出来,重新进行控制器将被刷新刷新。在applicationDidFinishLaunchingWithOptions中,我设置了一个Web调用,它调用JSON,然后用它来设置Tab键顺序。我知道这不是一个很好的做法,但暂时来说,它是我能想到的唯一解决方案。我还可以刷新TabController吗?

对于选项卡的内容,它是刷新使用此代码

becomeActiveObserver = [[NSNotificationCenter defaultCenter] 
         addObserverForName:UIApplicationDidBecomeActiveNotification 
         object:nil 
         queue: nil 
         usingBlock:^(NSNotification *note){ 

          [self refresh]; 
          [self viewDidUnload]; 
         }]; 

我已经设置这种类型的代码为每个所述5个标签的使用。这很有效,但问题是内容仅在应用程序退出并再次访问时刷新。网络电话将是周期性的,当网络电话发出时,我希望它的内容会刷新自己,而不必退出并重新进入应用程序。

为了测试的目的,我在我的设置屏幕中设置了一个按钮(设置屏幕只是我的一个选项卡中的另一个视图),当单击阅读JSON时,它将存储在与检索到的JSON不同的iPhone目录中从网络通话(节省我不得不去服务器,并不断改变JSON那里)。当点击这个按钮时,它应该读取这个新的JSON,更新内容然后刷新视图。我已经测试了这一点,JSON正在被读取并且数据正在被更新(我在每个屏幕上设置了一个按钮来读取它用于确认的JSON),但是在我退出并进入再次申请。

我在设置屏幕阅读JSON存储在设备上设置的临时代码

-(IBAction)RefreshApp:(id)sender{  



NSFileManager *fileManager = [NSFileManager defaultManager]; 

    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"widgjson" ofType:@"json"]; 
    NSData *myData = [NSData dataWithContentsOfFile:filePath]; 
    NSString *responseString = [[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding]; 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *docDir = [paths objectAtIndex: 0]; 
     NSString *docFile = [docDir stringByAppendingPathComponent: @"json.txt"]; 
     [fileManager removeItemAtPath:docFile error:NULL]; 
     [responseString writeToFile:docFile atomically:NO encoding:NSUTF8StringEncoding 

DashboardVC *db = [[DashboardVC alloc] init]; 
    [db refresh]; 
    [db viewDidUnload]; 

} 

在底部,你可以看到我试图从一个选项卡打电话刷新刷新一个的意见确实看到,如果工作,但没有运气。刷新代码似乎只能从类内部调用它时才起作用,我无法在从另一个类访问它时刷新它。

当进行网络通话时,我希望每一个标签一次被刷新。任何想法,我会如何做到这一点?

如果有人能指出我正确的方向,我将非常感激。

+0

请勿在代码中的任何位置放置“exit()'”call *“。以这种方式终止您的应用程序(用户不是手动终止/退出应用程序的用户)肯定是苹果拒绝您的应用程序从应用程序商店的理由。 –

回答

2

UITabBarController的setViewControllers: animated:方法是你想在这里使用的。

当您收到要重新排列标签的通知时,请使用该函数将标签栏中拥有(和引用)的各种视图控制器按照您的顺序希望您的选项卡出现。

+0

我想出了如何让这个方法在最后工作,它重新排列了很好的选项卡,但它并没有刷新内容。这种方法不这样做吗? – AdamM

+0

更新视图控制器是将它们添加到标签栏Adam的单独事物。您通常会如何告诉视图控制器更新其内容?您是否有“refreshMyData”方法或其他您创建的用于更新内容的方法?如果您确实有某些事情表明您希望视图控制器更新其内容,那么为什么不通过每个视图控制器进行枚举并在您设置标签栏的标签排序的同时为它们调用自定义更新方法? –

+0

我在我的DashboardVC中设置了一个刷新方法,这是我的主页选项卡,您可以在我上面提供的代码中看到,并且我调用了刷新。现在我知道refresh和viewDidload函数都被调用,因为我有文本打印出来,无论何时调用这些方法,但内容不会更新,直到我退出并再次。这是我觉得最困惑的。是否因为我在调用DashboardVC * db = [[DashboardVC alloc] init]时声明了DashboardVC的新实例,然后调用该函数的刷新? – AdamM