Кнопка доступа, созданная в подклассе UITabBarController - PullRequest
0 голосов
/ 14 марта 2011

Хорошо, так что я немного застрял, и, возможно, кто-то может дать совет.

Я создал подкласс UITabBarController и создаю пользовательскую кнопку, которая перекрывает панель вкладок всякий раз, когда viewDidLoad вызывается внутри CustomTabBarController.

Это прекрасно работает, за исключением того, что оно не связано с какими-либо действиями.

Я хотел бы, чтобы при нажатии этой кнопки отображался UIModalViewController. Теперь я предпочел бы не делать этот вызов из подкласса CustomTabBarController, а изнутри одного из моих viewControllers (rootViewController per-say), который связан с вкладкой.

Может кто-нибудь подсказать мне, как это сделать? IE, как создать экземпляр кнопки в одном классе и заставить эту кнопку реагировать на действие в другом классе.

Должен ли я использовать NSNotificationCenter, делегаты-ответчики, что-то еще? Пример был бы великолепен:)

Ответы [ 2 ]

2 голосов
/ 14 марта 2011

Есть несколько подходов для достижения того, что вы просите.Подход, который я обычно использую, заключается в том, что я делаю что-то вроде этого:

// CustomTabBarController.h
@protocol CustomTabBarControllerDelegate 
- (void)buttonAction:(id)sender;
@end

@interface CustomTabBarController : UITabBarController {
    id<CustomTabBarControllerDelegate> customDelegate;
}
@property(nonatomic, assign) id<CustomTabBarControllerDelegate> customDelegate;
@end

// CustomTabBarController.m
@interface CustomTabBarController ()
- (void)buttonAction:(id)sender;
@end

@implementation CustomTabBarController
@synthesize customDelegate;
- (void)viewDidLoad {
    [super viewDidLoad];

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    // Configuration of button with title and style is left out
    [button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
}
- (void)buttonAction:(id)sender {
    [self.customDelegate buttonAction:sender];
}
@end

Я не знаю, что будет делать ваша кнопка, поэтому я просто вызываю метод buttonAction:.Поскольку UITabBarController уже имеет свойство с именем delegate, я вызвал нашего делегата customDelegate.Все, что вам нужно сделать, чтобы сделать вышеупомянутую работу, это добавить следующую строку в ваш корневой контроллер представления (или любой другой контроллер, который вы хотите обработать с помощью действия кнопки).

customTabBar.customDelegate = self;

Конечно, вы также должны реализоватьпротокол.

Можно также представить, что не используется делегат, и просто установить цель следующим образом:

[button addTarget:self.rootViewController action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];

Приведенный выше код предполагает, что customTabBarController имеет свойство rootViewController и чтоэто было установлено.Также предполагается, что контроллер корневого представления имеет следующий метод:

- (void)buttonAction:(id)sender;

Я предпочитаю делегированный подход, так как это более общий подход, но более поздний подход также будет работать.Использование NSNotificationCenter также вариант, но я лично не фанат отправки уведомлений, когда в этом нет необходимости.Я обычно использую уведомления только тогда, когда несколько объектов должны ответить на событие.

0 голосов
/ 14 марта 2011

Вы можете ссылаться на все контроллеры вида в вашем UITabBarController с массивом viewControllers.Вы можете легко получить контроллер представления для текущего выбранного вида с помощью selectedViewController.

. Имея это в виду, ваше действие CustomTabBarController может вызывать методы на этих контроллерах представления.Просто добавьте метод к соответствующему контроллеру (ам) просмотра, чтобы отобразить ваш UIModalViewController.

...