Выполнение кода в handler alert action


#1

Подскажите, если есть время…

В общем по кнопке у меня вызывается почтовая форма
Код:

@IBAction func sendMailAction( _ sender:UIButton) {
let mailComposeViewController =configureMailController()

if MFMailComposeViewController.canSendMail() {

// Вывод формы для отправки письма
self.present(mailComposeViewController, animated: true , completion: nil )
 } else {
 showMailError()
  }

Но предварительно, я хочу еще Алерт воткнуть:

let infoForUsers =UIAlertController(title:"Attantion!", message:"Before send mail for tech support, make screensaver with problem, from display by your devices", preferredStyle: .alert)

let dismiss =UIAlertAction(title:"Ok", style: .cancel, handler: nil )
 infoForUsers.addAction(dismiss)
self .present(infoForUsers, animated: true , completion: nil )

Если я вставляю до цикла, то у меня шпарит этот Алерт во всех случаях, и когда почта вообще не настроена и когда настроена (типа ок конечно, но тупо предупреждать что нужно добавить в письмо скрин, если письмо в целом не откроется).

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

Если вставлю в цикл, то он у меня не закрывается этот Алерт (на сколько смог понять, он не может еще раз что-то презентовать контроллер после того как уже презентовал этот алерт)…

Есть мысль, что нужно цикл вывода почтовой формы вставить в handler alert actiona, но не могу сообразить как это правильно сделать…

Спасибо !


#2
@IBAction func sendMailAction( _ sender:UIButton) {
    let mailComposeViewController =configureMailController()

    if MFMailComposeViewController.canSendMail() {
        // Вывод формы для отправки письма
        showAlert() {
            self.present(mailComposeViewController, animated: true , completion: nil )
        }
    } else {
        showMailError()
    }
}

func showAlert(closure: () -> ()) {
let infoForUsers =UIAlertController(title:“Attantion!”, message:“Before send mail for tech support, make 
screensaver with problem, from display by your devices”, preferredStyle: .alert)

let dismiss =UIAlertAction(title:“Ok”, style: .cancel) { dialog in
    dialog.dismiss()
    closure()
}
infoForUsers.addAction(dismiss)
self .present(infoForUsers, animated: true , completion: nil )
}

как-то так


#3

Не зашло что-то…

dialog.dismiss() - Value of type ‘UIAlertAction’ has no member ‘dismiss’

И я не могу понять как его сделать этим самым членом (


#4

значет без dialog.dismiss(), я уже путаться стал между Swift и Kotlin.


#5

Rex !! Best !! Счастья, здоровья !
Честно, спасибо.

Я так понимаю, чтобы по кнопке сперва проверяем, потом вызываем Алерт, реализованный отдельной функцией, поэтому потом мы можем вызвать уже нужную нам форму…

Спасибо !

…надо учить мат.часть


#6

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