CollectionView cellForItemAt никогда не запускается - PullRequest
0 голосов
/ 16 октября 2018

Привет, я много искал и не мог получить подходящий ответ.Я пытаюсь заполнить collectionView данными, полученными в Интернете с помощью API.Данные возвращаются, но collectionView cellForItemaAt никогда не запускается, потому что, когда я использую операторы печати, ничего не отображается.

Не могу понять, в чем проблема, я посмотрел эти ссылки, но они не помогли:

collectionView cellForItemНе вызывается

cellForItemAt не вызывается в collectionView

cellForItemAt, никогда не вызываемый в классе, расширяет UICollectionViewController

вот метод cellForItemAt:

 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
    {

        collectionView.dequeueReusableCell(withReuseIdentifier: "ItemCollectionViewCell", for: indexPath) as! ItemCollectionViewCell
            cell.ItemNameLabel.text = itemArray[indexPath.row].name

            print(itemArray[indexPath.row].name)

            cell.priceLable.text = itemArray[indexPath.row].price + " " + itemArray[indexPath.row].currency

            guard let url : URL = URL(string:  itemArray[indexPath.row].image) else {return cell}

            cell.imageView.sd_setShowActivityIndicatorView(true)
            cell.imageView.sd_setIndicatorStyle(.gray)
            cell.imageView.sd_setImage(with: url, placeholderImage: UIImage(named:"placeholderImage"), options: .refreshCached, completed: nil)


            return cell

        }

вот метод, который я использую для извлечения данных:

 func getAllItemsApiMethod()
    {
        itemArray.removeAll()
        if Reachability.sharedInstance.connectedToNetwork()
        {
            if searchShops == true {
                PostDict = ["page" : pageNumber ,"text" : searchKeyword,"searchShop" : "1"]
            }else{
                   PostDict = ["page":"1","text":searchKeyword]
            }

            print(PostDict)

            StartIndicator()
            WebServices.getItemsMethod(url: itemsUrl, parameters: PostDict) { (JsonResponse) in
                print(JsonResponse)
                StopIndicator()
                let json : JSON = JSON(JsonResponse)


               self.updateItemData(json: json)



                print(json)
            }
        }
        else
        {
            FTIndicator.showToastMessage(Constant.NoInternet)
        }

    }


    func updateItemData (json : JSON) {
        let item = Item()

        for i in 0...json["data"].count - 1{
            item.name = json["data"][i]["title_ku"].stringValue
            item.price = json["data"][i]["price"].stringValue
            item.image = json["data"][i]["image"].stringValue
            item.currency = json["data"][i]["currency"].stringValue


        }

      //  useItemsCell = true
         self.collectionViewHome.reloadData()
    }

, а вот метод, который я использую для вызова getAllItemsAPI:

func textFieldShouldReturn(_ textField: UITextField) -> Bool {


        guard let searchKeyword = txtFldSearch.text else {return false}

        getAllItemsApiMethod()


        collectionViewHome.reloadData()

        self.view.endEditing(true)
        txtFldSearch.text = ""


        return true

    }

вотМетод numberOfItems:

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
{
    return itemArray.count

}

Я также установил методы datasource и collectionViewDelegate как self.

Я довольно долго искал ответ, чтобы найти ответ.Любая помощь очень ценится

1 Ответ

0 голосов
/ 16 октября 2018

В вашем методе updateItemData вы анализируете ваш JSON, но я не вижу, чтобы вы добавляли эти элементы в любой объект источника данных.Вы просто перебираете коллекцию, но ничего не делаете с ней, поэтому при перезагрузке collectionView ваш источник данных все еще пуст.Убедитесь, что вы добавляете элементы в ваш itemArray:

func updateItemData (json : JSON) {

    itemArray = []
    for i in 0...json["data"].count - 1{
        let item = Item()
        item.name = json["data"][i]["title_ku"].stringValue
        item.price = json["data"][i]["price"].stringValue
        item.image = json["data"][i]["image"].stringValue
        item.currency = json["data"][i]["currency"].stringValue
        itemArray.append(item)
    }

  //  useItemsCell = true
     self.collectionViewHome.reloadData()
}

Также, если ваш обратный вызов API происходит в неосновном потоке, убедитесь, что вы отправляете collectionViewHome.reloadData() в основной, как кто-то упоминал в комментарии.

...