好的,所以我有点卡住,也许有人可以提供一些建议。
我已经将UITabBarController子类化,并且创建了一个自定义按钮,只要在viewDidLoad
内调用CustomTabBarController
,就会覆盖标签栏。
除非与任何动作无关,否则效果很好。
我想要做的是按下该按钮时显示UIModalViewController
。现在,我最好不要从子类CustomTabBarController
进行调用,而是从我的一个viewControllers(rootViewController
per-say)中与标签相关联。
有人可以指导我如何实现这一目标吗? IE,如何在一个类中实例化一个按钮,并使该按钮响应另一个类中的动作。
我应该使用NSNotificationCenter
,委托响应者,还有其他什么?一个例子很棒:)
答案 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
。