Как реализовать поле YesNo как метод ViewController? - PullRequest
0 голосов
/ 15 мая 2019

Я хотел бы добавить метод к моему ViewController, который показывает сообщение с текстом в виде предупреждения с кнопками Да и Нет. Результат должен быть типа Bool (Да / Нет).

Я попробовал следующее:

func YesNoBox(msg: String) -> Bool
{
    var retVal = false
    let alert = UIAlertController(title: "", message: msg, preferredStyle: .alert)
    let action_yes = UIAlertAction(title: "Yes", style: .default, handler:
                         { _ in NSLog("The \"Yes\" alert occured."); retVal = true })
    let action_no = UIAlertAction(title: "No", style: .cancel, handler:
                         { _ in NSLog("The \"No\" alert occured."); retVal = false })
    alert.addAction(action_yes)
    alert.addAction(action_no)
    self.present(alert, animated: true, completion: nil)
    return retVal
}

Однако значение retVal всегда равно false. Если бы я был в C / C ++, я бы решил эту проблему с помощью указателя, но это Swift (и я довольно новичок в этом).

Кто-нибудь знает, как я могу заставить это работать?

РЕДАКТИРОВАТЬ: у меня проблема заключается в следующем. На ViewController у меня есть TextField. Когда я нажимаю на текстовое поле, приложение должно спросить пользователя, хотят ли они вставить текст из буфера обмена. Если да, вставьте, в противном случае выделите фокус TextField (т. Е. Пусть на нем будет мигать курсор). Я пытался сделать это с помощью textFieldShouldBeginEditing, и в этом методе я отображаю YesNoBox. Проблема в том, что TextField никогда не получает фокус после закрытия YesNoBox. И когда после вызова Box я использую функцию «становиться становящимся ответчиком»), приложение зависает. Я не знаю что делать?

Ответы [ 2 ]

1 голос
/ 15 мая 2019

Этого можно достичь с помощью обработчиков завершения.

func showAlertWithOptions(title: String, message: String, completionHandler: @escaping (Bool) -> Void) {

    let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)

    let action_yes = UIAlertAction(title: "Yes", style: .default, handler: { _ in
        completionHandler(true) 
    })

    let action_no = UIAlertAction(title: "No", style: .cancel, handler: { _ in
        completionHandler(false) 
    })

    alert.addAction(action_yes)
    alert.addAction(action_no)

    self.present(alert, animated: true, completion: nil)
}

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

showAlertWithOptions(title: "Any title", message: "Any message") { success in

    if success {
        NSLog("The \"Yes\" alert occured.")
    } else {
        NSLog("The \"No\" alert occured.")
    }
}
1 голос
/ 15 мая 2019

Используйте завершение

func yesNoBox(msg: String,completion:@escaping(Bool) -> ())
{ 
    let alert = UIAlertController(title: "", message: msg, preferredStyle: .alert)
    let action_yes = UIAlertAction(title: "Yes", style: .default, handler:
                         { _   in
                          NSLog("The \"Yes\" alert occured."); 
                          completion(true)
                         })
    let action_no = UIAlertAction(title: "No", style: .cancel, handler:
                         { _ in 
                           NSLog("The \"No\" alert occured."); 
                           completion(false)
                         })
    alert.addAction(action_yes)
    alert.addAction(action_no)
    self.present(alert, animated: true, completion: nil) 
}

вызов

yesNoBox(msg:"someMessage") { yes in
    if yes {
     // do yes action
    }
    else {
     // do no action
    }
}

2 Обратные вызовы:

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

 func uploadImage(data: Data,progress:@escaping(Float) -> (),completion:@escaping(Bool) -> ()) {
    // implementation here
  }

Для вызова

self.uploadImage(someData) { progress in
   print(progress)
 }) { done in
   print(done)
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...