我试图在一个闭包内调用一个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)
}
})
}
提前致谢,如果您需要进一步解释,请告诉我。
干杯, 蒂亚戈
答案 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)