1

J'ai placé UICollectionView à l'intérieur d'une cellule de tableau dans la page d'accueil. Chaque rangée de catégorie a son image de contenu.
Mais, mon problème est que lorsque j'exécute l'application, les images sous la deuxième rangée/deuxième catégorie n'apparaissent pas chaque fois que je lance l'application.
Les images montreront après que je clique sur plus de bouton et il ira aux détails UI. Ensuite, je clique sur le bouton Retour et j'atteins la page d'accueil. À ce moment, les images s'affichent correctement.
J'ai essayé beaucoup de codes mais je ne sais pas où c'est faux.
UICollection Afficher à l'intérieur de la cellule Table n'affiche pas les images dans Swift 3

enter image description here

override func viewWillLayoutSubviews() { 
    super.viewWillLayoutSubviews() 
    tableView.reloadData() 
    self.tableView.reloadData() 
    self.tableView.layoutIfNeeded() 
} 

override func viewDidAppear(_ animated: Bool) { 
    tableView.reloadData() 
} 

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 

    //getSearchWords() 
    DispatchQueue.main.async { 
     self.tableView.reloadData() 

    } 
    self.tableView.reloadData() 
    self.tableView.layoutIfNeeded() 
} 

    override func viewDidLoad() { 

    DispatchQueue.main.async { 
     self.tableView.reloadData() 
    } 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    // debugPrint("HOme Table View Cell") 

    let cell = tableView.dequeueReusableCell(withIdentifier: "homecell") as! HomeCategoryRowCell 
    let list = sections[(indexPath as NSIndexPath).row] 

    cell.setCollectionViewDataSourceDelegate(self, forRow: indexPath.row) 
    cell.collectionViewOffset = self.storedOffsets[indexPath.row] ?? 0 

    DispatchQueue.main.async { 
     cell.categoryTitle.text = list.package_name 
     cell.mainAssociatedURL.text = list.package_url 
    } 
    cell.categoryTitle.font = UIFont.boldSystemFont(ofSize: 17.0) 
    cell.collectionView.tag = indexPath.row 
    cell.parentVC = self 
    cell.collectionView.reloadData() 

    return cell 
} 


extension Home : UICollectionViewDelegate, UICollectionViewDataSource { 

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 

    return sections[collectionView.tag].packageTable.count 
} 

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

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "videoCell", for: indexPath) as! HomeVideoCell 

     let list = sections[collectionView.tag].packageTable[indexPath.row] 

     if(list.poster_image_url != StringResource().posterURL){ 
      let url = NSURL(string: list.poster_image_url) 
      do{ 
       if let url = url { 
        _ = try Data(contentsOf:url as URL) 
        poster_url = list.poster_image_url 
       } 
      }catch let error { 
       //debugPrint("ERRor ::\(error)") 
       poster_url = StringResource().posterURL 
      } 
     }else{ 
      poster_url = StringResource().posterURL 
     } 


     AsyncImageLoader.sharedLoader.imageForUrl(urlString: poster_url) { (image, url) ->() in 
      DispatchQueue.main.async(){ 

       cell.movieTitle.text = list.name 
       if(url == StringResource().posterURL){ 
        cell.imageView.image = UIImage(named: "sample_cover") 
       }else{ 
        cell.imageView.image = image 
       } 
      } 
     } 

    // cell.layer.shouldRasterize = true 
    // cell.layer.rasterizationScale = UIScreen.main.scale 

    return cell 

} 

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 

    print("Home Collection view at row \(collectionView.tag) selected index path \(indexPath)") 

    let list = sections[collectionView.tag].packageTable[indexPath.row] 
    self.prefs.set(list.poster_image_url, forKey: "poster_image_url") 
    self.prefs.set(list.name, forKey: "name") 
    self.prefs.set(list.assets_id, forKey: "VEDIO_ID") 

    debugPrint(list.name) 
    debugPrint(list.assets_id) 


} 
} 

Ces codes ci-dessus sont écrits en Home.swift.

Dans HomeCell.swift,

class HomeCell : UITableViewCell { 


var parentVC: UIViewController? 

@IBOutlet weak var collectionView: UICollectionView! 
@IBOutlet weak var categoryTitle: UILabel! 
@IBOutlet weak var SeeAll: UIButton! 
@IBOutlet weak var mainAssociatedURL: UILabel! 

let prefs:UserDefaults = UserDefaults.standard 
var catId: String! = "" 
var associated_url: String! 

override func awakeFromNib() { 
    super.awakeFromNib() 

    SeeAll.setTitle(NSLocalizedString("See All >", comment: ""), for: .normal) 
    SeeAll.titleLabel!.font = UIFont (name: "Tharlon", size: 14) 

} 
@IBAction func btnSeeAll(_ sender: Any) { 

    catId = categoryTitle.text! 
    associated_url = mainAssociatedURL.text! 

    self.prefs.setValue(1, forKey: "PROVIDER_ID") 
    self.prefs.set(catId, forKey: "PROVIDER_NAME") 
    self.prefs.set(associated_url, forKey: "associated_url") 
} 

override func layoutSubviews() { 
    super.layoutSubviews() 
    collectionView.collectionViewLayout.invalidateLayout() 
} 
} 

extension HomeCategoryRowCell { 
    func setCollectionViewDataSourceDelegate<D: UICollectionViewDataSource & UICollectionViewDelegate>(_ dataSourceDelegate: D, forRow row: Int) { 

     self.collectionView.delegate = dataSourceDelegate 
     self.collectionView.dataSource = dataSourceDelegate 
     self.collectionView.tag = row 
     self.collectionView.setContentOffset(self.collectionView.contentOffset, animated:false) // Stops collection view if it was scrolling. 
     self.collectionView.reloadData() 
} 

var collectionViewOffset: CGFloat { 

    get { return collectionView.contentOffset.x } 

    set { collectionView.contentOffset.x = newValue } 
} 
} 

Quelqu'un peut-il me aider s'il vous plaît?

+0

Votre code partagé qui ne signifie rien du tout. Vous rechargez simplement la vue de la table. Code de partage comment vous avez ajouté la vue de collection. – ridvankucuk

+0

@ridvankucuk, je télécharge mes codes bro. S'il te plaît vérifie le. –

Répondre

0

Modifiez le contrôleur comme ci-dessous, vous appelez trop de reloadData.

override func viewWillLayoutSubviews() { 
    super.viewWillLayoutSubviews() 
    self.tableView.layoutIfNeeded() 
} 

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 

//getSearchWords() 
    DispatchQueue.main.async { 
     self.tableView.reloadData() 
    } 
    self.tableView.layoutIfNeeded() 
} 

override func viewDidLoad() { 
     super.viewDidLoad() 

    tableView.delegate = self 
    tableView.dataSource = self 
} 

et ajouter:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
      tableView .deselectRow(at: indexPath, animated: false) 
}