目标C:如何在选择选项卡时重新加载视图控制器的表视图

时间:2011-06-30 18:13:52

标签: objective-c uitabbarcontroller

单击标签栏时,我需要在视图控制器中重新加载数据。

我正在使用UITabBarControllerDelegate方法,如下所示:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
    if (tabBarController.selectedIndex == 3) 
    {
        [(SomeViewController *)viewController getData];
    }
}

其中'getData'是SomeViewController类中的实例方法。但是,当我运行我的应用程序时,我收到以下错误

2011-07-01 02:12:11.193 onethingaday[19169:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UINavigationController getData]: unrecognized selector sent to instance 0x600d500'

有谁能告诉我如何克服这个问题?我只需要在tabbarcontroller.selected index == 3

时触发'getData'方法

4 个答案:

答案 0 :(得分:2)

在我看来,您收到的错误消息中,您在标签控制器中使用了UINavigationController;在这种情况下,您无法直接向其发送getData消息;您应该首先找出UINavigationController下的哪个视图控制器应该接收该消息。 (这实际上与标签栏selectedIndex

无关

我不知道您的UINavigationController是如何组织的,但您可以这样做:

 - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
     if (tabBarController.selectedIndex == 3) {

   //-- option 1: getData goes to the first view controller in the UINavigationController:
         [[(SomeViewController*)[(UINavigationController*)viewController topViewController] getData];

   //-- option 2: getData goes to the last view controller in the UINavigationController (the visible one):
         [[(SomeViewController*)[(UINavigationController*)viewController visibleViewController] getData];

     }
 }

如果您提供有关UINavigationController组织的更多详细信息,我可以帮助您进一步确定正确的选项。

无论如何,正如你可以从演员表中看到的那样,你的设计还有一些不完全正确的东西。我强烈建议使用通知。即,您的SomeViewController注册自己以获取给定类型的通知:

 [[NSNotificationCenter defaultCenter] addObserver:self 
                             selector:@selector(someSelector:) 
                             name:ShouldGetDataNotification 
                             object:nil];

并且标签栏控制器发送通知给您的控制器做出反应:

 - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
     if (tabBarController.selectedIndex == 3) {

      [[NSNotificationCenter defaultCenter] postNotificationName:ShouldGetDataNotification object:nil];
     }
  ....
}

请看this post

答案 1 :(得分:1)

答案 2 :(得分:1)

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
    if (tabBarController.selectedIndex == 3) 
    {
        [[[(UINavigationController *)viewController viewControllers] objectAtIndex:2] getData];//2 for 3rd tabbar since 0,1,2



    }
}

答案 3 :(得分:1)

您可以在-viewWillAppear子类中实现UITableViewController方法。当UITabBarController切换到视图时,应该自动调用它。看起来应该是这样的:

- (void)viewWillAppear {
    [super viewWillAppear];
    [self getData];
}