Быстрые способы отображения предупреждений
У меня есть различные контроллеры в моем приложении, которые требуют проверки, и когда проверка не выполняется, я хочу отобразить предупреждение с ошибками. Есть ли какая-то лучшая практика/шаблон дизайна для этого? Я мог бы просто создать статическую функцию в классе Helper, например:
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)
}
Но тогда мне нужно передать контроллер вида. Это похоже на плохую практику. Я мог снять уведомление и наблюдать за ним, но это похоже на излишний. Могу ли я это переусердствовать, или есть еще более приемлемый способ справиться с чем-то подобным?
Ответы
Ответ 1
В итоге я создал расширение для 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.present(alertController, animated: true, completion: nil)
}
}
Ответ 2
Swift 4
Здесь вы, я хотел этого, чтобы я сделал полное расширение. Итак, создайте новый быстрый файл в названии своего проекта, что бы вы ни захотели в нем, разместите следующий код.
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
}
}
Ответ 3
Как оригинальный ответ от itstrueimryan на fooobar.com/questions/356358/...
Обновление для 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)
}
}
Ответ 4
Возможно, я нашел лучший ответ на эту проблему через статью Кракендева: 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
}
}
Теперь, точно так же, каждый UIViewController, который придерживается Alertable, будет иметь доступный им метод issueAlert(), даже не имея необходимости определять его собственную реализацию.
И, конечно же, мы можем определить параметры для функции issueAlert:
extension Alertable where Self: UIViewController {
func issueAlert(title: "Default Title", message: String = "Default Message") {
// alert code here
}
}
Таким образом, наш контроллер просмотра может также:
issueAlert()
или
issueAlert(title: "Error", message: "Something went wrong")
Два преимущества этого подхода, о которых я могу думать, это то, что вы знаете, имеет ли контроллер представления доступ к этому методу, просто просмотрев протокол Alertable в определении класса, а отдельные контроллеры представлений могут переопределить этот метод, если они хотят предоставлять пользовательские функции. Конечно, теперь вы также можете указать контракт с оповещением как параметр метода.
Ответ 5
Почему бы не создать функцию Utility, которая возвращает AlertView в ViewController?
self.presentViewController(Utilities.createAlertController("errorMessage"), animated: true, completion: nil);
Ответ 6
Обновлено для быстрого 3:
если вы хотите показать предупреждающее сообщение пользователю, используемому ниже простых строк кода;
//функция defination:
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")
//Наслаждайтесь кодированием..!
Ответ 7
Я использовал расширение Sigex в своем коде, однако я добавил проверку, использовались ли опции или нет.
Если в вызове не задано никаких опций, тогда в Alert отображается только "OK", и завершается с возвратом опции 0.
extension UIViewController {
func presentAlertWithTitle(title: String, message: String, options: String..., completion: @escaping (Int) -> Void) {
let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
if options.count == 0 {
let OKAction = UIAlertAction(title: "OK", style: .default, handler: { (action) in
completion(0)
})
alertController.addAction(OKAction)
} else {
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)
}
}
Просто опустите деталь , options: "1","2"
, после чего появится предупреждение по умолчанию.