I learned the UICollectionView inside UITableViewCell from this tutorial.
It works perfectly only when all of the collection views have the same numberOfItemsInSection, so it can scroll and won't cause Index out of range error, but if the collection view cells numberOfItemsInSection are different, when I scroll the collection view it crashes due to Index out of range.
I found the reason that when I scroll the tableview, the collection view cell index path updated according to the bottom one, but the collection view I scrolled is top one so it does't remember the numberOfItemsInSection, so it will crash due to Index out of range.
ps: it is scrollable, but only when that table cell at the bottom, because its numberOfItemsInSection is correspond to that cell and won't cause Index out of range.
This is the numberOfItemsInSection of My CollectionView, i actually have two collection view but i think this is not the problem
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        var numberOfItemsInSection: Int = 0
        if collectionView == self.collectionview_categorymenu {
            let categories = self.json_menucategory["menu_categories"].arrayValue
            numberOfItemsInSection = categories.count
        } else {
            let menuitems = self.json_menucategory["menu_items"].arrayValue
            let item_data = menuitems[self.itemimages_index].dictionaryValue
            let menu_item_images = item_data["menu_item_images"]?.arrayValue
            numberOfItemsInSection = (menu_item_images?.count)!
            print(numberOfItemsInSection)
        }
        return numberOfItemsInSection
    }
This is the cellForItemAt indexPath of my CollectionView:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        if collectionView == self.collectionview_categorymenu {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CategoryMenuCell", for: indexPath) as! CategoryMenuCell
            return cell
        } else {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ItemImagesCell", for: indexPath) as! ItemImagesCell
            let menuitems = self.json_menucategory["menu_items"].arrayValue
            let item_data = menuitems[self.itemimages_index].dictionaryValue
            let menu_item_images = item_data["menu_item_images"]?.arrayValue
            print(menu_item_images!)
            let itemimage_data = menu_item_images?[indexPath.item].dictionaryValue
            print("===\(indexPath.item)===")
            let itemimage_path = itemimage_data?["image"]?.stringValue
            let itemimage_detail = itemimage_data?["detail"]?.stringValue
            if let itemimage = cell.imageview_itemimage {
                let image_url = itemimage_path?.decodeUrl()
                URLSession.shared.dataTask(with: NSURL(string: image_url!) as! URL, completionHandler: { (data, response, error) -> Void in
                    if error != nil {
                        print("error")
                        return
                    }
                    DispatchQueue.main.async(execute: { () -> Void
                        in
                        itemimage.image = UIImage(data: data!)!
                    })
                }).resume()
            }
            if let description = cell.textview_description {
                description.text = itemimage_detail
            }
            if let view = cell.view_description {
                view.isHidden = true
            }
            return cell
        }
    }
 
     
    