首页 > 解决方案 > 无法解决线程 1:致命错误:索引超出范围

问题描述

我有以下内容:

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, NSFetchedResultsControllerDelegate {
    @IBOutlet weak var playerList: UIPickerView!

    var playerData: [[String]] = [[String]]()

    func viewDidLoad() {
        super.viewDidLoad

        playerData = [["1", "2", "3"],["a","b","c"],["i","ii","iii"],["!","@","#"]]

        // Connect data:
        self.playerList.delegate = self
        self.playerList.dataSource = self
    }

    // The number of columns of data
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 4
    }

    // The number of rows of data
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return playerData.count
    }

    // The data to return for the row and component (column) that's being passed in
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return playerData[component][row]
    }
}

我不断得到:

线程 1:致命错误:索引超出范围

标签: swift

解决方案


numberOfComponents应该采用二维数组中外部数组的大小。

你的代码:

func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 4
}

这每次都返回 4。假设您缩短了数组,并且只有 3 个子数组。它会抛出这个错误,因为 pickerView 期望从你的数组中再增加一行,只有 3 行。所以它尝试访问第 4 个索引并发现它是无效的。

解决方案:

func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return playerData.count
}

将相同的逻辑应用于您的numberOfRowsInComponent.

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return playerData[component].count
}

推荐阅读