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

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

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

У меня есть свойство уровня класса: 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)
}

person Andrej    schedule 06.08.2015    source источник
comment
удержание ссылки - это то, что вы делаете - сделайте оповещение переменной экземпляра   -  person kostek    schedule 06.08.2015
comment
Удержание ссылки — это именно то, что вы сделали, объявив свойство класса uploadInProgressAlert. Вы уверены, что когда-нибудь вызывали очередь на увольнение?   -  person Zell B.    schedule 06.08.2015
comment
Да, я уверен, что строка вызывается, потому что у меня есть функция println() до и после строки.   -  person Andrej    schedule 06.08.2015


Ответы (5)


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

[self dismissViewControllerAnimated:YES completion:nil];

Тот же код в версиях Swift ‹ 3 будет таким:

self.dismissViewControllerAnimated(true, completion: nil)

Свифт 3.0:

self.dismiss(animated: true, completion: nil)
person JiuJitsuCoder    schedule 06.08.2015
comment
Да, это действительно указало мне правильное направление. Мне пришлось использовать self.dismissViewControllerAnimated(false, completion: nil) вместо self.uploadInProgressAlert.dismissViewControllerAnimated(false, completion: nil). Однако я не понимаю, почему это работает, но это работает. - person Andrej; 06.08.2015
comment
Это работает, потому что @MySpecialPurpose родительский контроллер представления отвечает за отклонение любого представленного контроллера представления. - person Victor Sigler; 06.08.2015
comment
что, если родитель также является модальным? - person Shabarinath Pabba; 14.09.2017
comment
@Daniel, так что можно сделать, если другой венчурный капитал представился первым? - person Shabarinath Pabba; 14.09.2017
comment
Безопасно ли это вызывать, даже если в настоящее время не отображается контроллер предупреждений? Я пробовал, и он просто ничего не делает (по желанию), но мне просто интересно, есть ли какие-либо непреднамеренные побочные эффекты. - person Extragorey; 17.11.2017

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

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

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

person sandeep jaglan    schedule 02.08.2016

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

  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)
    })
  }
person Adrian    schedule 11.07.2018

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

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

[alertController dismissViewControllerAnimated:YES completion:nil];
person ylgwhyh    schedule 31.05.2017
comment
ответы только для кода бесполезны для сообщества. Пожалуйста, объясните, почему ваш код решает проблему - person JimHawkins; 31.05.2017

Ничто из вышеперечисленного не сработало, но вот что у меня работает отлично (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. Вызов функций по мере необходимости

person Stotch    schedule 30.08.2019