继承 UITabBarController 和 UINavigationController

Posted

技术标签:

【中文标题】继承 UITabBarController 和 UINavigationController【英文标题】:Subclassing both UITabBarController and UINavigationController 【发布时间】:2014-05-19 05:05:10 【问题描述】:

您好,我是 iPhone 开发的新手(使用 ios 7)。基本上我希望我的应用程序响应屏幕旋转(即更改屏幕方向)我的项目同时使用UITabBarControllerUINavigationController。但是,当我旋转设备时,它不会在名为LoginView.mViewController 中调用“shouldAutorotate”函数。

因此,我一直遵循here 中的答案,直到它继承了UITabBarControllerUINavigationController。有人可以向我解释如何在LoginView.m 类或整个项目中添加(即引用它)方向行为。

非常感谢您的帮助。

谢谢

【问题讨论】:

有人吗?请帮帮我.. 请详细说明您想要实现的目标。为根视图控制器调用 shouldAutorotate 是正确的,在您的情况下,根视图控制器是 TabBarController 或 NavigationController,但我们需要有关所需结果的更多详细信息 @Argent 基本上我想改变屏幕方向相对于屏幕旋转。我有一个名为 LoginView.m 的视图,它扩展了“UIViewController”。我还在 AppDelegate.m 中看到了 UITabBarController 和 UINavigationController 属性。请帮忙 如果您希望视图自动旋转,并且您正在使用开箱即用的基本 ios 控件。只需在 xcode 中的应用程序的项目文件中选择您想要支持的设备方向 @Argent,我已经做到了,通过在 plist 文件中包含肖像(底部主页按钮)、肖像(顶部主页按钮)、横向(左侧主页按钮)和横向(右侧主页按钮),但是没有成功。还是有其他办法? 【参考方案1】:

在您的子类 UItabbarcontroller 中

- (BOOL)shouldAutorotate 

    UINavigationController *navView = (UINavigationController *)[self selectedViewController];
    //Get the selected current tab viewcontroller. I guess you are having a Navigationcontroller    

    UIViewController *vc = [navView.viewControllers objectAtIndex:0];  
    //Fetch root viewcontroller of your navigationcontroller

    return [self checkOrientationForViewController:vc];



-(BOOL) checkForViewsForViewController : (UIViewController *)vc

    if([vc isKindOfClass:[FirstViewController class]])

        FirstViewController *vc1 = (FirstViewController *)vc;

        return [vc1 shouldAutorotate];
    
    if([vc isKindOfClass:[SecondViewController class]])

        SecondViewController *vc2 = (SecondViewController *)vc;

        return [vc2 shouldAutorotate];
    
    if([vc isKindOfClass:[ThirdViewController class]])

        ThirdViewController *vc3 = (ThirdViewController *)vc;

        return [vc3 shouldAutorotate];
    
    return YES;

在各自的视图控制器中实现 shouldAutorotate 方法

【讨论】:

感谢您的宝贵时间。我是否必须在 AppDelegate 文件中引用它来通知应用我正在使用这些自定义类? 是的,你必须导入它 AppDelegate 你能告诉我怎么做吗?这就是我困惑的地方。再次感谢 你能再解释一下吗。你到底想要什么。 如何在 AppDelegate.m 以及特定控制器中引用子类 UItabbarcontroller? (在我的情况下是 LoginView.m)。我对 iPhone 开发很陌生。请帮助【参考方案2】:

除了使用委托,您还可以使用

- (NSUInteger)supportedInterfaceOrientations

UINavigationController 和 UITabBarController 询问他们的子视图控制器他们支持哪些界面方向。因此,您可以在 LoginView.m 中实现“- (NSUInteger)supportedInterfaceOrientations”并返回适当的界面方向。

您还需要编辑 Info.plist 并添加支持的界面方向。您可以通过打开项目视图使用 Xcode 执行此操作。也可以看看Apples documentation on supporting interface orientations

【讨论】:

谢谢,我会试试的..]【参考方案3】:

值得知道的是,在 UINavigationcontroller 和 UITabbarController 中还有委托方法可以让您在运行时处理旋转:

- (UIInterfaceOrientation)navigationControllerPreferredInterfaceOrientationForPresentation:(UINavigationController *)navigationController

Ref doc.

- (NSUInteger)tabBarControllerSupportedInterfaceOrientations:(UITabBarController *)tabBarController

Ref doc.

即使 Apple 已经删除了不要继承 Nav 和 Tabbar 控制器的建议,随着时间的推移,使用委托将是最可靠的解决方案

【讨论】:

以上是关于继承 UITabBarController 和 UINavigationController的主要内容,如果未能解决你的问题,请参考以下文章

UITabBarController 自定义

为啥 UITabBarController 返回“..应该支持至少一个方向”消息?

UITabBarController中的坑

在 UITabbarController 中设置视图控制器的委托

如果我使用 UITabBarController,是不是需要在所有屏幕中添加导航栏项目?

iOS 7 - 呈现模式视图控制器选择 UITabBarController 中的第一个选项卡