我有一个简单的问题:我的自定义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
被调用。
答案 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而不是使用公共接口来设置自己。它可能会手动操作保存视图控制器数组的实例变量。