访问在Subclassed UITabBarController中创建的按钮

时间:2011-03-14 06:15:56

标签: iphone xcode uitabbarcontroller subclass

好的,所以我有点卡住,也许有人可以提供一些建议。

我已经将UITabBarController子类化,并且创建了一个自定义按钮,只要在viewDidLoad内调用CustomTabBarController,就会覆盖标签栏。

除非与任何动作无关,否则效果很好。

我想要做的是按下该按钮时显示UIModalViewController。现在,我最好不要从子类CustomTabBarController进行调用,而是从我的一个viewControllers(rootViewController per-say)中与标签相关联。

有人可以指导我如何实现这一目标吗? IE,如何在一个类中实例化一个按钮,并使该按钮响应另一个类中的动作。

我应该使用NSNotificationCenter,委托响应者,还有其他什么?一个例子很棒:)

2 个答案:

答案 0 :(得分:2)

有几种方法可以实现您的要求。我通常采取的方法是我做这样的事情:

// 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也是一种选择,但我个人不喜欢在没有必要时发送通知。我通常只在多个对象需要响应事件时才使用通知。

答案 1 :(得分:0)

您可以使用UITabBarController数组引用viewControllers中的所有视图控制器。您可以使用selectedViewController轻松获取当前所选视图的视图控制器。

考虑到这一点,您的CustomTabBarController操作可以调用这些视图控制器上的方法。只需将方法添加到相应的视图控制器即可显示UIModalViewController