Swift - 在闭包内调用segue

5
我试图在闭包内调用一个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)
            }
        })
}

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

谢谢, Tiago


1
你可以使用NSNotificationCenter将UIViewController注册到你从类中发布的通知。 - Fabio Felici
你是否使用了类似于tabBarController的东西? - boidkan
4个回答

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)
        }
    })
}

将"performSegueWithIdentifier"封装在"dispatch_async"内适用于我。


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)
            }
        })
}

忘了提到我没有在UIViewController中调用这个函数,所以关键字“self”不起作用。我正在制作一个“路由器”文件,并希望从那里调用segue,你有任何想法吗?如果我将这个performSegue函数留在UIViewController中并从闭包中调用它,我仍然不知道如何访问它。 - iagomr
signUp是从你的VC内部调用的吗?如果是,那么你可以将你的VC实例传递给signUp函数。 - boidkan
@boidkan 是的。但是我该如何引用 VC 呢? - iagomr
如果signUp()函数在你的视图控制器中被调用,你可以这样做:func signUp(username:String,passwoprd:String,vc:UIViewController){<code here>} 然后像这样调用它 signUp(username,pw,self) 因为self是VC实例的使用方式。 - boidkan

1

在执行performSegue之前,只需调用self,然后您可以在该方法内再次调用self。

SWIFT 5

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

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子类中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接