Swift-在闭包内部调用segue

iag*_*omr 5 objective-c ios segue swift 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)
            }
        })
}
Run Code Online (Sandbox Code Playgroud)

预先感谢您,如果需要进一步说明,请告诉我。

欢呼,蒂亚戈

Dav*_*rry 0

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

func signup(username:String, password:String, presentingViewController:UIViewController) {
    ...
        presentingViewController.performSegue("segueToNextScreen")
    ...
}
Run Code Online (Sandbox Code Playgroud)

更好的方法可能是实际传递成功块,然后调用者可以通过执行适当的转场来处理成功。这样,您就不会依赖于任何可能拥有segueToNextScreen方法的调用者,并且将网络接口功能与用户界面功能分开,这总是一个好主意,因为它们确实是非常不同的生物。

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

// in calling ViewController
    signup(username, password) {
        self.performSegue("segueToNextScreen")
    }
Run Code Online (Sandbox Code Playgroud)

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