Swift以编程方式删除选项卡栏

时间:2014-12-15 01:10:12

标签: ios swift uitabbarcontroller segue

我的iOS 8应用程序的主导航是一个带有3个标签的标签栏。我还有一个登录界面,它是一个UIViewController,底部不应该有标签。如果我检测到用户未登录或已选择注销,我只能从正常流程以编程方式访问登录屏幕。当我使用以下代码显示登录屏幕时,我不确定如何从屏幕上删除标签:

let loginView = self.storyboard?.instantiateViewControllerWithIdentifer("Login") as UIViewController
self.presentViewController(loginView, animate: true, completion: nil)

我尝试将tabBar.hidden属性设置为true但没有结果。我也尝试修改故事板以设置" Bottom Bar"到"无"并检查了"在推送"上隐藏底栏。

1 个答案:

答案 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. 
    }
}