2017-02-08 3 views
1

Я пытаюсь обнаружить нажатие другой вкладки из контроллера представления, встроенного в контроллер табуляции, используя один из методов делегата tabbarcontroller. Тем не менее, я смущен тем, могут ли эти методы быть в контроллерах отдельных представлений или они должны быть в классе uitabbarcontroller. Я хотел бы иметь их в контроллерах представления, где у меня есть доступ ко всем свойствам и локальным переменным этих VC, а не к классу tabbarcontroller.IOS: UITabBarControllerDelegate Methods from tableviewcontroller

Я также смущен о том, как установить делегат.

В контроллере tableview, встроенном в контроллер tabbar, я объявил протокол делегата, а затем включил следующий код. Однако метод не стреляет. Можно ли поместить этот метод делегата в 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; 
    } 
} 
+0

Я нашел, что это легче сделать 'UITabBarController' подкласс и обрабатывать методы там. См. [Этот ответ] (https://stackoverflow.com/a/47861294/3681880). – Suragch

ответ

2

Как сказал Фуруя сказал лучший способ реализации UITabBarControllerDelegate внутри подкласса самого UITabBarController.

Если вы хотите использовать определенный внутренний контроллер представления, как использование делегат tabBarController собственности:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.tabBarController.delegate = self; 
} 
+0

Это сделало трюк. это специализированный прецедент. Если я поставлю методы делегата в tabbarcontroller, тогда мне придется получить доступ к кучу свойств и логики в отдельном контроллере, поэтому в этом случае я считаю, что нетрадиционное использование оправдано. – Arjun

0

Вы можете использовать либо отдельное ViewController или сам UITabBarController делегата до тех пор, как он соответствует протоколу UITabBarControllerDelegate.

Я думаю, что чаще всего используется UITabBarController (или другой выделенный класс) для UITabBarControllerDelegate, чем дочерние ViewControllers, потому что вы можете установить делегат только один. Но если вы хотите использовать отдельный 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 
Смежные вопросы