Приложение UITabBarController - как вызвать метод между контроллерами? - PullRequest
3 голосов
/ 04 апреля 2011

Я предполагаю, что это очень простая проблема, но решение ускользнуло от меня.У меня есть приложение UITabBarController.Есть два представления, я назову их A и B. И, конечно, у меня есть класс AppDelegate, который инициализирует панель вкладок.Когда она нажата, представление B должно вызывать прямой или косвенный вызов clearScore: на представлении A. Может ли кто-нибудь показать мне шаги, чтобы это произошло?Спасибо за любую помощь!

Ответы [ 4 ]

2 голосов
/ 04 апреля 2011

Вы можете использовать Уведомления или Наблюдение значения ключа (KVO) .

Предположим, у вас есть модельный объект, в котором находится оценка вашего свойства. Теперь вы добавляете Key-Value-Observer в viewController B к свойству Score экземпляра модели. Когда вы нажимаете clearScore в A, вы устанавливаете свойство счета в 0 (или ноль). Наблюдатель сообщит B, что свойство изменилось, чтобы вы могли легко обновить свой вид B.

1 голос
/ 17 января 2013

Я думаю, что есть более простой способ достичь этого:

Вы можете использовать что-то вроде приведенного ниже кода в bViewController:

for (UIViewController* testViewController in self.tabBarController.viewControllers) {
    if ([testViewController respondsToSelector:@selector(clearScore)]) {
        [(aViewController *)testViewController clearScore];
    }
}

Или:

for (UIViewController* testViewController in self.tabBarController.viewControllers) {
    if ([testViewController isKindOfClass:[aViewController class]]) {
        [(aViewController *)testViewController clearScore];
    }
}

Не забудьте #import "aViewController.h" в заголовке bViewController;

0 голосов
/ 08 февраля 2013
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
    //other codes

    [self.tabBarController setDelegate:self]

    //other codes
    }

// UITabBarControllerDelegate method.
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
    if ([viewController respondsToSelector:@selector(reloadDataTemp)]) {
        [(YourViewController *)viewController reloadData];
    }
}
0 голосов
/ 04 апреля 2011

Представления должны напрямую взаимодействовать только со своими собственными контроллерами, а контроллер не должен общаться с представлениями, отличными от своих собственных. Если одна из кнопок контроллера В представления должна привести к отправке сообщения на контроллер А, то кнопка должна инициировать действие в контроллере В, который, в свою очередь, отправляет сообщение A.

Однако -clearScore: звучит как метод, который был бы частью модели, а не частью контроллера, и тот факт, что B представляет интерес, является еще одним доказательством того же. Возможно, вы захотите немного подумать о рефакторинге вашего кода.

...