Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Uitableview Swift 3中的索引超出范围(具有可展开行的表)_Uitableview_Swift3_Swift2_Tableviewcell - Fatal编程技术网

Uitableview Swift 3中的索引超出范围(具有可展开行的表)

Uitableview Swift 3中的索引超出范围(具有可展开行的表),uitableview,swift3,swift2,tableviewcell,Uitableview,Swift3,Swift2,Tableviewcell,你好,我正在尝试在我的应用程序上制作一个商店页面。商店页面包含一个标题为可单击的表,因此它会扩展为该标题的子类别。等点击咖啡,并获得一些不同种类的咖啡购买 标题=下图中的饮料、三明治和饮料 标题的子类别=火腿和奶酪、鸡肉、培根和咖喱。。。。等等 现在,扩展和关闭标题工作正常。但当我按+(将iteem添加到购物车)时,如果按特定顺序单击,我会得到一个out of index 如果我展开三明治(如图中所示),然后展开饮料(三明治下面的一个),然后单击三明治中任何子类别的加号,然后再次关闭三明治,再

你好,我正在尝试在我的应用程序上制作一个商店页面。商店页面包含一个标题为可单击的表,因此它会扩展为该标题的子类别。等点击咖啡,并获得一些不同种类的咖啡购买

标题=下图中的饮料、三明治和饮料

标题的子类别=火腿和奶酪、鸡肉、培根和咖喱。。。。等等

现在,扩展和关闭标题工作正常。但当我按+(将iteem添加到购物车)时,如果按特定顺序单击,我会得到一个out of index

如果我展开三明治(如图中所示),然后展开饮料(三明治下面的一个),然后单击三明治中任何子类别的加号,然后再次关闭三明治,再按饮料中任何子类别的加号(现在关闭的三明治下面的一个),应用程序将崩溃,并出现索引外错误。只有这种组合才会产生这种错误

