Цель C: Как перезагрузить табличное представление контроллера представления, когда выбрана вкладка - PullRequest
1 голос
/ 30 июня 2011

Мне нужно перезагрузить данные в контроллере представления при нажатии на его вкладку.

Я использую метод 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'

Может кто-нибудь посоветовать мне, как я могу решить эту проблему?Мне просто нужно вызвать метод 'getData', когда tabbarcontroller.selected index == 3

Ответы [ 4 ]

2 голосов
/ 30 июня 2011

Мне кажется из полученного сообщения об ошибке, что вы используете 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];
     }
  ....
}

Посмотрите на этот пост .

1 голос
/ 30 июня 2011

Вы можете реализовать метод -viewWillAppear в своем подклассе UITableViewController.Это должно вызываться автоматически, когда UITabBarController переключается на представление.Это должно выглядеть примерно так:

- (void)viewWillAppear {
    [super viewWillAppear];
    [self getData];
}
1 голос
/ 30 июня 2011
- (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



    }
}
1 голос
/ 30 июня 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...