我是iOS新手。通过观看使用Swift 2编写的教程来完成项目。
当作者运行app而不是我的情况时,它可以工作。
的ViewController:
var books = [[String: AnyObject]]()
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
searchBar.delegate = self
}
扩展名
extension ViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "BookCell", for: indexPath)
// error on this line
if let volumeInfo = self.books[indexPath.row]["volumeInfo"] as? [String: AnyObject] {
cell.textLabel?.text = volumeInfo["title"] as? String
cell.detailTextLabel?.text = volumeInfo["subtitle"] as? String
}
return cell
}
}
控制台输出:
请帮我确定原因。
答案 0 :(得分:2)
我假设您的项目很多,但如果您的tableView中只有一个部分,这是默认的,则不应将indexPath.section用于您的图书字典。您应该使用indexPath.row,如下所示
改变 -
if let volumeInfo = self.books[indexPath.section]["volumeInfo"] as? [String: AnyObject]
到 -
if let volumeInfo = self.books[indexPath.row]["volumeInfo"] as? [String: AnyObject] {
答案 1 :(得分:2)
如果与数据源数组相关,则必须从books.count
返回numberOfRowsInSection
,从不“硬编码”该值。
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return books.count
}
PS:在Swift 3中,你应该使用[String:Any]
而不是[String:AnyObject]