代码的工作原理:

   /*  Create Cells    */
   func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -
  > UITableViewCell {
    // Row is DefaultCell


    if let rowData = destinationData?[indexPath.row] {
        let defaultCell = Bundle.main.loadNibNamed("TableViewCellMenuItems", owner: self, options: nil)?.first as! TableViewCellMenuItems

        //            tableView.dequeueReusableCell(withIdentifier: "TableViewCellMenuItems", for: indexPath).first as! TableViewCellMenuItems
        defaultCell.menuName.text = rowData.name
        defaultCell.menuPicture.image = rowData.image
        defaultCell.menuFoldPic.image = #imageLiteral(resourceName: "ic_keyboard_arrow_down")

        defaultCell.selectionStyle = .none
        return defaultCell
    }
        // Row is ExpansionCell
    else {
        if let rowData = destinationData?[getParentCellIndex(expansionIndex: indexPath.row)] {
            //            print("her åbner vi")


            //                //  Create an ExpansionCell
            let expansionCell =
                Bundle.main.loadNibNamed("TableViewCellMenuItemExpanded", owner: self, options: nil)?.first as! TableViewCellMenuItemExpanded

            //  Get the index of the parent Cell (containing the data)
            let parentCellIndex = getParentCellIndex(expansionIndex: indexPath.row)


            //  Get the index of the flight data (e.g. if there are multiple ExpansionCells
            let flightIndex = indexPath.row - parentCellIndex - 1

            //  Set the cell's data
            expansionCell.itemPrice.text = String (describing: "\(rowData.menuItems![flightIndex].price) kr")
            expansionCell.itemName.text = rowData.menuItems?[flightIndex].name
            expansionCell.itemCount.text = String (describing: rowData.menuItems![flightIndex].count)
            //                expansionCell.itemCount.text = String (describing: indexPath.row)
            expansionCell.itemAdd.tag = Int(indexPath.row)
            expansionCell.itemMinus.tag = Int(indexPath.row)


            expansionCell.itemAdd.addTarget(self, action: #selector(HomeSelectedShopViewController.plus(_:)), for: .touchUpInside)


            expansionCell.itemMinus.addTarget(self, action: #selector(HomeSelectedShopViewController.minus(_:)), for: .touchUpInside)

            expansionCell.selectionStyle = .none
            return expansionCell
        }
    }
    return UITableViewCell()
}
正如您所看到的,expansionCells为我的函数加号和减号获得一个标记(这样我就可以知道应该加上或减哪个indexath)

附加功能:

 func plus(_ sender: AnyObject?) {

    if let rowData = destinationData?[getParentCellIndex(expansionIndex: sender!.tag)] {

        self.table.reloadData()

        //  Get the index of the parent Cell (containing the data)
        let parentCellIndex = getParentCellIndex(expansionIndex: sender!.tag)


        //  Get the index of the flight data (e.g. if there are multiple ExpansionCells
        let flightIndex = sender!.tag - parentCellIndex - 1

        print(sender!.tag)
        print(flightIndex)
        print(rowData.menuItems!.count)

        var con = 0;
        for a in rowData.menuItems! {
            print("her er navn : \(a.name) og her er id  \(con)")
            con += 1
        }

        let data = rowData.menuItems![flightIndex]

        let item = Items(name: data.name, price: data.price, count: data.count)


        var counter = 0;
        for x in self.basket {

            if(x.name == item.name || x.price == item.price)
            {
                counter = counter+1;
            }

        }

        if(counter >= 99)
        {

        }
        else
        {
            DispatchQueue.main.async {

                self.basket.append(item)

                self.updateBasket()
                rowData.menuItems![flightIndex].count = rowData.menuItems![flightIndex].count+1;
                self.table.reloadData()

            }
        }


    }

}
其余功能:

/*  Expand cell at given index  */
private func expandCell(tableView: UITableView, index: Int) {
    //        print("when is this run 1")
    // Expand Cell (add ExpansionCells
    if let flights = destinationData?[index]?.menuItems {
        for i in 1...flights.count {
            destinationData?.insert(nil, at: index + i)
            tableView.insertRows(at: [NSIndexPath(row: index + i, section: 0) as IndexPath] , with: .top)
        }
    }
}

/*  Contract cell at given index    */
private func contractCell(tableView: UITableView, index: Int) {
    //        print("when is this run 4")
    if let flights = destinationData?[index]?.menuItems {
        for i in 1...flights.count {
            destinationData?.remove(at: index+1)
            tableView.deleteRows(at: [NSIndexPath(row: index+1, section: 0) as IndexPath], with: .top)

        }
    }
}

/*  Get parent cell index for selected ExpansionCell  */
private func getParentCellIndex(expansionIndex: Int) -> Int {
    //        print("when is this run 5")
    var selectedCell: Menu?
    var selectedCellIndex = expansionIndex


    while(selectedCell == nil && selectedCellIndex >= 0) {
        selectedCellIndex -= 1
        selectedCell = destinationData?[selectedCellIndex]
    }

    return selectedCellIndex
}

func minus(_ sender: AnyObject?) {

    if let rowData = destinationData?[getParentCellIndex(expansionIndex: sender!.tag)] {
        //  Get the index of the parent Cell (containing the data)
        let parentCellIndex = getParentCellIndex(expansionIndex: sender!.tag)


        //  Get the index of the flight data (e.g. if there are multiple ExpansionCells
        let flightIndex = sender!.tag - parentCellIndex - 1

        let data = rowData.menuItems![flightIndex]

        let item = Items(name: data.name, price: data.price, count: data.count)

        DispatchQueue.main.async {


            var counter = 0;
            for x in self.basket {

                if(x.name == item.name || x.price == item.price)
                {
                    if(item.count == 0)
                    {
                        break
                    }
                    else
                    {
                        self.basket.remove(at: counter)
                        self.updateBasket()
                        rowData.menuItems![flightIndex].count = rowData.menuItems![flightIndex].count-1;
                        self.table.reloadData()

                        break
                    }

                }
                counter = counter+1;
            }

        }
    }

}


func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if let data = destinationData?[indexPath.row] {

        // If user clicked last cell, do not try to access cell+1 (out of range)
        if(indexPath.row + 1 >= (destinationData?.count)!) {


            expandCell(tableView: tableView, index: indexPath.row)
        }
        else {
            // If next cell is not nil, then cell is not expanded
            if(destinationData?[indexPath.row+1] != nil) {

                expandCell(tableView: tableView, index: indexPath.row)



            } else {

                contractCell(tableView: tableView, index: indexPath.row)

            }
        }
    }
}
我真的不知道如何解决这个问题,我只知道plus函数超出了这个位“let data=rowData.menuItems![flightIndex]”的范围