indexPath.row超出范围(始终为0)

时间:2015-08-07 23:57:39

标签: ios swift

我知道这个问题已被多次询问,但由于某些原因,我所阅读的回复都没有解决这个问题。我正在检索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
    }

}

2 个答案:

答案 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()
    };
}