刷新TabView的内容

时间:2012-05-18 12:37:41

标签: iphone objective-c xcode

好的我正在尝试在进行网络通话后刷新每个标签的标签内容,并且我已经尝试了很多不同的方法来做到这一点,我已经失去了数量。有人可以告诉我这是怎么可能的吗?

Web调用只是从服务器调用JSON并使用它来更新选项卡的内容。出于测试目的,我在设置类中设置了一个按钮。设置类是主选项卡中的一个视图,其中有一个名为refresh的按钮。单击时,这将使存储在设备上的JSON与应用程序启动时从Web调用中调用的JSON不同。这使我不必更改服务器上的JSON。

我将带您了解一些我尝试过的技巧,如果有人能告诉我我做错了什么,我将不胜感激。

我尝试创建类的实例并像这样调用refresh方法

DashboardVC *db = [[DashboardVC alloc] init];
[db refreshMe];

仪表板类中的刷新方法是这个

-(void) refreshMe
{     
     [self loadView];
     [self viewDidLoad];
}

然而没有运气。如果我在Dashboard类中调用它,这个方法将起作用,但如果我从另一个类调用它,它将不起作用。我认为我正在实例化一个新类并在其上调用refresh。所以我放弃了这种技术并转向下一个方法

这会循环遍历所有tabBars并更改tabTitles而不会出现任何问题,因此我知道它肯定会正确地循环遍历ViewControllers。

我也尝试了ViewDidAppear,viewWillAppear等视图方法的每个变量,没有运气。

我也尝试通过tabController访问我在dashBoard类中创建的refreshMe方法

[[[self.tabBarController viewControllers] objectAtIndex:0] refreshMe];

但又没有运气,这只会导致我的应用程序崩溃。

我仔细阅读了本指南

https://developer.apple.com/library/ios/#documentation/WindowsViews/Conceptual/ViewControllerPGforiOSLegacy/TabBarControllers/TabBarControllers.html

在苹果网站上,但它似乎没有涵盖如何刷新单个标签内容。

我想要的是让每个单独的标签在进行网络通话后刷新其内容,并花了很多时间试图解决这个问题,但没有任何工作。

如果有人能告诉我我做错了什么,那将是非常感激的?

提前完成了......

编辑:

扩展我的尝试

与Michael讨论后,我意识到你不应该将loadView称为Apple指南。所以我删除了对LoadView的任何引用。我现在在所有名为RefreshMe的主ViewControllers中放置了一个方法,它在类中设置视图,图像文本等。此方法放在ViewDidLoad中。现在我希望能够在进行Web调用后调用这些方法,从而有效地刷新应用程序。

我的viewDidLoad现在在我所有的主要类中都是这样的。

- (void) viewDidLoad {
     [super viewDidLoad];
     [self refreshMe];
}  

然后refreshMe方法包含设置屏幕的代码。

从Web调用中提取的JSON数据将设置5个选项卡中每个选项卡的内容,因此需要在Web调用后刷新所有选项卡。

我尝试循环遍历viewControllers并调用viewDidLoad,后者应该调用设置类的refreshMe方法,但是没有任何反应。我使用的代码就是这个

NSArray * tabBarViewControllers = [self.tabBarController viewControllers];

for(UIViewController * viewController in tabBarViewControllers)
{
    [viewController viewDidLoad];
}

目前我还包括

NSLog(@"Method called"); 

在每个类的viewDidLoad中测试是否正在调用它。但是,只有在我第一次加载应用程序或重新进入应用程序时才打印出该消息。单击设置屏幕中的刷新按钮后应该调用此方法但不是,我不明白为什么。

任何人都知道为什么这不起作用?

2 个答案:

答案 0 :(得分:1)

在更新标签栏排序时,为什么不通过实现子类UIViewController的viewWillAppear:方法简单地刷新视图,而不是刷新视图控制器?

这意味着每次您的视图即将出现时,您都可以更新新视图和视图。更新内容。

答案 1 :(得分:1)

从问题和你的评论中,听起来至少有两个问题:

  1. 您无法访问应用的标签栏控制器管理的视图控制器。

  2. 您似乎正在反对视图控制器的正常操作。

  3. 第一部分应该很容易理清。如果您有指向对象的指针,则可以向该对象发送消息。如果相应的方法没有执行,那么指针不指向您认为它的位置,或者对象没有您认为它的方法。我们来看看你的代码:

    NSArray * tabBarViewControllers = [self.tabBarController viewControllers];
    
    for(UIViewController * viewController in tabBarViewControllers)
    {
        [viewController viewDidLoad];
    }
    

    此代码应该在某些标签栏控制器管理的每个视图控制器上调用-viewDidLoad。暂且不说暂时这样做的智慧,我们可以说这个代码应该按预期工作如果 self.tabBarController指向你认为它的对象。您没有说明您的应用程序中存在此代码的位置 - 它是您的应用程序委托的一部分,是由相关标签栏控制器管理的其中一个视图控制器的一部分,还是其他位置?使用调试器逐步执行代码。在第一行之后,tabBarViewControllers是否包含一组视图控制器?视图控制器的数量是否正确,是否为预期类型?如果没有调用视图控制器的-viewDidLoad方法,那么答案是“不”是一个很好的选择,因此要弄清楚为什么self.tabBarController不是您的想法。

    现在,绝对值得指出(正如迈克尔所做的那样)你不应该首先调用-viewDidLoad。视图控制器将在创建视图后将该方法发送给自身(从.xib / storyboard文件加载或以编程方式创建)。如果您自己致电-viewDidLoad,它将在创建视图之前运行,或者第二次运行,并且这些都不会有用。

    此外,尝试先抢先“刷新”每个视图控制器的视图没有多大意义。如果您的应用程序正在从Web服务(或其他任何地方)检索某些数据,则应使用生成的数据更新其模型,即应用程序管理的数据对象。选择视图控制器后,选项卡栏控制器将显示其视图,并且将在显示视图之前调用视图控制器的-viewWillAppear方法。使用该方法从模型中获取所需的数据并更新视图。这样做,你知道:

    • 视图控制器的视图已经创建

    • 即使其他一个视图控制器修改了数据,视图中显示的数据也是最新的

    • 您永远不会花时间更新用户可能永远不会看到的视图

    同样,如果用户可以对显示的数据进行任何更改,则应确保在进行更改时更新模型,或者在视图控制器的-viewWillDisappear方法中更新模型,以便下一个视图控制器将有正确的数据可供使用。