2017-07-17 11 views
0

シングルトンクラスを使用してネットワーク応答を検証しています。関数(validResponse())の中で私はシングルトンを呼び出していますが、エラーが発生したことをユーザーに知らせるためにアラートボックスをポップアップする別の関数を呼び出します。私のシングルトンクラスの内部シングルトンでUIViewControllerを取得するには?

機能:

func validResponse(data: Data?, response: URLResponse?, error: Error?, viewController: UIViewController, context: String?) -> Bool { 
    ... 
    DispatchQueue.main.async { 
      AlertHelper.showAlertWrapper(viewController: viewController, alertTitle: "Error", alertMessage: self.genericError) 
     } 
} 

AlertHelperコード:validResponse()を呼び出す

class AlertHelper { 
    static func showAlertWrapper(viewController: UIViewController, alertTitle: String, alertMessage: String) { 
     let alertController = UIAlertController(title: alertTitle, message: alertMessage, preferredStyle: .alert); 

     let okAction = UIAlertAction(title: "OK", style: .default, handler: nil); 
     alertController.addAction(okAction); 

     viewController.present(alertController, animated: true, completion: nil); 
    } 
} 

let result = self.networkHelper.validResponse(data: data, response: response, error: error, viewController: self, context: "Delete section") 

上記インスタンスselfでは、仕事に行くされていません、と私はfigurまで一時的にそこにある何をすべきかshowAlertWrapperのようにUIViewControllerviewControllerに渡すことができると私は理解しています。しかし、これはちょっと面倒です。

シングルトンクラスの現在のビューコントローラを参照できる方法はありますか?validResponse()に渡す必要はありませんか?

+0

私は警告を表示するには、ネットワークヘルパーの仕事ではないことを示唆しています。完了ハンドラを介してエラーを返すだけで、必要に応じてそのクラスに警告を表示させる必要があります。 – Paulw11

+0

@ Paulw11ああ、良い点。私はヘルパークラスを改作します。 – toast

答えて

0

を行うだろうあなたのアプリに表示されます。シングルトンがエラーを表示したいときに一番上のView Controllerを取得することで、これを行うことができます。

class AlertHelper { 
    static func showAlertWrapper(alertTitle: String, alertMessage: String) { 
     let alertController = UIAlertController(title: alertTitle, message: alertMessage, preferredStyle: .alert); 

     let okAction = UIAlertAction(title: "OK", style: .default, handler: nil); 
     alertController.addAction(okAction); 

     if var topController = UIApplication.sharedApplication().keyWindow?.rootViewController { 
      while let presentedViewController = topController.presentedViewController { 
       topController = presentedViewController 
      } 

      // viewController should now be your topmost view controller 
      viewController.present(alertController, animated: true, completion: nil); 
     } 
    } 
} 

そして、あなたのshowAlertWrapperを呼び出す:

AlertHelper.showAlertWrapper(alertTitle: "Error", alertMessage: self.genericError) 
1

回避策と多分swiftier方法がのUIViewControllerでshowAlertWrapperを持っているだろう:

extension UIViewController { 
func showAlertWrapper(title: String, message: String) { 
     let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert); 

     let okAction = UIAlertAction(title: "OK", style: .default, handler: nil); 
     alertController.addAction(okAction); 

     present(alertController, animated: true, completion: nil); 
    } 
} 

次に、あなただけのあなたは現在最上位のビューコントローラを取得したいことがあり

DispatchQueue.main.async { 
      viewController.showAlertWrapper(title: "Error", message: self.genericError) 
     } 
+0

ああ、私もこのやり方が好きで、それに同意するのはおそらくもっと良い方法なので、私もあなたに投票しました。ありがとう。 – toast

関連する問題