Swift - 在闭包内调用segue

时间:2015-02-20 14:30:35

标签: ios objective-c swift segue alamofire

我试图在一个闭包内调用一个segue,我似乎无法使其工作。问题是我不知道如何进行“performSegueWithIdentifier”调用,因为我不能在这里使用关键字“self”。

这是在UIViewController之外完成的,所以我不知道如何在不使用关键字“self”的情况下调用“performSegueWithIdentifier”。

所以我需要创建调用方法的对象,但是如何以及对象是什么?它是视图控制器吗?在故事板上?或者它在哪里?

func signUp (username: String, password: String) {
    Alamofire.request(.POST, "https://test.xyz.de/api/v1/public/user", parameters:["username" : username, "password": password], encoding: .JSON)
        .responseJSON({ (_, _, JSON, error) -> Void in
            println("Response: \(JSON)")
            if error == nil {
                self.performSegueWithIdentifier("segueToNextScreen", sender: self) // Problem!!
            } else {
                println(error)
            }
        })
}

提前致谢,如果您需要进一步解释,请告诉我。

干杯, 蒂亚戈

4 个答案:

答案 0 :(得分:3)

func signUp (username: String, password: String) {

Alamofire.request(.POST, "https://test.xyz.de/api/v1/public/user", parameters:["username" : username, "password": password], encoding: .JSON)
    .responseJSON({ (_, _, JSON, error) -> Void in
        println("Response: \(JSON)")

        if error == nil {

            dispatch_async(dispatch_get_main_queue()){
                self.performSegueWithIdentifier("segueToNextScreen", sender:self)
                }
        } 
        else {

            println(error)
        }
    })
}

封装" performSegueWithIndentifier"在" dispatch_async"为我工作。

答案 1 :(得分:1)

你可以编写一个函数,你将在块中调用它来执行seuge。这样您就可以使用self关键字:

func performSegue(identifier:String){
  self.performSegueWithIdentifier(identifier, sender: self)
}

func signUp (username: String, password: String) {
    Alamofire.request(.POST, "https://test.xyz.de/api/v1/public/user", parameters:["username" : username, "password": password], encoding: .JSON)
        .responseJSON({ (_, _, JSON, error) -> Void in
            println("Response: \(JSON)")
            if error == nil {
                self.performSegue("segueToNextScreen") // Problem!!
            } else {
                println(error)
            }
        })
}

答案 2 :(得分:0)

如果从视图控制器外部调用它,问题就变成了如何调用它?最合适的解决方案可能是添加一个参数,该参数接受调用它的视图控制器,因为任何segue只能相对于该视图控制器发生。

func signup(username:String, password:String, presentingViewController:UIViewController) {
    ...
        presentingViewController.performSegue("segueToNextScreen")
    ...
}

更好的方法可能是实际传递成功块,然后调用者可以通过执行适当的segue来处理成功。这样你不依赖任何可能的调用者segueToNextScreen方法和你的分离网络接口功能与用户界面功能,总是一个好主意,因为他们真的是非常独特的生物。

func signup(username:String, password:String, success:()->()) {
    ...
        success()
    ...
}

// in calling ViewController
    signup(username, password) {
        self.performSegue("segueToNextScreen")
    }

当然,最明显的解决方案可能就是将此代码放入您的UIViewController子类中。

答案 3 :(得分:0)

只需在 performSegue 之前调用 self 就可以在方法内部再次调用 self

SWIFT 5

self.performSegue(withIdentifier: "resultViewController", sender: self)