Отклонить UIAlertView через 5 секунд Swift
Я создал UIAlertView, который содержит идентификатор UIActivityIndicator. Все отлично работает, но мне также хотелось бы, чтобы UIAlertView исчез через 5 секунд.
Как я могу отменить мой UIAlertView через 5 секунд?
var alert: UIAlertView = UIAlertView(title: "Loading", message: "Please wait...", delegate: nil, cancelButtonTitle: "Cancel");
var loadingIndicator: UIActivityIndicatorView = UIActivityIndicatorView(frame: CGRectMake(50, 10, 37, 37)) as UIActivityIndicatorView
loadingIndicator.center = self.view.center;
loadingIndicator.hidesWhenStopped = true
loadingIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray
loadingIndicator.startAnimating();
alert.setValue(loadingIndicator, forKey: "accessoryView")
loadingIndicator.startAnimating()
alert.show()
Ответы
Ответ 1
Вы можете отклонить ваш UIAlertView
после 5-секундной задержки программно, например:
alert.show()
// Delay the dismissal by 5 seconds
let delay = 5.0 * Double(NSEC_PER_SEC)
var time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
dispatch_after(time, dispatch_get_main_queue(), {
alert.dismissWithClickedButtonIndex(-1, animated: true)
})
Ответ 2
Решение автоматически отклонить оповещение в Swift 3 и Swift 4 (Вдохновленный частью этих ответов: [1 ], [2], [3]):
// the alert view
let alert = UIAlertController(title: "", message: "alert disappears after 5 seconds", preferredStyle: .alert)
self.present(alert, animated: true, completion: nil)
// change to desired number of seconds (in this case 5 seconds)
let when = DispatchTime.now() + 5
DispatchQueue.main.asyncAfter(deadline: when){
// your code with delay
alert.dismiss(animated: true, completion: nil)
}
Результат:
![введите описание изображения здесь]()
Ответ 3
в swift 2 вы можете это сделать. Кредит @Lyndsey Скотт
let alertController = UIAlertController(title: "youTitle", message: "YourMessage", preferredStyle: .Alert)
self.presentViewController(alertController, animated: true, completion: nil)
let delay = 5.0 * Double(NSEC_PER_SEC)
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
dispatch_after(time, dispatch_get_main_queue(), {
alertController.dismissViewControllerAnimated(true, completion: nil)
})
Ответ 4
Для Swift 4 вы можете использовать этот код
let alertController = UIAlertController(title:"Alert",message:nil,preferredStyle:.alert)
self.present(alertController,animated:true,completion:{Timer.scheduledTimer(withTimeInterval: 5, repeats:false, block: {_ in
self.dismiss(animated: true, completion: nil)
})}
Ответ 5
Создать объект оповещения как глобальную переменную.
Вы можете использовать NSTimer
для этой цели.
var timer = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: Selector("dismissAlert"), userInfo: nil, repeats: false)
func dismissAlert()
{
// Dismiss the alert from here
alertView.dismissWithClickedButtonIndex(0, animated: true)
}
Примечание:
Важно: UIAlertView устарел в iOS 8. (Обратите внимание, что UIAlertViewDelegate также устарел.) Чтобы создавать оповещения и управлять ими в iOS 8 и более поздних версиях вместо этого используйте UIAlertController с preferredStyle UIAlertControllerStyleAlert.
Ссылка: UIAlertView
Ответ 6
Для Swift 3
let alert = UIAlertController(title: "Alert", message: "Message",preferredStyle: UIAlertControllerStyle.alert)
self.present(alert, animated: true, completion: nil)
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + Double((Int64)(5.0 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: {() -> Void in
alert.dismiss(animated: true, completion: {() -> Void in
})
})
Ответ 7
Я не эксперт, но это работает для меня, и я думаю, что легче
let alert = UIAlertController(title: "", message: "YOUR MESSAGE", preferredStyle: .alert)
present(alert, animated: true) {
sleep(5)
alert.dismiss(animated: true)
}
Ответ 8
//Общая функция для отмены оповещения w.r.t Timer
/** showWithTimer */
public func showWithTimer(message : String?, viewController : UIViewController?) {
let version : NSString = UIDevice.current.systemVersion as NSString
if version.doubleValue >= 8 {
alert = UIAlertController(title: "", message: message, preferredStyle:.alert)
viewController?.present(alert ?? UIAlertController(), animated:true, completion:nil)
let when = DispatchTime.now() + 5
DispatchQueue.main.asyncAfter(deadline: when){
self.alert?.dismiss(animated: true, completion: nil)
}
}
}
Ответ 9
@обязательный ответ на c #
var when = new DispatchTime(DispatchTime.Now,
TimeSpan.FromSeconds(5));
DispatchQueue.MainQueue.DispatchAfter(when, () =>
{
// your code with delay
alertController.DismissModalViewController(true);
});
Ответ 10
В iOS 8. 0+ UIAlertController
наследуется от UIViewController
, так что это просто контроллер представления. Итак, все ограничения применяются. Поэтому, когда существует вероятность того, что представление будет отклонено пользователем, не совсем безопасно пытаться отклонить его без надлежащих проверок.
В следующем фрагменте приведен пример того, как этого можно достичь.
func showAutoDismissableAlert(
title: String?,
message: String?,
actions: [MyActionWithPayload], //This is just an struct holding the style, name and the action in case of the user selects that option
timeout: DispatchTimeInterval?) {
let alertView = UIAlertController(
title: title,
message: message,
preferredStyle: .alert
)
//map and assign your actions from MyActionWithPayload to alert UIAlertAction
//(..)
//Present your alert
//(Here I'm counting on having the following variables passed as arguments, for a safer way to do this, see https://github.com/agilityvision/FFGlobalAlertController)
alertView.present(viewController, animated: animated, completion: completion)
//If a timeout was set, prepare your code to dismiss the alert if it was not dismissed yet
if let timeout = timeout {
DispatchQueue.main.asyncAfter(
deadline: DispatchTime.now() + timeout,
execute: { [weak alertView] in
if let alertView = alertView, !alertView.isBeingDismissed {
alertView.dismiss(animated: true, completion: nil)
}
}
}
}