Swift:从RESTful API进行身份验证后更改ViewController

时间:2016-07-09 01:22:52

标签: ios swift rest authentication swift2

我有一个rails api设置和一个测试用户。我可以登录/注销查看api。

我有一个标签应用程序设置,我有一个LoginViewController设置进行身份验证。我的视图控制器(基本上)看起来像下面的代码。这不起作用。但是,第二个代码块可以正常工作

我猜我在说错了。第一个块执行然后崩溃,***断言失败 - [UIKeyboardTaskQueuewaitUntilAllTask​​sAreFinished] ..我一直在旋转我的车轮几个小时......试着看看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

2 个答案:

答案 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()

中调用您的segue

如果您不确定自己的队列是什么,那么这样做就不会受到伤害。随着您越来越熟悉将您带离主队列的场景,您将意识到何时使用它。无论何时你处于关闭状态并处理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)
}

我在几条评论中加入了你的意见,如果你愿意的话。我相信这将完成这项工作,但请记住,您前进的方向不会从内存中删除前一个屏幕。它在技术上仍然位于新屏幕后面。我不会推荐这个你想要做的事情,但如果你构建一些简单化的东西,它可能不会受到伤害。