Как программно отклонить 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:
Вызовите функции по мере необходимости