Как программно отклонить UIAlertController без каких-либо кнопок?

Я представляю UIAlertViewController без каких-либо кнопок, так как он должен просто информировать пользователей о том, что загрузка выполняется. Предполагается, что приложение загрузит некоторые файлы в Amazon S3 (некоторые вещи происходят в параллельных потоках), и я боюсь, что ссылка на контроллер представления предупреждений будет потеряна, когда я захочу ее отклонить.

Любая идея о том, что может быть неправильным? Я даже не знаю, как отлаживать это, поскольку в области Debug нет ошибки?

У меня есть свойство уровня класса: var uploadInProgressAlert = UIAlertController()

Я использую этот код для представления моего предупреждения без кнопок (он работает):

self.uploadInProgressAlert = UIAlertController(title: "Uploading", message: "Please wait.", preferredStyle: .Alert)
self.presentViewController(self.uploadInProgressAlert, animated: true, completion: nil)

Этот код предназначен для отклонения предупреждения (предупреждение не отклоняется): self.uploadInProgressAlert.dismissViewControllerAnimated(false, completion: nil)

В этой теме: iOS отклоняет UIAlertController в ответ на событие, которое кто-то говорил о "проведении ссылки". Я не знаю, что значит "держать ссылку", и я думаю, что это может быть причиной проблемы.

EDIT: я поставил вышеуказанный код в простое тестовое приложение и там он работает. Но когда ситуация осложняется некоторыми параллельными потоками, я не могу найти способ отклонить предупреждение.

var delay4s = NSTimer()
var delay8s = NSTimer()
var alert = UIAlertController()

func showAlert() {
    if NSClassFromString("UIAlertController") != nil {
        alert = UIAlertController(title: "Uploading", message: "Please wait! \n\n", preferredStyle: UIAlertControllerStyle.Alert)
        self.presentViewController(alert, animated: true, completion: nil)
    }
}

func dismissAlert(){
    self.alert.dismissViewControllerAnimated(true, completion: nil)
}

override func viewDidLoad() {
    super.viewDidLoad()
    delay4s = NSTimer.scheduledTimerWithTimeInterval(4.0, target: self, selector: "showAlert", userInfo: nil, repeats: false)
    delay8s = NSTimer.scheduledTimerWithTimeInterval(8.0, target: self, selector: "dismissAlert", userInfo: nil, repeats: false)
}

Ответы

Ответ 1

Обычно контроллер родительского представления отвечает за отклонение представленного модально отображаемого контроллера представлений (ваше всплывающее окно). В Objective-C вы должны сделать что-то подобное в контроллере родительского представления:

[self dismissViewControllerAnimated:YES completion:nil];

Тот же код в версиях Swift <3:

self.dismissViewControllerAnimated(true, completion: nil)

Swift 3.0:

self.dismiss(animated: true, completion: nil)

Ответ 2

для быстрого вы можете сделать:

nameOfYourAlertController.dismiss(animated: true, completion: nil)

true оживит исчезновение, а false внезапно удалит предупреждение

Ответ 3

Если вы хотите опубликовать предупреждение, которое отображается ненадолго, а затем отклоняется, вы можете использовать следующий метод:

  func postAlert(title: String, message: String) {
    let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
    self.present(alert, animated: true, completion: nil)

    // delays execution of code to dismiss
    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0, execute: {
      alert.dismiss(animated: true, completion: nil)
    })
  }

Ответ 4

Используйте собственный метод alertController, чтобы уничтожить себя.

UIAlertController *alertController = [UIAlertController 
alertControllerWithTitle:...];

[alertController dismissViewControllerAnimated:YES completion:nil];

Ответ 5

Казалось, ничего из вышеперечисленного не работает, но вот то, что у меня отлично работает (xcode 10, swift 5). Наслаждайтесь!

Шаг 1: Поместите это ваш класс viewController

    var newQuestionAlert:UIAlertController?

Шаг 2: Создать функцию для отображения оповещения

  func ShowNewQuestionPopup() {
    if newQuestionAlert == nil {
        newQuestionAlert = UIAlertController(title: "Notice", message: "Next Question Starting", preferredStyle: .alert)
        if let newQuestionAlert = newQuestionAlert {
            newQuestionAlert.addAction(UIAlertAction(title: "OK", style: .default, handler: { action in
                self.newQuestionAlert = nil
                return
            }))
            self.present(newQuestionAlert, animated: true, completion: nil)
         }
     }
 }

Шаг 3: Создать функцию для отключения оповещения

func autoDismiss() {
    newQuestionAlert?.dismiss(animated: false, completion: nil)
    newQuestionAlert = nil
}

Шаг 4: Вызовите функции по мере необходимости