我正在尝试使用选项卡栏控制器的委托方法之一从嵌入在选项卡栏控制器中的视图控制器中检测对另一个选项卡的点击。 但是,我对这些方法是否可以在单个视图控制器中或它们是否必须位于uitabbarcontroller类中感到困惑。 我想将它们放在视图控制器中,在那里我可以访问这些 VC 的所有属性和局部变量,而不是在 tabbarcontroller 类中。
我也对如何设置委托感到困惑。
在嵌入在选项卡栏控制器中的表视图控制器中,我声明了委托协议,然后包含以下代码。 但是,该方法没有触发。 是否可以将此委托方法放在 VC 中,如果是,我应该如何以及在何处设置委托以使其触发?
- (void)tabBarController:(UITabBarController *)tabBarController
didSelectViewController:(UIViewController *)viewController
{
NSLog(@"DIDSELECTVC FIRED");
NSLog(@"controller class: %@", NSStringFromClass([viewController class]));
NSLog(@"controller title: %@", viewController.title);
if (viewController == tabBarController.moreNavigationController)
{
tabBarController.moreNavigationController.delegate = self;
}
}
如前所述,实现UITabBarControllerDelegate的更好方法是在UITabBarController本身的子类中。
如果要使用某些内部视图控制器作为委托,请使用tabBarController
属性:
- (void)viewDidLoad {
[super viewDidLoad];
self.tabBarController.delegate = self;
}
您可以使用单个ViewController或UITabBarController本身进行委托,只要它符合UITabBarControllerDelegate协议。
我认为使用 UITabBarController 本身(或其他专用类(到 UITabBarControllerDelegate 比使用 UITabBarControllerDelegate 比使用子 ViewController 更常见,因为您只能设置一个委托。但是如果你想使用单独的ViewController,我希望这段代码能帮助你。
@implementation MyTabBarController : UITabBarController
- (id)initWithCoder:(NSCoder *)aCoder{
self = [super initWithCoder:aCoder];
if (self) {
MyTableViewController *controller = [[MyTableViewController alloc] init];
controller.tabBarItem = ...
_delegate = controller; //Set individual ViewController to UITabBarControllerDelegate
[self setViewControllers:@[controller] animated:YES];
}
return self;
}
@end
MyTableViewController 是:
@interface MyTableViewController : UITableViewController<UITabBarControllerDelegate>
@end
@implementation MyTableViewController
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
//Handle tap event of UITabBarController
}
@end