我知道这个问题已被多次询问,但由于某些原因,我所阅读的回复都没有解决这个问题。我正在检索MealObjects数组,我已经定义了一个类,并将它们的属性设置为Table View中的标签,其中定义的限制为5个Table View Cells。我只在表视图中有一个部分。
我已经粘贴了下面的View Controller类。我在评论中标记了错误。我做错了什么?
import UIKit
class PlateViewController: UITableViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var subtitleLabel: UILabel!
let locationHelper = LocationHelper.sharedInstance
let userChoice = UserChoiceCollectionDataSource()
var mealArray: [MealObject] = []
override func viewDidLoad() {
super.viewDidLoad()
locationHelper.setupLocation()
locationHelper.callback = {
self.mealArray = self.userChoice.getUserSuggestions()
}
tableView.dataSource = self
tableView.delegate = self
tableView.estimatedRowHeight = 125
tableView.rowHeight = UITableViewAutomaticDimension
titleLabel.text = "Your Plate"
subtitleLabel.text = "The top 5 suggestions based on the information you provided"
navigationController?.hidesBarsOnSwipe = true
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("MealCell", forIndexPath: indexPath) as! PlateTableViewCell
let meals = mealArray[indexPath.row]
/* FATAL ERROR: ARRAY INDEX OUT OF RANGE
INDEXPATH.ROW = 0
*/
print(indexPath.row)
cell.mealTitleLabel.text = meals.mealTitle
cell.descriptionLabel.text = meals.mealDescription
cell.priceLabel.text = "\(meals.priceValue)"
return cell
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 5
}
}
答案 0 :(得分:1)
如果索引0超出范围,则在cellForRowAtIndexPath
访问它时,您的数组看起来是空的。您将行数硬编码为5,但只有在数组中至少包含5个元素时才应该这样做。例如,您可以在numberOfRowsInSection中执行
return min(mealArray.count, 5)
我不知道你在哪里设置数组。你的代码
locationHelper.callback = {
self.mealArray = self.userChoice.getUserSuggestions()
}
不这样做。
答案 1 :(得分:0)
要有一个部分tableView
,你必须这样做:
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return mealArray.count
}
并在更新mealArray
刷新tableView
之后:
locationHelper.callback = {
self.mealArray = self.userChoice.getUserSuggestions()
dispatch_async(dispatch_get_main_queue()){
self.tableView.reloadData()
};
}