web-dev-qa-db-ja.com

Swiftアラートのベストプラクティスを表示する

アプリにはさまざまなコントローラーがあり、すべて検証が必要です。検証が失敗した場合、エラーを含むアラートを表示したいと思います。これを行うためのベストプラクティス/デザインパターンはありますか?次のように、ヘルパークラスで静的関数を簡単に作成できます。

static func displayAlert(message: String, buttonTitle: String, vc: UIViewController)
{
    let alertController = UIAlertController(title: "", message: message, preferredStyle: .Alert)

    let OKAction = UIAlertAction(title: buttonTitle, style: .Default, handler: nil)
    alertController.addAction(OKAction)

    vc.presentViewController(alertController, animated: true, completion: nil)
}

しかし、その後、View Controllerを渡す必要があります。これは悪い習慣のようです。通知を撃ち落として観察することもできますが、それはやり過ぎのようです。私はこれを考え直していますか、またはこのようなものを処理するためのより受け入れられる方法がありますか?

26
Ryan Bobrowski

最終的に、UIViewControllerの拡張機能を作成し、そこでアラート関数を作成しました。

extension UIViewController {

  func alert(message: String, title: String = "") {
    let alertController = UIAlertController(title: title, message: message, preferredStyle: .Alert)
    let OKAction = UIAlertAction(title: "OK", style: .Default, handler: nil)
    alertController.addAction(OKAction)
    self.presentViewController(alertController, animated: true, completion: nil)
  }

}
52
Ryan Bobrowski

スイフト4

これが欲しいので、完全に拡張しました。したがって、プロジェクト内に新しいSwift=ファイルを作成します。このファイルには、次のコードを配置します。

import UIKit

extension UIViewController {

    func presentAlertWithTitle(title: String, message: String, options: String..., completion: @escaping (Int) -> Void) {
        let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
        for (index, option) in options.enumerated() {
            alertController.addAction(UIAlertAction.init(title: option, style: .default, handler: { (action) in
                completion(index)
            }))
        }
        self.present(alertController, animated: true, completion: nil)
    }
}

次に、非常に多くの人々が実際に見せないそれを使用することは、私のような初心者にとって混乱を招く可能性があります。

presentAlertWithTitle(title: "Test", message: "A message", options: "1", "2") { (option) in
    print("option: \(option)")
    switch(option) {
        case 0:
            print("option one")
            break
        case 1:
            print("option two")
        default:
            break
    }
}
25
Sigex

https://stackoverflow.com/a/30714429/682218 のitstrueimryanからの元の回答として

Swift 3:の更新

extension UIViewController {

    func alert(message: String, title: String = "") {
        let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
        let OKAction = UIAlertAction(title: "OK", style: .default, handler: nil)
        alertController.addAction(OKAction)
        self.present(alertController, animated: true, completion: nil)
    }
}
11
Chris Herbst

Krakendevの記事で、この問題に対するより良い答えを見つけたかもしれません: https://krakendev.io/blog/subclassing-can-suck-and-heres-why

アイデアは、プロトコル指向プログラミングを使用して、UIViewControllers専用のデフォルトのアラート実装を作成することです。

protocol Alertable {
    func issueAlert()
}

extension Alertable where Self: UIViewController {
    func issueAlert() {
        // alert code here
    }
}

そのように、Alertableに準拠するすべてのUIViewControllerには、独自の実装を定義することなくissueAlert()メソッドが使用可能になります。

そしてもちろん、issueAlert関数のパラメーターも定義できます。

extension Alertable where Self: UIViewController {
    func issueAlert(title: "Default Title", message: String = "Default Message") {
        // alert code here
    }
}

したがって、View Controllerは次のいずれかを実行できます。

issueAlert()

または

issueAlert(title: "Error", message: "Something went wrong")

私が考えることができるこのアプローチの2つの利点は、クラス定義でアラート可能なプロトコルを見るだけでView Controllerがこのメソッドにアクセスできるかどうかを知っていることです。カスタム機能を提供したい場合、個々のView Controllerはこのメソッドをオーバーライドできます。もちろん、Alertableコントラクトをメソッドパラメーターとして指定することもできます。

4
Ryan Bobrowski

AlertViewをViewControllerに返すユーティリティ関数を作成してみませんか?

self.presentViewController(Utilities.createAlertController("errorMessage"), animated: true, completion: nil);
1
MobileMon

Swift 3:

以下の単純なコード行で使用されるユーザーに警告メッセージを表示する場合。

//関数の定義:

func showMessageToUser(title: String, msg: String)  {
    let alert = UIAlertController(title: title, message: msg, preferredStyle: UIAlertControllerStyle.alert)
    alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil))
    self.present(alert, animated: true, completion: nil)
}

//関数呼び出し:

self.showMessageToUser(title: "Alert", msg: "your message to user")

//コーディングをお楽しみください..!

1
Kiran jadhav