我遇到一个问题,如果用户输入搜索栏太快,程序将崩溃,并显示以下消息
致命错误:索引超出范围
引用行var podInfo = podcastResults[row]
,它是cellForRowAtIndexPath
方法的一部分。搜索框位于UITableView
之上,该NSURLSession
是从class SearchTVC: UITableViewController, UISearchBarDelegate {
@IBOutlet weak var searchBar: UISearchBar!
var podcastResults = [[String: String]]()
var tempDict = [String: String]()
func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
print("search being typed")
if searchText.characters.count >= 3 {
let searchesArray:Array = searchText.componentsSeparatedByString(" ")
//request search method to start
search(searchesArray)
}
}
func search(searchqueries: Array<String>){
let URL = iTunesSearcher().searchQuery(searchqueries) //This just complies the URL using a method in anothr class
let task = NSURLSession.sharedSession().dataTaskWithURL(URL) {
(data, response, error) in
print("URL downloaded")
//clear results and temp dict, so that new results can be displayed
self.tempDict.removeAll()
self.podcastResults.removeAll()
let data = NSData(contentsOfURL: URL) //urlString!
let json = JSON(data: data!)
for (key, subJson) in json["results"] {
if let title = subJson["collectionCensoredName"].string {
self.tempDict = ["title": title]
} else { print("JSON - no title found") }
if let feedURL = subJson["feedUrl"].string {
self.tempDict.updateValue(feedURL, forKey: "feedURL")
} else { print("JSON - no feedURL found") }
if let artworkUrl60 = subJson["artworkUrl60"].string {
self.tempDict.updateValue(artworkUrl60, forKey:"artworkURL60")
} else { print("JSON - no artwork url found") }
self.podcastResults.append(self.tempDict)
}
//Running request on main thread
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.tableView.reloadData()
})
}
task.resume()
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCellWithIdentifier(textCellIdentifier, forIndexPath: indexPath)
let row = indexPath.row
var podInfo = podcastResults[row]
cell.textLabel?.text = podInfo["title"]
return cell
}
结果中填充的。
请参阅下面的代码。
Activity
任何帮助都会非常感激,因为我无法弄清楚。
干杯。
迈克尔答案 0 :(得分:0)
尝试从阵列中删除所有元素时重新加载表格,即。 self.tempDict.removeAll()
self.podcastResults.removeAll()
似乎表格没有刷新,仍然显示现在实际删除的元素。
答案 1 :(得分:0)
我假设您在UITableViewDataSource
中返回的行数为self.podcastResults.count
。
如果是这样,你需要做的是转过来:
let row = indexPath.row
var podInfo = podcastResults[row]
cell.textLabel?.text = podInfo["title"]
进入
let row = indexPath.row
if row < podcastResults.count {
var podInfo = podcastResults[row]
cell.textLabel?.text = podInfo["title"]
}
这将确保无论何时请求单元格,索引都将永远不会超出范围(我认为这会在您从请求处理程序中删除数组中的所有元素之后发生)。