【问题标题】:Swift - Call segue inside of a closureSwift - 在闭包内调用 segue
【发布时间】:2015-02-20 14:30:34
【问题描述】:

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

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

干杯, 蒂亚戈

【问题讨论】:

  • 您可以使用 NSNotificationCenter 将 UIViewController 注册到您将从班级发布的通知中。
  • 你在使用 tabBarController 之类的东西吗?

标签: ios objective-c swift segue alamofire


【解决方案1】:
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)
        }
    })
}

在“dispatch_async”中封装“performSegueWithIndentifier”对我有用。

【讨论】:

    【解决方案2】:

    您可以编写一个函数,您将在执行 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 中并从闭包中调用它,我仍然不知道如何访问它。
    • 您的 VC 中是否调用了注册?如果是这样,您可以将您的 VC 实例传递给 signUp。
    • @boidkan 是的。但那我该如何参考 VC 呢?
    • @iagomr 好吧,如果在您的 vc 中调用 signUp(),那么您可以执行以下操作:func signUp(username:String,passwoprd:String,vc:UIViewController){<code here>} 并将其称为 signUp(username,pw,self),因为 self 将是您正在使用 VC 的实例.
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      SWIFT 5

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

      【讨论】:

        猜你喜欢
        • 2019-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多