2017-07-24 5 views
0

Ich habe derzeit eine Tabellenansicht mit einer uicollectionview innerhalb der Zellen, die geladen werden. Ich habe gerade zwei Probleme mit Tableview-Zellen.Paar Probleme mit TableViewCell

1) Die erste Zelle in der Tabellenansicht soll einen violetten Hintergrund haben, aber sie erscheint bei der anfänglichen Belastung weiß. Ich habe versucht, den Code in den Initialisierer zu setzen, aber das macht alle Zellen als Zelle 0 geladen und somit wird jede Zelle violett; nur wenn ich sie in die draw() Funktion setze, zeichnen sie richtig, mit Ausnahme der ersten Zelle.

2) Ich habe ein Problem mit den Zellen falsch neuladen, wenn sie aus dem Bildschirm gehen, was passieren wird, wenn die Zellen in die que gelegt werden, es vermasselt was der Inhalt der Zellen ist und immer neu zeichnen; Ich habe versucht, die collectionView-Datenquelle zu löschen und neu zu laden, aber ich kann es anscheinend nicht richtig machen; Ich will nur nicht, dass die Zellen in den falschen Zellen neu gezeichnet werden; Mit anderen Worten, in der ersten Zelle, die ausschließlich violett sein soll, erscheint in der Zelle ein Sammlungsansicht, nachdem sie vom Bildschirm verschwunden ist. Ich benutze PrepareForReuse, habe aber kein Glück, die Collectionsview zu löschen. Hier

ist der Tableview-Code für die cellForItem:

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

     let cell = self.tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath as IndexPath) as! DiscoverTVC 
     print("The index path is \(indexPath.row)") 
     cell.indexPathNum = indexPath.row 
     return cell 
} 

Hier ist mein customCell selbst:

import UIKit 

class DiscoverTVC: UITableViewCell, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout { 


    var hasLoaded = false 

    var collectionView : UICollectionView! 
    var cellId = "Cell" 
    var index = 0 
    var indexPathNum = 0 


    override func prepareForReuse() { 
     super.prepareForReuse() 
     collectionView.dataSource = self 
     collectionView.reloadData() 

    } 

    override func draw(_ rect: CGRect) { 

     print(indexPathNum) 

     /** Setting up labels in each TableView Cell **/ 
     let cellLabelHeader = UILabel() 

     /** Collection View within the Tableview **/ 
     let flowLayout : UICollectionViewFlowLayout = UICollectionViewFlowLayout() 
     flowLayout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) 
     flowLayout.scrollDirection = .horizontal 

     /** The Indexing of cells within the TableView **/ 
     if indexPathNum == 0 { 

      self.backgroundColor = UIColor.purple 

     } else 

      if ((indexPathNum == 1) || (indexPathNum == 3)) { 

       /** Setting up the Collection View within the Tableviews **/ 

       self.collectionView = UICollectionView(frame: CGRect(x: self.bounds.width * 0, y: self.bounds.height/3, width: self.bounds.width, height: self.bounds.height/1.8), collectionViewLayout: flowLayout) 
       collectionView.register(DiscoverCVC.self, forCellWithReuseIdentifier: cellId) 
       collectionView.delegate = self 
       collectionView.dataSource = self 
       collectionView.backgroundColor = UIColor.clear 
       self.addSubview(collectionView) 

       index = indexPathNum 



      } else 

       if ((indexPathNum == 2) || (indexPathNum == 4)) { 



        /** Setting up the Collection View within the Tableviews **/ 

        self.collectionView = UICollectionView(frame: CGRect(x: self.bounds.width * 0, y: self.bounds.height/8.5, width: self.bounds.width, height: self.bounds.height/1.15), collectionViewLayout: flowLayout) 
        collectionView.register(DiscoverCVC.self, forCellWithReuseIdentifier: cellId) 
        collectionView.delegate = self 
        collectionView.dataSource = self 
        collectionView.backgroundColor = UIColor.clear 
        self.addSubview(collectionView) 

        index = indexPathNum 


     } 




    } 



    override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 
     super.init(style: style, reuseIdentifier: reuseIdentifier) 
    } 




    /** Collection View Overloads **/ 

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



    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
    { 
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! DiscoverCVC 

     cell.backgroundColor = UIColor.clear 


     return cell 
    } 

    var width : CGFloat = 0 

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 


     if index == 1 || index == 3 { 
      width = (collectionView.bounds.height) 
     } else { 
      width = (collectionView.bounds.height)/4 
     } 


     return CGSize(width:width, height:width) 
    } 


    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     fatalError("init(coder:) has not been implemented") 
    } 



} 

Wenn die Zelle losgeht Bildschirm & ich zu ihm zurückkehren, um die App stürzt ab und sagt es unerwartetes gefunden Null bei: collectionView.dataSource = self

+0

Ich will nicht hart klingen ... Sie haben zu viel schief geht es hier zu adressieren. Also - finde und durchlebe einige Tutorials, in denen du einfache Zellen, dann komplexe Zellen verwendest und dann Zellen wie deine über Code anstelle von Storyboard-Prototypen usw. erstellst. Dann fang an, alles zusammenzusetzen. ** Währenddessen ... ** Wenn Sie auf ein Tutorial stoßen, das Ihnen sagt, dass Sie Subview() * inside * 'override func draw (_rect: CGRect) instanziieren und hinzufügen sollen' '? Gehe niemals zurück auf diese Website. – DonMag

+0

Verfügen Sie über Ressourcen, mit denen ich arbeiten/forschen kann? – AndrewS

Antwort

0

Sie nicht wirklich kontrollieren, wenn func draw(_ rect: CGRect) aufgerufen wird, so, Sie sollten d Erstellen Sie Sammlungsansicht in func awakeFromNib(), da es nur einmal für jede Zelle aufgerufen wird. Hintergrundfarbe können Sie direkt wie folgt ändern

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = self.tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath as IndexPath) as! DiscoverTVC 
    print("The index path is \(indexPath.row)") 
    if indexPath.row == 0 { 
     cell.backgroundColor = UIColor.purple 
    } 
    return cell 
} 
+0

Wenn ich watchFromNib verwende, wie würde ich die collectionView-Zellen in prepareForReuse zurücksetzen, damit sie sich nicht überschneiden und weiter zeichnen? – AndrewS

+0

Also habe ich versucht, den Code in watchFromNib setzen und nichts in den Zellen erscheint? – AndrewS

0

Warum können Sie benutzerdefinierte Zelle in Storyboard erstellen und verwenden. Und für die Zelle in cellForRowAtIndexPath Methode tun in Farbeinstellung wie

if (indexPath.row == 0) {cell.backgroundColor = UIColor.purple}