Я пытался понять это сейчас. Я думаю, что я довольно сильно исчерпал все варианты исследований, поэтому я даю это вам, ТАК заглядывает.Индикатор активности отображения в TableView с асинхронным программированием - Swift
У меня есть вид на стол, который выходит на веб-представление. Веб-представление рисует карту, иногда с тысячами координат, поэтому время загрузки иногда может быть несколько длинным, очевидно, в зависимости от устройства пользователя. Поэтому я хочу подключить индикатор активности, чтобы пользователь знал, что приложение не разбилось.
Так что я создал индикатор активности программно и установил его для активации на didSelectRowAtIndexPath. Проблема здесь в том, что индикатор не начинает показываться, пока задача не будет завершена - и какова точка индикатора. Поэтому я понимаю, что решение здесь - сделать это асинхронно, но решение, которое я пробовал, не имеет никакого эффекта. Я также попытался подключить код в функции prepareForSegue, но это еще хуже - он переходит к представлению карты перед загрузкой данных, таким образом отображая пустую карту.
Любая помощь здесь? Ниже мой код. Благодаря!
class MapSelect: UITableViewController {
let subdivisionArray = [There's an array here]
let selectionArray = [There's an array here]
let model = Model()
var myView = UIView()
var activityIndicator = UIActivityIndicatorView()
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.navigationBarHidden = false
myView = UIView(frame: CGRectMake(0, 0, self.tableView.frame.size.width, self.tableView.frame.size.height))
myView.backgroundColor=UIColor(red: 0.5, green: 0.5, blue: 0.5, alpha: 1.0)
myView.alpha = 0.0
UIView.animateWithDuration(1.0, animations: {() -> Void in
self.myView.alpha = 0.5
})
self.view.addSubview(myView)
activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.WhiteLarge)
activityIndicator.startAnimating()
activityIndicator.center = CGPointMake(self.tableView.frame.size.width/2, self.tableView.frame.size.height/2)
self.tableView.addSubview(activityIndicator)
self.stopSpinner()
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return subdivisionArray.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell") as UITableViewCell!
cell.textLabel?.font = UIFont.boldSystemFontOfSize(18)
cell.textLabel?.text = subdivisionArray[indexPath.row]
return cell
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
{
if subdivisionArray[indexPath.row] != "County" {
performSegueWithIdentifier("toMapSelect2", sender: self)
} else {
self.spinner()
let seconds = 0.1
let delay = seconds * Double(NSEC_PER_SEC) // nanoseconds per seconds
let dispatchTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
dispatch_after(dispatchTime, dispatch_get_main_queue(), {
self.performSegueWithIdentifier("toMapView", sender: self)
})
self.stopSpinner()
}
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { ... }
func spinner() {
myView.hidden = false
myView.alpha = 0.0
UIView.animateWithDuration(1.0, animations: {() -> Void in
self.myView.alpha = 0.5
})
activityIndicator.startAnimating()
activityIndicator.hidden = false
}
func stopSpinner() {
myView.hidden = true
activityIndicator.stopAnimating()
activityIndicator.hidden = true
}
}
Здесь также есть код, который загружает карту на вебе-просмотр в отдельном «классе MapView»:
override func viewDidLoad() {
super.viewDidLoad()
do {
if prevSelectionType == "ed" {
prevSelectionLabel = prevSelection
prevSelection = model.decodeElectionDistrict(prevSelection)
} else {
prevSelectionLabel = prevSelection
}
}
var regionEds : Array<String> = Array<String>()
do {
var pred : NSPredicate
pred = NSPredicate(format: "region = %@", "")
if prevSelectionType != "county" {
if prevSelectionType != "ed" {
pred = NSPredicate(format: "region = %@" , prevSelection)
} else {
pred = NSPredicate(format: "ed = %@" , prevSelection)
}
requestPick3.predicate = pred
}
requestPick3.resultType = NSFetchRequestResultType.DictionaryResultType
requestPick3.propertiesToFetch = ["ed"]
requestPick3.returnsDistinctResults = true
let resultsPre = try context.executeFetchRequest(requestPick3)
for result in resultsPre {
let resultEd : String = result["ed"] as! String
regionEds.append(resultEd)
}
} catch {
print("Error")
}
self.mapView.delegate = self
var dCoords : Array<Double> = Array<Double>()
var twdString : String = String()
var query : PFQuery = PFQuery()
do {
if prevSelectionType != "county" {
let predicate = NSPredicate(format:"twd IN %@", regionEds)
query = PFQuery(className: "Coords2016", predicate: predicate)
} else {
query = PFQuery(className: "Coords2016")
}
query.limit = 1000
let userArray = try query.findObjects()
// print(userArray)
for item in userArray {
dCoords = item["coords"] as! Array<Double>
twdString = item["twd"] as! String
twdString = model.twdToEdAbbrev(twdString)
addBoundry(dCoords, twd: twdString)
}
} catch {
print("Error")
}
// DEFINE CENTER LOCATION
let initialLocation = CLLocation(latitude: centerLat, longitude: centerLong)
// DEFINE ZOOM SIZE
centerMapOnLocation(initialLocation)
toggleSwitch.setOn(false, animated: true)
}
Почему бы не поставить индикатор на ваш MapView? И в своем MapViewController сначала скройте веб-просмотр, покажите индикатор, а после загрузки веб-представления покажите его и скройте индикатор. – Surely
Я бы определенно пошел на это решение, если мог (и, может быть, могу, если смогу это выяснить). Проблема в том, что экран останавливается на столе, пока хрустят данные координат - и я не совсем уверен, почему это так, так как вся эта работа выполняется в MapViewController. –
Вы также можете опубликовать свой код веб-просмотра, просто часть загрузки URL-адреса. Я думаю, вы можете попытаться поместить часть url загрузки в viewDidAppear вашего контроллера MapView. – Surely