iOS解雇UIAlertController以响应事件

时间:2015-05-27 17:57:12

标签: ios swift uialertcontroller

我有一种情况,我想呈现一个 $('#example').dataTable( { "columnDefs": [ { "targets": 0, "data": "download_link", "render": function ( data, type, full, meta ) { return '<a href="'+data+'">Download</a>'; } } ] } ); ,以便在向用户展示我的主要UIAlertController之前等待一个事件(来自第三方的数据的异步请求)完成用。

异步代码完成后,我想解雇ViewController。我知道通常UIAlertControllers设置了一个按钮来解除它,这是用户输入的。我想知道我想做什么(用事件而不是用户输入解雇)是可能的吗?

到目前为止,我试图显示UIAlertController,然后在while循环中等待检查​​事件发生时的布尔值:

UIAlertController

这会发出警告

警告:正在进行演示或解雇时尝试从视图控制器中解除!

并且不会解雇UIAlertController。我也尝试了var alert = UIAlertController(title: "Please wait", message: "Retrieving data", preferredStyle: UIAlertControllerStyle.Alert) self.presentViewController(alert, animated: true, completion: nil) // dataLoadingDone is the boolean to check while (!dataLoadingDone) { } self.dismissViewControllerAnimated(true, completion: nil) 而不是alert.dismissViewControllerAnimated(true, completion: nil),但这并没有摆脱self.dismissViewControllerAnimated(true, completion: nil)

2 个答案:

答案 0 :(得分:1)

我不会使用 while循环,而是didSet属性的dataLoadingDone观察者。因此,您可以尝试类似于以下代码的内容:

class ViewController: UIViewController {

    var dismissAlertClosure: (() -> Void)?
    var dataLoadingDone = false {
        didSet {
            if dataLoadingDone == true {
                dismissAlertClosure?()
            }
        }
    }


    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)

        let alert = UIAlertController(title: "Please wait", message: "Retrieving data", preferredStyle: .Alert)
        presentViewController(alert, animated: true, completion: nil)

        // Set the dismiss closure to perform later with a reference to alert
        dismissAlertClosure = {
            alert.dismissViewControllerAnimated(true, completion: nil)
        }

        // Set boolValue to true in 5 seconds in order to simulate your asynchronous request completion
        var dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(5.0 * Double(NSEC_PER_SEC)))
        dispatch_after(dispatchTime, dispatch_get_main_queue(), { self.dataLoadingDone = true })
    }

}

答案 1 :(得分:0)

另一个用户(亚马)给出了我非常肯定的正确答案,但他删除了它,所以我要回答它。只是想给予信任(尽管他看起来很有信誉)。

他写的是我的UIAlertController演示文稿在我试图解除之前没有完成,所以我收到了这个错误。我将代码更改为以下内容:

public static final int DEFAULT_THEME = R.style.NewDialogTheme;

我在presentViewController调用的完成处理程序中移动了等待和解雇,因此我知道在解除之前完成了呈现。另外,我检查是否需要使用第一个if语句等待,否则如果while循环从不执行任何操作,则会出现另一个问题。

我还不是100%肯定,因为我的布尔值实际上从来都不是假的(数据检索很快发生)。但是,我有理由相信在我的应用开发中需要更长的时间,所以一旦有了这个,我会在这里更新答案。

编辑:之前发布答案的另一位用户(Aaron Golden)对于while循环阻止也是正确的。我原以为while循环与其他事件共享处理时间,但显然不是(或者至少没有足够的时间)。因此,上面的while循环不起作用