我遇到的问题是,当我在主队列上重新加载UITableView的数据时,它不会一直重新加载数据。当我启动应用程序并重新加载一些条纹(3到5次启动),然后一些不重载(2到3次启动)时,它只会大约在5次中重新加载数据。
我使用Swift 2在iOS 6和Xcode 7 Beta 4的iPhone 6上测试此应用。
这是我的UIViewController控件UITableView的代码,它也是启动后应用程序的初始屏幕。
import UIKit
class TableController: UIViewController, CLLocationManagerDelegate {
let rowTitles = ["Date", "Temp", "Humidity", "Wind"]
var tableData = [String : String]()
override func viewDidLoad() {
self.setupLocationManager()
}
func setupLocationManager() {
// Setting up a location manager
self.locationManager.startUpdatingLocation()
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
LocationData.ownLocation = locations.last!
self.locationManager.stopUpdatingLocation()
self.setupTable()
}
func setupTable() {
ApiClient.getCurrentWeatherAndSunData(LocationData.ownLocation) { (data, error) -> Void in
guard error == nil else {
print("Could not get current weather and sun data")
return
}
WeatherData.main = data!.valueForKey("main") as! Dictionary<String, AnyObject>
WeatherData.wind = data!.valueForKey("wind") as! Dictionary<String, AnyObject>
self.setWeatherData()
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.ownTableView.reloadData()
})
}
}
func setWeatherData() {
let temp = String(WeatherData.main["temp"] as! Int)
let humidity = String(WeatherData.main["humidity"] as! Int)
let windSpeed = String(WeatherData.wind["speed"] as! Int)
self.tableData["Date"] = getDateStringWithFormat(NSDate(), formatString: "dd.MM.yyyy")
self.tableData["Temp"] = "\(temp)°"
self.tableData["Humidity"] = "\(humidity)%"
self.tableData["Wind"] = "\(windSpeed) km/h"
}
}
extension TableController: UITableViewDataSource, UITableViewDelegate {
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.rowTitles.count ?? 0
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let myReuseIdentifier = "ReuseIdentifierPrayerTimes"
var cell = tableView.dequeueReusableCellWithIdentifier(myReuseIdentifier) as UITableViewCell!
if cell == nil {
cell = UITableViewCell(style: UITableViewCellStyle.Value2, reuseIdentifier: myReuseIdentifier)
cell.textLabel!.font = UIFont(name: cell.textLabel!.font.fontName, size: 17.0)
cell.detailTextLabel!.font = UIFont(name: cell.detailTextLabel!.font.fontName, size: 17.0)
}
let rowTitle = self.rowTitles[indexPath.row]
let rowData = self.tableData[rowTitle]
cell!.textLabel!.text = rowTitle
cell!.detailTextLabel!.text = rowData
return cell
}
}
问题在于,即使在主线程上调用reloadData()函数并在setWeatherData()中设置表的值后调用它,我的iPhone上的表也不会显示数据。
如果我这样做,表确实会显示数据并转到另一个标签并返回:
override func viewDidAppear() {
self.ownTableView.reloadData()
}
我的问题是你是否能找到这种随机行为的原因。我假设在初始加载表之后reloadData()调用过快,因此被忽略。在应用程序启动后,如何组织API调用以及后续数据重新加载UITableView?
答案 0 :(得分:0)
所以,问题是我在Xcode 7 Beta 4的Interface Builder(IB)中为我的UITableView添加了原型UITableViewCell。我不知道为什么,但是将原型UITableViewCell添加到IB中的UITableView会导致问题在所有UITableViews中。在我的IB项目中的UITableViews中再次删除原型UITableViewCells后,一切正常。这样我的代码在启动时会创建几个UITableViewCell,并在我更改数据并在UITableView上调用reloadData()时重用它们。