我有一种情况,我想呈现一个 $('#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)
。
答案 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循环不起作用