如何在用户操作后添加标签栏
How to add a tabbar after a user action
我有一个应用程序,当用户未登录时不必显示任何选项卡。我在使用此功能时遇到了很多问题。首先,我在登录屏幕后将视图嵌入到选项卡栏控制器中,一切都显示正常,除了我实现登录功能时。由于这是一个异步调用,我不得不等到凭据得到验证。我无法在 shouldPerformSegue
方法或苹果提供的任何其他方法中执行此操作,因为在完成异步操作之前您无法阻塞主线程,因此必须在 IbAction 中以编程方式完成 segue :
@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 控制器时,最好的办法确实是看到针对这种情况的最佳方法。
谢谢大家
我想你可以采取另一种方法。使登录故事情节和您的应用故事情节截然不同。
为您的登录过程准备一个故事板,为您的家(或任何您喜欢的)准备另一个故事板,并在 AppDelegate
中管理它们。
我是这样做的:
if /* user must log in */ {
self.window?.rootViewController = loginStoryboard?.instantiateInitialViewController()
self.window?.makeKeyAndVisible()
}
else {
self.window?.rootViewController = homeStoryboard?instantiateInitialViewController()
self.window?.makeKeyAndVisible()
}
将此代码放入方法中(例如称为 manageRootViewController()
)并在应用启动时或登录后调用它。 (您也可以根据需要添加自定义动画)
我有一个应用程序,当用户未登录时不必显示任何选项卡。我在使用此功能时遇到了很多问题。首先,我在登录屏幕后将视图嵌入到选项卡栏控制器中,一切都显示正常,除了我实现登录功能时。由于这是一个异步调用,我不得不等到凭据得到验证。我无法在 shouldPerformSegue
方法或苹果提供的任何其他方法中执行此操作,因为在完成异步操作之前您无法阻塞主线程,因此必须在 IbAction 中以编程方式完成 segue :
@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 控制器时,最好的办法确实是看到针对这种情况的最佳方法。 谢谢大家
我想你可以采取另一种方法。使登录故事情节和您的应用故事情节截然不同。
为您的登录过程准备一个故事板,为您的家(或任何您喜欢的)准备另一个故事板,并在 AppDelegate
中管理它们。
我是这样做的:
if /* user must log in */ {
self.window?.rootViewController = loginStoryboard?.instantiateInitialViewController()
self.window?.makeKeyAndVisible()
}
else {
self.window?.rootViewController = homeStoryboard?instantiateInitialViewController()
self.window?.makeKeyAndVisible()
}
将此代码放入方法中(例如称为 manageRootViewController()
)并在应用启动时或登录后调用它。 (您也可以根据需要添加自定义动画)