致命错误:单击特定单元格进行 segue 时索引超出范围

Posted

技术标签:

【中文标题】致命错误:单击特定单元格进行 segue 时索引超出范围【英文标题】:Fatal error: Index out of range when click specific cells for segue 【发布时间】:2019-06-07 12:33:20 【问题描述】:

我正在尝试创建一个 segue,因此每次单击 tableView 行时,都会显示另一个带有特定行信息的 ViewController。

我从 Firestore 填充我的数据。

基本上每个文档都包含一个数组,然后我按行填充数组的字符串

var ingredientsArray = [Ingredients]()

func numberOfSections(in tableView: UITableView) -> Int 
        return ingredientsArray.count
    

     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return ingredientsArray[section].compName.count
    

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        tableView.deselectRow(at: indexPath, animated: true)

        performSegue(withIdentifier: "SearchDetails", sender: self)
    


     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "IngredientCell", for: indexPath) as! IngredientTableViewCell

        cell.populate(ingredient: ingredientsArray[indexPath.section])
        let item1 = ingredientsArray[indexPath.section].compName[indexPath.row]
        cell.ingredientNameLabel.text = ("\(item1)")

        return cell
    

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        if let destination = segue.destination as? DetailViewController

//HERE IS THE ERROR.
            destination.ingredient = ingredientsArray[(tableView.indexPathForSelectedRow?.row)!]

        
    

当我单击某些行时,我的应用程序崩溃并出现致命错误:索引超出范围

DetailViewController


class DetailViewController: UIViewController 

    @IBOutlet weak var compNameLbl: UILabel!

    var ingredient : Ingredients?

    override func viewDidLoad() 
        super.viewDidLoad()

        compNameLbl.text = "\((ingredient?.compName)!)"


    

当我尝试在标签中显示名称时,整个数组都会出现。

【问题讨论】:

什么意思?我怎么能看到? 使用destination.ingredient = ingredientsArray[(tableView.indexPathForSelectedRow?.section)!] 非常感谢。我只需要将行更改为部分。最后一件事,当我单击行时,我想在 compNameLbl 中显示行的名称,但我得到了整个数组。 【参考方案1】:

compName数组中获取字符串值并传值

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if let destination = segue.destination as? DetailViewController, let indexPath = tableView.indexPathForSelectedRow 
        destination.ingredient = ingredientsArray[indexPath.section].compName[indexPath.row]
    

DetailViewController中的ingredient类型改为String

class DetailViewController: UIViewController     
    @IBOutlet weak var compNameLbl: UILabel!
    var ingredient : String?
    override func viewDidLoad() 
        super.viewDidLoad()
        compNameLbl.text = ingredient
    

【讨论】:

工作就像一个魅力。谢谢!

以上是关于致命错误:单击特定单元格进行 segue 时索引超出范围的主要内容,如果未能解决你的问题,请参考以下文章

CollectionView - 致命错误:索引超出范围 - 比视图显示的单元格多

在 Segue 中点击 TableView 单元格返回 Nil

致命错误:索引超出范围搜索项目

致命错误:索引超出范围的两个自定义单元格

无法识别单击单元格后的 tableView segue

当原型单元不工作时如何使用segue