2016-05-04 23 views
-2

iOSアプリケーションには、同様の機能を備えたカスタマイズされたアラートグループが必要です。それらをクラスにパックすることができますので、すべてのUIViewControllerに貼り付けをコピーする必要はありませんか?カスタマイズされたUIAlertControllerを1つのクラスにパックする(swift)にはどうすればいいですか?

func displayAlert(msg:String, handler: (UIAlertAction) -> Void){...} 
func successMsg (msg: String){...} 
func failMsg(msg: String){...} 

私はのUIViewControllerのサブクラス(AlertViewController)にパックしようとしていたが、その後、実行時エラーが発生しました: "<に< ... UIAlertController ...>を提示しようと... UIAlertControllerを.. >ビューは窓の階段にはない! " myViewControllerで

コード:

@IBAction func leave() { 
    let date = getDate() 
    let datePresent = dateForPresent() 
    if stID == nil || name == nil { 
     return 
    } else { 
     alert.displayAlert("\(datePresent)"){action in 
      self.request.getResult(self.request.leavePara(self.stID!, date: date, name: self.name!)){ (result) in 
       dispatch_async(dispatch_get_main_queue(), { 
        let flag = result["result","out_Flag"].int 
        print(result) 
        let msg = result["result","out_nszRtn"].string! 
        if flag == 0 { 
         self.alert.successMsg(msg){ action in 
          self.performSegueWithIdentifier("personUnwind", sender: self) 
         } 
        }else { 
         self.alert.failMsg(msg) 
        } 
       }) 
      } 
     } 
    } 
} 
+1

だから警告を誘発したコードを表示! – matt

+0

警告を修正する方法は実際には気にしませんが、そのようなことを行うための標準的な方法は何かを尋ねるだけです。 –

答えて

5

このコードを使用してください。

func displayAlertWithMessage(title: String, message: string){ 
    let ac = UIAlertController(title: title, message: message, preferredStype: .Alert) 
    ac.addAction(UIAlertAction(title:"OK", style: .Default, handler: nil)) 
    let rootVC = UIApplication.sharedApplication().keyWindow?.rootViewController 
    rootVC?.presentViewController(ac, animated: true){} 
} 

特定のView Controllerに対してアラートを表示する場合は、この機能を使用できます。

func displayAlertWithMessage(viewController: UIViewController, title: String, message: string){ 
    let ac = UIAlertController(title: title, message: message, preferredStype: .Alert) 
    ac.addAction(UIAlertAction(title:"OK", style: .Default, handler: nil)) 
    viewController.presentViewController(ac, animated: true){} 
} 

このコードでは、このコードを呼び出すことができます。

displayAlertWithMessage(self, animated: true, completion: nil) 
+0

これは私が望むものに近いですが、私はそれがrootViewControllerではなく、特定のUIViewController(現時点では画面に表示されているUIViewController)に存在することを期待していました。それ、どうやったら出来るの?コードは誰にも関係なく、私のアプリの最初のVCにALERTメッセージを表示しているようです。 –

+0

@FateRiddleこんにちは、私は私の答えを編集しました。 –

+0

それは、感謝の男が動作します!好奇心で、 'UIApplication.sharedApplication().keyWindow?.rootViewController'コールは何ですか? –

1

私はあなたがなっていたエラーが約だったかわからないんだけど、あなたはサブクラスを避けたい場合は、あなたのニーズに合わせてカスタマイズオブジェクトを返しますUIAlertViewControllerイニシャライザを実装することができます。例えば

、以下では、グローバルレベルで記述できます。

extension UIAlertController { 

    enum AlertMessageID { 
     case SaveFailed 
    } 

    convenience init(messageID: AlertMessageID) { 
     switch messageID { 
      case .SaveFailed: 
       self.init(title: "Oops", message: "The save failed.", preferredStyle: .Alert) 
     } 
     let okayButton = UIAlertAction(title: "Okay", style: .Default, handler: nil) 
     self.addAction(okayButton) 
    } 

} 
+0

ありがとう、これは問題を解決する素晴らしい方法です。私はこのコードを書くべきですか? –

+0

このコードはどこにでも書くことができ、グローバルレベルで書かれているだけです。しかし、それをSwiftファイルに入れることができます。 –

関連する問題