我有一个rails api设置和一个测试用户。我可以登录/注销查看api。
我有一个标签应用程序设置,我有一个LoginViewController设置进行身份验证。我的视图控制器(基本上)看起来像下面的代码。这不起作用。但是,第二个代码块可以正常工作
我猜我在说错了。第一个块执行然后崩溃,***断言失败 - [UIKeyboardTaskQueuewaitUntilAllTasksAreFinished] ..我一直在旋转我的车轮几个小时......试着看看segues。等等什么都有帮助!!!
//DOES NOT WORK //
class LoginViewController: UIViewController {
@IBOutlet weak var email: UITextField!
@IBOutlet weak var password: UITextField!
@IBAction func Login(sender: AnyObject) {
func switchToTabs() {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let tabBarController = storyboard.instantiateViewControllerWithIdentifier("TabBarController") as! UITabBarController
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDelegate.window?.rootViewController = tabBarController
}
let authCall = PostData()
var authToken = ""
authCall.email = email.text!
authCall.password = password.text!
authCall.forData { jsonString in
authToken = jsonString
if(authToken != "") {
switchToTabs()
}
}
}
// SAME CLASS THAT DOES WORK//
class LoginViewController: UIViewController {
@IBOutlet weak var email: UITextField!
@IBOutlet weak var password: UITextField!
@IBAction func Login(sender: AnyObject) {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let tabBarController = storyboard.instantiateViewControllerWithIdentifier("TabBarController") as! UITabBarController
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDelegate.window?.rootViewController = tabBarController
}
我的问题是,为什么当我不使用我的api时,我似乎可以导航到新视图,但是当我收到我的身份验证令牌时...我无法登录。
请原谅丑陋的代码..这是我第一天用swift
答案 0 :(得分:2)
每当你每个人都做任何改变关闭内部UI的事情或任何甚至可能脱离主队列的事情时,都将它包含在这个声明中。
dispatch_async(dispatch_get_main_queue()) {
//the code that handles UI
}
这包括在闭包内部所有代码的所有代码
authCall.forData { jsonString in
authToken = jsonString
if(authToken != "") {
switchToTabs()
}
}
如果你这样写它会起作用
authCall.forData {
jsonString in
authToken = jsonString
if(authToken != "") {
dispatch_async(dispatch_get_main_queue()) {
switchToTabs()
}
}
}
然后在switchToTabs()
如果您不确定自己的队列是什么,那么这样做就不会受到伤害。随着您越来越熟悉将您带离主队列的场景,您将意识到何时使用它。无论何时你处于关闭状态并处理UI,都可以安全地下注。显然任何异步都会导致它。只需将performSegueWithIdentifier
放在其中,就可以了。
答案 1 :(得分:0)
如果你从追加到LoginViewController的视图控制器在故事板上创建一个segue,那么你单击segue就可以给它一个标识符。然后你只需要调用performSegueWithIdentifier(“identifierName”,sender:nil),并且switchToTabs()中没有其他代码是必需的。
如果你想继续沿着你想要召唤视觉控制器的路线走下去,那么我认为你缺少的就是这些线路。
在课堂下方使用此课程。
private extension UIStoryboard {
class func mainStoryboard() -> UIStoryboard { return UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()) }
class func tabBarController() -> UITabBarController? {
return mainStoryboard().instantiateViewControllerWithIdentifier("TabBarController") as? UITabBarController
}
}
然后为此
更改switchToTabs()函数func switchToTabs() {
let tabBarController = UIStoryboard.tabBarController()
view.addSubview(tabBarController!.view)
//line below can be altered for different frames
//tabBarController!.frame = self.frame
addChildViewController(tabBarController!)
tabBarController!.didMoveToParentViewController(self)
//line below is another thing worth looking into but doesn't really correlate with this
//self.navigationController!.pushViewController(tabBarController!, animated: true)
}
我在几条评论中加入了你的意见,如果你愿意的话。我相信这将完成这项工作,但请记住,您前进的方向不会从内存中删除前一个屏幕。它在技术上仍然位于新屏幕后面。我不会推荐这个你想要做的事情,但如果你构建一些简单化的东西,它可能不会受到伤害。