从另一个类中执行segue错误无法找到segue

时间:2018-01-08 22:18:07

标签: ios swift uiviewcontroller segue

我正在尝试执行一个segue,它将调用另一个类而不是ui视图。最终目标是主视图将等待完成URL请求以转到下一个视图。

这是我的观点:

class LoadingViewController: UIViewController {

     @IBOutlet weak var activityIndicator: UIActivityIndicatorView!

     override func viewDidLoad() {
          super.viewDidLoad()
     }

     override func viewDidAppear(_ animated: Bool) {
          super.viewDidAppear(animated)

          CardList.retrieveAllCards()
     }

     override func didReceiveMemoryWarning() {
          super.didReceiveMemoryWarning()
     }

     func goToNextView() {
          performSegue(withIdentifier: "segueToMainController", sender:      LoadingViewController.self)        
     }

    class ShowNext {
         class func view(fromViewController: LoadingViewController) {
               fromViewController.goToNextView()
         }
    }
}

在这里我如何从其他类中调用我的segue

 let task = session.dataTask(with: request){
        data,response,error in
        do
        {
            if let jsonResult = try JSONSerialization.jsonObject(with: data!, options: []) as? NSDictionary {
                jsonResultEnd = jsonResult
                //print("SUCCESS:\(jsonResult)")

                LoadingViewController.ShowNext.view(fromViewController: LoadingViewController())
                print("loading ended")
            }
        } catch let error as NSError {
            print("ERROR request manager: \(error.localizedDescription)")
        }
    }

这是错误

***由于未捕获的异常终止应用程序' NSInvalidArgumentException',原因:' Receiver()没有带标识符的segue' segueToMainController''

1 个答案:

答案 0 :(得分:0)

实例化新的LoadingViewController并尝试将其传递到您的类func中没有任何意义。您需要做的是获取对现有LoadingViewController的引用,并在其上调用goToNextView()

有很多方法可以做到这一点,但有一种方法是将您的LoadingViewController引用作为另一个视图的变量传递,当您的异步调用完成后,您可以调用self.loadingViewController.goToNextView()

您还可以使用NotificationCenter从您的视图广播此异步调用已完成,并在LoadingViewController上观察该通知并使用该事件触发segue:

使用LoadingViewController viewDidLoad方法:

NotificationCenter.default.addObserver(self, selector: #selector(goToNextView), name: Notification.Name("loadingComplete"), object: nil)

在您的其他视图的异步回调中:

NotificationCenter.default.post(name: Notification.Name("loadingComplete"), object: