继承 UITabBarController 和 UINavigationController
Posted
技术标签:
【中文标题】继承 UITabBarController 和 UINavigationController【英文标题】:Subclassing both UITabBarController and UINavigationController 【发布时间】:2014-05-19 05:05:10 【问题描述】:您好,我是 iPhone 开发的新手(使用 ios 7)。基本上我希望我的应用程序响应屏幕旋转(即更改屏幕方向)我的项目同时使用UITabBarController
和UINavigationController
。但是,当我旋转设备时,它不会在名为LoginView.m
的ViewController
中调用“shouldAutorotate
”函数。
因此,我一直遵循here 中的答案,直到它继承了UITabBarController
和UINavigationController
。有人可以向我解释如何在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 中设置视图控制器的委托