我正在呈现一个没有任何按钮的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 dismiss UIAlertController in response to event有人谈到“持有参考”。我不知道“持有参考”是什么意思,我认为这可能是问题的根源。
编辑:我已将上述代码放在一个简单的测试应用程序中,并且可以正常运行。但是当一些并行线程的事情变得复杂时,我找不到解除警报的方法。
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)
}
答案 0 :(得分:53)
通常,父视图控制器负责解除模态显示的视图控制器(弹出窗口)。在Objective-C中,您可以在父视图控制器中执行以下操作:
[self dismissViewControllerAnimated:YES completion:nil];
Swift版本中的相同代码< 3将是:
self.dismissViewControllerAnimated(true, completion: nil)
Swift 3.0:
self.dismiss(animated: true, completion: nil)
答案 1 :(得分:9)
对于swift你可以做到:
nameOfYourAlertController.dismissViewControllerAnimated(true, completion: nil)
true将为消失设置动画,false将突然删除警报
答案 2 :(得分:5)
使用alertController自己的方法来销毁自己。
UIAlertController *alertController = [UIAlertController
alertControllerWithTitle:...];
[alertController dismissViewControllerAnimated:YES completion:nil];
答案 3 :(得分:5)
如果要发布短暂显示的警报,然后将其自行关闭,则可以使用以下方法:
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 :(得分:0)
以上似乎没有任何作用,但这对我来说是完美的(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步: 根据需要调用函数