UITabBarController子类从不调用setViewControllers:或setViewControllers:animated:

时间:2013-12-06 18:32:57

标签: ios objective-c uitabbarcontroller subclass uistoryboard

我有一个简单的问题:我的自定义UITabBarController子类会覆盖setViewControllers:setViewControllers:animated:。在故事板中使用我的子类时,不会调用任何方法。为什么?如何设置viewControllers属性?我能以某种方式陷入他们被设定的那一刻吗?

我的代码:

MyTabBarController.h

#import <UIKit/UIKit.h>

@interface MyTabBarController : UITabBarController <UITabBarControllerDelegate>
@end

MyTabBarController.m

#import "MyTabBarController.m"

@implementation MyTabBarController
- (void)viewDidLoad
{
    NSLog(@"I do get called, and at this point I have viewControllers");
}

- (void)setViewControllers:(NSArray *)viewControllers
{
    NSLog(@"in setViewControllers:");
    [super setViewControllers:viewControllers];
}

- (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated
{
    NSLog(@"in setViewControllers:animated:");
    [super setViewControllers:viewControllers animated:animated];
}
@end

注意:我知道我的子类正在被使用,因为viewDidLoad被调用。

2 个答案:

答案 0 :(得分:4)

我同意@Duncan,控制器是由initWithCoder(或更确切地说是loadView)设置的。

基于这个假设,很明显为什么不使用访问器:子类可以覆盖它们(可能忘记调用super或假设实例已完全初始化)。

尽管Apple错过了提供建议,但您可以在Google Obj-C Styleguide init期间找到避免访问者的建议(我相信我读过斯坦福大学课程也推荐这样做)。而且我非常怀疑Apple会在初始化阶段编写代码来发出KVO事件。

因此,除非您需要在添加ViewControllers之前对其进行操作,否则为什么不采用直接的解决方案呢?

- (id)initWithCoder:(NSCoder*)aDecoder 
{
    if(self = [super initWithCoder:aDecoder]) 
    {
        [whateverYouWantToDoWithTheControllers:self.viewControllers];
    }
    return self;
}

- (void)setViewControllers:(NSArray *)viewControllers
{
    [super setViewControllers:viewControllers];
    [whateverYouWantToDoWithTheControllers:viewControllers];
}

- (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated
{
    [super setViewControllers:viewControllers animated:animated];
    [whateverYouWantToDoWithTheControllers:viewControllers];
}

答案 1 :(得分:2)

从文档中我看起来像setViewControllers:animated是一种方法,供第三方开发人员切换安装在标签栏控制器中的视图控制器列表。

我的猜测是,当从XIB或故事板加载视图控制器时,它使用initWithCoder而不是使用公共接口来设置自己。它可能会手动操作保存视图控制器数组的实例变量。