UICollectionView-Zellen mit Bildern innerhalb des UITableView-Prototyps

UPDATE: Ich habe mein Hauptproblem behoben, bei dem korrekte Bilder erst beim Scrollen in der collectionView geladen wurden. Ich habe der tableView eine collectionView.reloadData () hinzugefügt: cellForRowAtIndexPath. Ich habe auch einige Änderungen vorgenommen, um das Sequenzarray vorab zu laden, anstatt es zu erstellen, während ich durch die Tabelle scrolle (tableView: cellForRowAtIndexPath).

Fügte die Updates zu GitHub hinzu, wenn Sie interessiert sind.
https: //github.com/Druiced/OpenDec

Ich werde nachverfolgen, wenn ich herausgefunden habe, wie ich verhindern kann, dass die App abstürzt, wenn ein dynamischer Wert in die Rückgabe gestellt wird (wenn ich diesen Wert auf 15 setze, stürzt die App nicht ab):

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return count(Array(sequenceArray[collectionView.tag])) / 2
}

ORIGINAL POST: Bitte um Anleitung.

Dieses Tutorial hat mir gezeigt, dass dies mit meiner DataSource / meinem Delegaten zu tun haben muss. Der Autor erstellt die Zelle mit addSubview, anstatt die Vorteile der Xcode-Prototypzelle zu nutzen. Dies scheint eine coole Sache zu sein, daher versuche ich, dies zu tun.http: //ashfurrow.com/blog/putting-a-uicollectionview-in-a-uitableviewcel

Jegliche Kritik an meinem Ansatz oder der Nichteinhaltung von Best Practices ist willkommen.

Jede Zelle in der Tabelle hat eine UICollectionView. Jede Zelle in der Sammlungsansicht zeigt ein Bild in der Reihenfolge der gespeicherten Zeichenfolge "Sequenz" an. Beispiel: "ADKDQDJDTD" Link zu AD.png KD.png QD.png JD.png TD.png

Ich habe zwei Probleme, an denen ich scheinbar nicht vorbeikomme.

numberOfItemsInSection wird verrückt, wenn die Anzahl der Karten von der Array-Länge abhängt (return handArray.count / 2). Wenn ich eine feste Nummer eingebe, funktioniert die App, ist aber nicht sehr clever.Wenn die Tabelle zum ersten Mal angezeigt wird, werden die richtigen Karten erst angezeigt, wenn ich in der Tabelle nach oben und unten scrolle. Außerdem kreuzen sich die Daten für die einzelnen CollectionView-Objekte, da beim schnellen Auf- und Abwärtsscrollen die falschen Karten angezeigt werden.

Ich bin mir fast sicher, dass dies damit zu tun hat, wie meine Datenquelle eingerichtet ist.

DeckTableViewController.swift

import UIKit
import Parse

var deviceID: String?
var noRefresh: Bool?
var sequenceArray: Array<Character>?

class DeckTableViewController: UITableViewController, UICollectionViewDelegate, UICollectionViewDataSource {
var handArray: Array<Character>!
var timeLineData:NSMutableArray = NSMutableArray()

override func viewDidLoad() {
    super.viewDidLoad()
    noRefresh = false
    deviceId = UIDevice.currentDevice().identifierForVendor.UUIDString
}

override func viewDidAppear(animated: Bool) {
    if noRefresh == false {
        loadData()
        noRefresh = true
    }
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return timeLineData.count
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell:DeckTableViewCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! DeckTableViewCell

    let deck:PFObject = timeLineData.objectAtIndex(indexPath.row) as! PFObject

    cell.collectionView.dataSource = self
    cell.collectionView.delegate = self

    let sequenceTemp = deck.objectForKey("Sequence") as! String
    handArray = Array(sequenceTemp)
    cell.sequenceId.setTitle(deck.objectId, forState: UIControlState.Normal)
    cell.cardCountLabel.text = "\((count(sequenceTemp)/2))"

    // Date to String Stuff
    var dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "(MM-dd) hh:mm:ss"
    cell.timeLabel.text = dateFormatter.stringFromDate(deck.updatedAt!)

    let layout:UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    layout.itemSize = CGSizeMake(99, 140)
    layout.scrollDirection = UICollectionViewScrollDirection.Horizontal

    cell.collectionView.collectionViewLayout = layout

    return cell
}


func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return handArray.count / 2
}

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

    let cell:TableCollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! TableCollectionViewCell
    var bcolor : UIColor = UIColor.orangeColor()
    cell.layer.borderColor = bcolor.CGColor
    cell.layer.borderWidth = 2
    cell.layer.cornerRadius = 3

    var firstLetter: Character!
    var secondLetter: Character!

    //Building card file names from Sequence data
    if (indexPath.row * 2) + 1 <= handArray.count {

        firstLetter = handArray[indexPath.row * 2]
        secondLetter = handArray[indexPath.row * 2 + 1]
        let imageNameString = "\(firstLetter)\(secondLetter).png"
        let front = UIImage(named: imageNameString)
        cell.ImageView.backgroundColor = UIColor.orangeColor()
        cell.ImageView.image = front

    }

    return cell
}

DeckTableViewCell.swift

import UIKit

class DeckTableViewCell: UITableViewCell, UITextViewDelegate {

    @IBOutlet var collectionView: UICollectionView!
    @IBOutlet var sequenceId: UIButton!
    @IBOutlet var timeLabel: UILabel!
    @IBOutlet var cardCountLabel: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

    }
}

TableCollectionViewCell.swift

import UIKit

class TableCollectionViewCell: UICollectionViewCell {

    @IBOutlet var ImageView: UIImageView!

}

Für dieses Beispiel habe ich (return handArray.count / 2) auf 10 gesetzt und 3 Sequenzen geladen. Die Zahl in der oberen Mitte gibt die Anzahl der Karten für jede Reihe an. Beachten Sie, dass die CollectionView nicht mit den richtigen Karten aktualisiert wird, sondern Daten aus den anderen CollectionViews aufnimmt. WENN ich dieser Mischung eine Menge weiterer Sequenzen hinzufüge, werden beim Scrollen nach oben und unten die richtigen Karten MANCHMAL belegt, aber unvorhersehbar.

Danke für alle Vorschläge, ich freue mich, zum Zeichenbrett zurückzukehren. Pros

Antworten auf die Frage(2)

Ihre Antwort auf die Frage