Perform segue from another class error cannot find segue
Perform segue from another class error can't find segue
我正在尝试执行将调用另一个 class 而不是 ui 视图的 segue。最终目标是主视图将等待 URL 请求完成以转到下一个视图。
这是我的 ui 观点:
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()
}
}
}
这里是我如何从另一个 class
中调用我的 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 () 没有标识符 'segueToMainController''
实例化一个新的 LoadingViewController
并尝试将其传递到您的 class 函数中没有任何意义。您需要做的是获取对现有 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:
我正在尝试执行将调用另一个 class 而不是 ui 视图的 segue。最终目标是主视图将等待 URL 请求完成以转到下一个视图。
这是我的 ui 观点:
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()
}
}
}
这里是我如何从另一个 class
中调用我的 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 () 没有标识符 'segueToMainController''
实例化一个新的 LoadingViewController
并尝试将其传递到您的 class 函数中没有任何意义。您需要做的是获取对现有 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: