Swift - 在闭包内调用 segue
Swift - Call segue inside of a closure
我试图在闭包内调用 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)
}
})
}
在此先致谢,如果您需要进一步解释,请告诉我。
干杯,
蒂亚戈
您可以编写一个函数,您将在执行 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)
}
})
}
如果这是从视图控制器外部调用的,那么问题就变成了如何调用它?最合适的解决方案可能是添加一个参数,该参数采用从中调用它的视图控制器,因为任何 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 子类中。
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" 中对我有用。
只要在performSegue之前调用self,就可以在方法内部再次调用self
SWIFT 5
self.performSegue(withIdentifier: "resultViewController", sender: self)
我试图在闭包内调用 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)
}
})
}
在此先致谢,如果您需要进一步解释,请告诉我。
干杯, 蒂亚戈
您可以编写一个函数,您将在执行 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)
}
})
}
如果这是从视图控制器外部调用的,那么问题就变成了如何调用它?最合适的解决方案可能是添加一个参数,该参数采用从中调用它的视图控制器,因为任何 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 子类中。
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" 中对我有用。
只要在performSegue之前调用self,就可以在方法内部再次调用self
SWIFT 5
self.performSegue(withIdentifier: "resultViewController", sender: self)