【发布时间】:2016-12-20 10:54:44
【问题描述】:
我正在使用 Swift 为 iOS 构建一个小部件。主应用程序的目的是连接到 URL 新闻提要并获取最新消息,而小部件仅获取标题以显示在 Today 视图中的 tableView 中。
我已经为小部件编写了此方法,以便获取数据以填充表格,但由于某种原因没有显示任何内容。我试图调试它,但作为一个小部件,它似乎实际上是不可能的。
这是 cellForRowAt,我连接到提要并尝试提取数据。有趣的是,主应用程序使用基本相同的代码,并且运行良好。
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
let urlRequest = URLRequest(url: URL(string: "https://newsapi.org/v1/articles?source=techcrunch&sortBy=top&apiKey=c64849bc30eb484fb820b80a136c9b0a")!)
let task = URLSession.shared.dataTask(with: urlRequest) { (data,response,error) in
do{
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! [String: AnyObject]
if let articlesFromJson = json["articles"] as? [[String: AnyObject]] {
if !(error != nil) {
var resultArray: NSMutableArray = NSMutableArray()
for articlesFromJson in articlesFromJson {
if let title = articlesFromJson["title"] as? String{
resultArray.add(title)
}
let array:NSArray = resultArray.reverseObjectEnumerator().allObjects as NSArray
resultArray = array as! NSMutableArray
let title:String = resultArray.object(at: indexPath.row) as! String
cell.textLabel?.text = title
}
}
}
//reload on main thread to speed it up
DispatchQueue.main.async {
self.tableView.reloadData()
}
} catch let error {
print(error)
}
}
task.resume()
return cell
}
如果有人可以帮助我找出错误在哪里,那将是一个巨大的帮助,我已经被这个问题困扰了好几天了。谢谢
【问题讨论】:
-
不要试图在 Swift 中复制你的 Objective-C 习惯。例如,不要使用 NSArray/NSMutableArray/NSDictionary/NSMutableDictionary,而是使用 Swift 集合等。并避免强制展开和强制转换。最后建议:不要在tableView里面做网络和解析。让 tableView 使用另一个类的准备好的内容,该类的工作是下载和解析。
-
谢谢,我已经把所有的网络都放在了 Justin 下面建议的另一种方法中,我会考虑使用集合而不是 NSMutableArrays。
标签: ios json swift uitableview widget