Ios UITabBarController子类从不调用SetViewController:或SetViewController:动画:
我有一个简单的问题:我的自定义Ios UITabBarController子类从不调用SetViewController:或SetViewController:动画:,ios,objective-c,uitabbarcontroller,subclass,uistoryboard,Ios,Objective C,Uitabbarcontroller,Subclass,Uistoryboard,我有一个简单的问题:我的自定义UITabBarController子类同时覆盖setViewControllers:和setViewControllers:animated:。在故事板中使用我的子类时,两个方法都不被调用。为什么?如何设置viewControllers属性?我能在他们被设定的那一刻插手吗 我的代码: MyTabBarController.h #import <UIKit/UIKit.h> @interface MyTabBarController : UITabBa
UITabBarController
子类同时覆盖setViewControllers:
和setViewControllers:animated:
。在故事板中使用我的子类时,两个方法都不被调用。为什么?如何设置viewControllers
属性?我能在他们被设定的那一刻插手吗
我的代码:
MyTabBarController.h
#import <UIKit/UIKit.h>
@interface MyTabBarController : UITabBarController <UITabBarControllerDelegate>
@end
注意:我知道使用我的子类是因为调用了
viewDidLoad
在文档中,我觉得它类似于SetViewController:animated是一种供第三方开发人员切换选项卡栏控制器中安装的视图控制器列表的方法
我的猜测是,当从XIB或故事板加载视图控制器时,它使用initWithCoder而不是使用公共接口进行设置。它可能是手动操作保存视图控制器数组的实例变量。在文档中,它看起来像SetViewController:animated是一种供第三方开发人员切换选项卡栏控制器中安装的视图控制器列表的方法
我的猜测是,当从XIB或故事板加载视图控制器时,它使用initWithCoder而不是使用公共接口进行设置。很可能是手动操作保存视图控制器数组的实例变量。我同意@Duncan的观点,即控制器是由
initWithCoder
(或者更确切地说是loadView
)设置的
基于这种假设,不使用访问器的原因是显而易见的:子类可以覆盖它们(并且可能忘记调用super
,或者假设实例已完全初始化)
虽然苹果没有给出建议,但你可以在谷歌的init
中找到避免访问者的建议(我相信我也读过斯坦福课程的建议)。我非常怀疑苹果会在初始化阶段编写代码来发出KVO事件
因此,除非在添加ViewController之前需要对其进行操作,否则为什么不使用直接的解决方案呢
- (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];
}
我同意@Duncan的观点,即控制器由
initWithCoder
(或者更确切地说是loadView
)设置
基于这种假设,不使用访问器的原因是显而易见的:子类可以覆盖它们(并且可能忘记调用super
,或者假设实例已完全初始化)
虽然苹果没有给出建议,但你可以在谷歌的init
中找到避免访问者的建议(我相信我也读过斯坦福课程的建议)。我非常怀疑苹果会在初始化阶段编写代码来发出KVO事件
因此,除非在添加ViewController之前需要对其进行操作,否则为什么不使用直接的解决方案呢
- (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];
}
您是如何用多少个视图控制器实例化MyTabBarController的?@visualication来自具有5个视图控制器的情节提要。可能是情节提要正在抑制调用。您可以尝试以编程方式设置tabbarcontroller。@谢谢。当然,以编程的方式做这件事是可行的,但我对与故事板相关的行为特别感兴趣。例如,对于nib文件,可以在viewDidLoad中使用label.text设置标签的文本。对于序列图像板,这将不起作用,您必须使用ViewWillDisplay。您是如何用多少个视图控制器实例化MyTabBarController的?@Visualization来自一个具有5个视图控制器的序列图像板。可能是序列图像板正在抑制调用。您可以尝试以编程方式设置tabbarcontroller。@谢谢。当然,以编程的方式做这件事是可行的,但我对与故事板相关的行为特别感兴趣。例如,对于nib文件,可以在viewDidLoad中使用label.text设置标签的文本。对于故事板,这将不起作用,你必须使用viewwillbeen。这也是我的怀疑。。。有点不幸的是,它绕过了两个二传手。我想知道是否有其他方法可以连接到设置
viewControllers
的事件中。。。也许KVO:-(KVO可能会起作用。我会先尝试观察属性名称,如果不起作用,则尝试观察带下划线前缀的ivar。然而,你在这里如履薄冰。这种方法将是脆弱的。未来的Apple iOS版本可能会做不同的事,然后你的代码将停止工作。这也是我的怀疑…有点不幸的是,它绕过了这两个设置器。我想知道是否有另一种方法可以连接到设置viewControllers
的事件中…可能是KVO:-(KVO可能会起作用。我会先尝试观察属性名称,如果不起作用,请尝试观察带下划线前缀的ivar。但是,您在这里如履薄冰。这种方法将是脆弱的。未来的Apple iOS版本可能会做不同的事,然后您的代码将停止工作。您好,Marcel,非常感谢您。)ch!这确实是显而易见的解决办法!:)太好了!嗨,马塞尔,非常感谢!这确实是显而易见的解决办法!:)太好了!