我的iOS 8应用程序的主导航是一个带有3个标签的标签栏。我还有一个登录界面,它是一个UIViewController,底部不应该有标签。如果我检测到用户未登录或已选择注销,我只能从正常流程以编程方式访问登录屏幕。当我使用以下代码显示登录屏幕时,我不确定如何从屏幕上删除标签:
let loginView = self.storyboard?.instantiateViewControllerWithIdentifer("Login") as UIViewController
self.presentViewController(loginView, animate: true, completion: nil)
我尝试将tabBar.hidden
属性设置为true
但没有结果。我也尝试修改故事板以设置" Bottom Bar"到"无"并检查了"在推送"上隐藏底栏。
答案 0 :(得分:1)
登录屏幕的行为可能与主屏幕不同。因此,您可能希望为登录屏幕创建另一个ViewController。
我尝试将tabBar.hidden属性设置为true,但没有结果。
加载标签栏结束了吗?在您的loginView hidden=YES
之后调用viewDidLoad
。
修改强>
调用self.presentViewController(loginView, ...)
后,UITabBarController的视图将从UIWindow中删除,loginView的视图将被插入到UIWindow的子视图中。因此标签栏现在是不可见的。
您可以使用XCode6的“查看调试”功能来了解视图层次结构。您也可以使用UIViewController的recursiveDescription()
方法。
/* UIViewExtension.h */
@interface UIView(MyExtension)
- (NSString*)recursiveDescription; //This is hidden API so need the declaration.
@end
/* YourViewController.swift */
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
println(self.tabBarController?.view.superview?.recursiveDescription())
// Here, the view of tabBarController is subview of UIWindow.
}
@IBAction func testButtonPressed(sender: UIButton) {
self.presentViewController(viewController, animated: true) { () -> Void in
println(self.tabBarController?.view.superview?.recursiveDescription())
println(loginView.view.superview?.superview?.recursiveDescription())
//Now, TabBarController's view is not subView of UIWindow.
}
}