Ios 为什么在我离开当前视图控制器并返回到它之后,我的UITableView只显示可用MGLOfflinePacks的列表?
我正在使用Mapbox iOS SDK 3.3.7和Swift 3开发一个功能,允许用户下载地图供脱机使用。初始视图将有一个UITableView,它将提供以前下载的所有MGlofflinePack的列表。我尽了最大努力移植到Swift 3以管理脱机包 不幸的是,我遇到了一个问题,当表格最初显示时,脱机包不会出现。但是,如果我将另一个控制器推到NavigationController上,或者离开并返回UITableView,则脱机包列表将按预期显示 我相信我的通知观察器和KVO已根据正确设置,但无论我如何尝试,Ios 为什么在我离开当前视图控制器并返回到它之后,我的UITableView只显示可用MGLOfflinePacks的列表?,ios,mapbox,mapbox-gl,Ios,Mapbox,Mapbox Gl,我正在使用Mapbox iOS SDK 3.3.7和Swift 3开发一个功能,允许用户下载地图供脱机使用。初始视图将有一个UITableView,它将提供以前下载的所有MGlofflinePack的列表。我尽了最大努力移植到Swift 3以管理脱机包 不幸的是,我遇到了一个问题,当表格最初显示时,脱机包不会出现。但是,如果我将另一个控制器推到NavigationController上,或者离开并返回UITableView,则脱机包列表将按预期显示 我相信我的通知观察器和KVO已根据正确设置,但
tableView(\uTableView:UITableView,numberOfRowsInSection:Int)
始终返回0,直到我离开控制器并返回为止,可能是因为MGLOfflineStorage.shared().packs在触发代码进行检查时返回nil
下面是我使用的代码的相关部分,我从前面提到的Obj-C示例中移植了这些代码:
import Mapbox
class OfflineMapTableViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
// observers for offline pack loading
MGLOfflineStorage.shared().addObserver(self, forKeyPath: "paths", options: .initial, context: nil)
NotificationCenter.default.addObserver(self, selector: #selector(offlinePackProgressDidChange), name: NSNotification.Name.MGLOfflinePackProgressChanged, object: nil)
}
deinit {
MGLOfflineStorage.shared().removeObserver(self, forKeyPath: "paths")
NotificationCenter.default.removeObserver(self)
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
guard let change = change else { return }
if keyPath == "paths" {
if let changeKind = change[NSKeyValueChangeKey.kindKey] as? UInt,
let kind = NSKeyValueChange(rawValue: changeKind) {
var indexPaths: [IndexPath] = []
if let indexes = change[NSKeyValueChangeKey.indexesKey] as? NSIndexSet {
if indexes.count > 0 {
indexes.enumerate({ (index, stop) in
indexPaths.append(IndexPath(row: index, section: 0))
})
}
}
switch kind {
case NSKeyValueChange.insertion:
tableView.insertRows(at: indexPaths, with: .automatic)
break
case NSKeyValueChange.removal:
tableView.deleteRows(at: indexPaths, with: .automatic)
break
case NSKeyValueChange.replacement:
tableView.reloadRows(at: indexPaths, with: .automatic)
break
default:
tableView.reloadData()
if let packs = MGLOfflineStorage.shared().packs {
for pack in packs {
if pack.state == .unknown {
pack.requestProgress()
}
}
}
break
}
}
} else {
super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
}
}
func offlinePackProgressDidChange(notification: NSNotification) {
guard let pack = notification.object as? MGLOfflinePack else { return }
guard let index = MGLOfflineStorage.shared().packs?.index(of: pack) else { return }
let indexPath: IndexPath = IndexPath(row: index, section: 0)
if let cell = tableView.cellForRow(at: indexPath) {
updateTableViewCell(cell, atIndexPath: indexPath, forPack: pack)
}
}
// MARK: - Table view data source
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if let packs = MGLOfflineStorage.shared().packs {
return packs.count
} else {
return 0
}
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "idCell", for: indexPath)
// Configure the cell...
if let pack = MGLOfflineStorage.shared().packs?[indexPath.row] {
updateTableViewCell(cell, atIndexPath: indexPath, forPack: pack)
}
return cell
}
func updateTableViewCell(_ cell: UITableViewCell, atIndexPath indexPath: IndexPath, forPack pack: MGLOfflinePack) {
if let userInfo = NSKeyedUnarchiver.unarchiveObject(with: pack.context) as? [String: String] {
if let name = userInfo["name"] {
cell.textLabel?.text = name
}
}
}
}
有人知道为什么脱机包列表只在我离开后返回视图控制器时出现吗?尝试将
forKeyPath:“paths”
更改为forKeyPath:“packs”
MGLOfflineStorage
属性的名称是packs
是否调用过“default”开关大小写语句?更新MGLOfflineStorage.shared().packs
后应立即调用tableView.reloadData()。@RemyCilia是的,调用了“default”开关,但这很奇怪,因为MGOfflineStorage.shared().packs
在实际返回可用包时返回nil。只有当我返回此控制器时,该属性才会返回可用的包。