Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UITabBarController子类从不调用SetViewController:或SetViewController:动画:_Ios_Objective C_Uitabbarcontroller_Subclass_Uistoryboard - Fatal编程技术网

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!这确实是显而易见的解决办法!:)太好了!嗨,马塞尔,非常感谢!这确实是显而易见的解决办法!:)太好了!