如何在用户操作后添加标签栏
Posted
技术标签:
【中文标题】如何在用户操作后添加标签栏【英文标题】:How to add a tabbar after a user action 【发布时间】:2016-06-21 07:18:01 【问题描述】:我的应用程序在用户未登录时不必显示任何选项卡。我在使用此功能时遇到了很多问题。首先,我在登录屏幕之后将视图嵌入到选项卡栏控制器中,一切都显示正常,除非我实现了登录功能。由于这是一个异步调用,我不得不等到凭据得到验证。我无法在shouldPerformSegue
方法或苹果提供的任何其他方法中执行此操作,因为在异步内容完成之前您无法阻塞主线程,因此必须在 IbAction 中以编程方式完成转场:
@IBAction func doLogin(sender: AnyObject)
userIsLogged = false
let apiCall = webApi()
apiCall.callCheckIsUserLogged(nil, password : self.passwordField.text, email: self.mailField.text) (ok) in
if ok
if(userIsLogged == true)
dispatch_async(dispatch_get_main_queue())
self.performSegueWithIdentifier("loginUser", sender: self)
else
NSOperationQueue.mainQueue().addOperationWithBlock
print("User not logged in")
self.alert.message = "Please enter valid credentials"
self.displayAlert()
但这让我想到了另一个问题:在程序化 segue 之后,我的标签栏控制器消失了,经过一段时间的阅读,似乎避免这种情况的唯一方法是将标签栏控制器嵌入到导航控制器中。所以我做到了,但现在,我遇到了许多新问题。首先,我有两个导航控制器,一个位于项目的最开始,另一个是我嵌入到标签栏控制器的新控制器。一张图比我的话更能说明这一点:
现在我有两个导航控制器,我不知道如何隐藏最上面的那个。已经试过了:
self.navigationController?.navigationItem.hidesBackButton = true
但是隐藏了箭头,我需要隐藏另一个导航控制器。但是最好的事情确实是看到这种情况下的最佳方法,当您想在项目中间添加一个嵌入到导航控制器中的 tabBar 控制器时。 谢谢大家
【问题讨论】:
【参考方案1】:我想你可以采取另一种方法。使登录故事情节和您的应用故事情节截然不同。
为您的登录过程准备一个故事板,为您的家庭(或任何您喜欢的)准备另一个故事板,并在AppDelegate
中管理它们。
这就是我的做法:
if /* user must log in */
self.window?.rootViewController = loginStoryboard?.instantiateInitialViewController()
self.window?.makeKeyAndVisible()
else
self.window?.rootViewController = homeStoryboard?instantiateInitialViewController()
self.window?.makeKeyAndVisible()
将此代码放入一个方法中(例如称为manageRootViewController()
)并在应用启动时或登录后调用它。 (您也可以根据需要添加自定义动画)
【讨论】:
看起来是一个很好的方法,但我有一个问题,我的项目有点高级,我需要将所有“注销”窗口复制/粘贴到新的故事板,这听起来不错,但是storyboard不允许复制粘贴...所以如果没有其他解决方案,我会采取那个,但我想知道是否真的没有其他解决方案? 故事板不允许复制/粘贴是什么意思?我一直都这样做?。但无论如何,如果你为 ios9.0+ 部署,storyboards 支持storyboard reference。所以你可以refactor storyboards。这是区分它们的最简洁的方法,但我之前复制/粘贴了故事板(并且刚刚尝试过),也许你做错了什么。 但是要回答“添加标签栏的其他解决方案”,您也可以从一开始就拥有UITabBarController
,只要您感觉最好就隐藏/取消隐藏标签栏。以上是关于如何在用户操作后添加标签栏的主要内容,如果未能解决你的问题,请参考以下文章
vue-admin-template 如何添加快捷导航(标签导航栏)