我一直在尝试实现在请求期间在子视图中显示活动指示符的代码。它意味着用于加载,但是如果我去另一个segue然后返回指标现在就在那里它永远不会显示。这让我相信superview不会重新加载,直到我的函数运行,到那时子视图不需要显示
示例:
loadingIndicator.startIndicator(self.view)
let parameters = Parameters()
parameters.addParams(search: search)
let request = SearchRQ(parameters: parameters)
request.getResponse()
while !request.isComplete
{
//Wait
}
let results = request.parseResponse()
self.results = results
loadingIndicator.stopIndicator(self.view)
performSegueWithIdentifier("showSearchResults", sender: sender)
答案 0 :(得分:1)
如亚特所述,您需要在主线程上将您的活动指示符添加到视图(或任何UI更改)。
你可以这样做:
dispatch_async(dispatch_get_main_queue(),{
self.view.addSubview(activityIndicator)
})
要等待主线程的响应,请更改getResponse函数,使其具有完成处理程序。 :
func getResponse(responseReceived:() ->Void) {
// Once I get my response:
responseReceived()
}
然后,您可以在收到回复后进行适当的更改。
getResponse {
let results = request.parseResponse()
self.results = results
loadingIndicator.stopIndicator(self.view)
performSegueWithIdentifier("showSearchResults", sender: sender)
}
答案 1 :(得分:0)
您需要进入主线程以显示和启动活动指示符,然后执行 off 主线程以执行异步活动。
答案 2 :(得分:0)
最后,以下代码工作并允许显示/隐藏
Lucene
答案 3 :(得分:0)
在Swift 5中进行了测试,您可以使用以下简单扩展名:
// Activity Indicator Extension
var vSpinner : [UIView] = []
extension UIViewController {
func showSpinner(onView : UIView) {
let spinnerView = UIView.init(frame: onView.bounds)
// spinnerView.backgroundColor = UIColor.init(red: 0.8, green: 0.8, blue: 0.8, alpha: 0.9)
let ai = UIActivityIndicatorView.init(style: .medium)
ai.startAnimating()
ai.center = spinnerView.center
DispatchQueue.main.async {
spinnerView.addSubview(ai)
onView.addSubview(spinnerView)
}
vSpinner.append(spinnerView)
}
func removeSpinner() {
DispatchQueue.main.async {
vSpinner.popLast()?.removeFromSuperview()
}
}
}
在您的异步任务中,请使用以下两个方便的男孩:
showSpinner(onView: self.view)
记住要用任何所需的视图替换 self.view
self.removeSpinner()
卸下加载指示器: