不调用UITabBarControllerDelegate的方法

时间:2017-08-23 21:44:29

标签: ios objective-c uitabbarcontroller

我以编程方式创建一个包含5个以上选项卡的UITabBarController(正好是8个子视图控制器)。

我的目的是更改标签的自定义过渡动画。我为UITabbarController设置了一个委托并实现了方法:

- (nullable id <UIViewControllerAnimatedTransitioning>)tabBarController:(UITabBarController *)tabBarController
            animationControllerForTransitionFromViewController:(UIViewController *)fromVC
                                              toViewController:(UIViewController *)toVC  

当我通过发送选择标签时:

[tabbarController setSelectedIndex: 6];
不调用

委托方法。

发送

时,会正确调用委托方法
[tabbarController setSelectedIndex: 3]; 

例如,对于可见标签。

还有一句话:如果当前选择的视图控制器处于可见范围0..3并且下一个视图超出可见范围0..3仍然会调用委托方法。如果当前选择的视图控制器超出可见范围0..3且下一个视图超出可见范围0..3,则不会调用委托方法。而且我丢失了自定义过渡动画。这是我的问题。

我也尝试发送

[tabbarController setSelectedViewController: someViewController];

而不是

[tabbarController setSelectedIndex: 6];

它不起作用。

2 个答案:

答案 0 :(得分:0)

您有太多标签要使用selectedIndex,因为即使屏幕上未显示moreNavigationController,您的其他标签也可能在moreNavigationController中 - 这意味着它们应该返回NSNotFound 1}}使用selectedIndex时。

您应该使用selectedViewController代替per iOS Docs

[tabbarController setSelectedViewController: yourIndexSixViewController];

答案 1 :(得分:0)

我做了棘手的解决方案。

我以分离的数组收集所有8个视图控制器。称之为控制器

首先,我使用控制器的前5项填充 tabbarController.viewcontrollers 。此外还有两种情况:

  1. 用户希望在范围0..4 中看到索引的标签。没有什么可做的,因为我们已经将适当的viewcontrollers设置为 tabbarController.viewcontrollers
  2. 用户希望在范围0..4 之外看到索引的标签。例如,用户想要查看索引为6的选项卡。例如,当前选择的选项卡具有索引2。在这种情况下,我选择0..4范围内的数字,该数字与当前选择的选项卡索引不相等。例如4.此外,我将 tabbarController.viewcontrollers [4] 替换为 controllers [6] 。之后我打电话给

     [tabbarController setSelectedIndex: 4];  
    
  3. 结果我看到 controllers [6] 并且正确调用了委托的方法。