Почему обработчик UIAlertAction должен иметь параметр, который ссылается на UIAlertAction? - PullRequest
0 голосов
/ 09 января 2020

Я работаю с простой кнопкой, которая при нажатии запускает созданную мной функцию.

Первоначально я написал код следующим образом:

func askQuestion() {
     // runs code to ask a question
}

@IBAction func buttonTapped(_ sender: UIButton) {
     let ac = UIAlertController(title: title, message: "You tapped the button.", preferredStyle: .alert)
     ac.addAction(UIAlertAction(title: "Continue", style: .default, handler: askQuestion))
    present(ac, animated: true)

Но это возвращает ошибка:

Cannot convert value of type '() -> ()' to expected argument type '((UIAlertAction) -> Void)?'

Исправлено, когда вы добавляете следующий параметр в askQuestion ():

askQuestion(action: UIAlertAction! = nil)

Почему метод обработчика, переданный в UIAlertAction, требует, чтобы он принимал параметр UIAlertAction ? Это кажется ненужным шагом, но я подумал, что это может быть способ отсканировать ваш код на наличие подсказок, что эта функция вызывается кнопкой.

Ответы [ 3 ]

1 голос
/ 12 января 2020

У вас может быть один обработчик, отвечающий за обработку нескольких действий

var continueAction: UIAlertAction!
var cancelAction: UIAlertAction!

override func viewDidLoad() {
    super.viewDidLoad()

    continueAction = UIAlertAction(title: "Continue", style: .default, handler: masterHandler)
    cancelAction = UIAlertAction(title: "Cancel", style: .default, handler: masterHandler)
}

//...

 let ac = UIAlertController(title: title, message: "You tapped the button.", preferredStyle: .alert)
 ac.addAction(continueAction)
 ac.addAction(cancelAction)

Лично я не знаю, почему вы могли бы сделать это, но дизайнеры API посчитали хорошей идеей предоставить вам гибкость в разработке вашего решения, которое наилучшим образом соответствует вашим потребностям.

Итак, в большинстве случаев, хотя я понимаю, что это кажется странным (особенно когда вы можете использовать замыкания), я ценю наличие информации, чтобы сделать свою собственную выбор

1 голос
/ 12 января 2020

Что, если в предупреждении есть текстовое поле, и вам нужно извлечь этот текст?

Что если одна и та же функция используется несколькими оповещениями, и вам необходимо знать, какое это предупреждение (вполне возможно) ?

Что если это подкласс UIAlertController со свойством или методом, к которому вам нужен доступ? (Да, я сделал это.)

Вам нужна ссылка на предупреждение! И он нужен вам как и без того слабая ссылка, поэтому вы не получите цикл удержания, если используете трейлинг-закрытие. Таким образом, обработчик действий задается как параметр.

Поверьте мне, если вы не получите ссылку на предупреждение, рано или поздно вы окажетесь в ситуации, когда вы будете в ярости и тупике.

0 голосов
/ 10 января 2020

Вам нужно

func askQuestion(_ action:UIAlertAction){} // ->() is the void return here 

необходимо / не UIAlertAction обработчик имеет UIAlertAction -> () обратный вызов, поэтому вам нужно реализовать, иногда вы делаете

alert.addAction(UIAlertAction.......{ (action) in }

, поэтому полезно знать некоторые подробности о текущем действии, например, название или стиль

...