2016-04-22 14 views
0

Ich habe einen UICollectionView mit 16 Zellen. 1 der Zellen (die Game Over-Zelle) muss zufällig sein. Ich möchte die Game Over-Zelle in der Sammlungsansicht randomisieren.UICollectionView mit randomisierter reuseIdentifiers in 1 Abschnitt

Ich habe es arbeiten etwas von verschiedenen Abschnitten verwendet wird, aber das dem Zweck des optisch mit dem 16.

Mischen in Ich hatte auch etwas arbeiten sie durch eine Reihe von Zeichenfolgen zu schaffen, einer der Saiten zu sein " GameOver "- und dann habe ich das Array gemischt, um anzupassen, wie diese Zelle erscheint.

das auch nicht funktioniert, weil es nicht die Kontrolle über das Spiel über Zelle gegeben hat mir IB.

Wie kann ich das Storyboard durch die Schaffung von zwei Prototypen Zellidentifikatoren, über Zellen 1 des Spiels randomisieren, und 15 normale Zellen auf einer Sammlung Ansicht von 16 gesamt Zellen?

+0

konnte zeigen Sie den Code für das, was Sie Strom haben? – kye

Antwort

1

Hier ist ein ziemlich einfacher Ansatz:

In Ihrem View-Controller, eine Eigenschaft definieren jede Anordnung von Zellen-Wiederverwendungs ​​Kennungen zu halten, die später Bezug genommen werden kann. Sie können eine erste, nicht-zufällige Konfiguration, wie diese ein:

var reuseIdentifiers = ["GameOver", "Normal", "Normal", "Normal", "Normal", "Normal", "Normal", "Normal", "Normal", "Normal", "Normal", "Normal", "Normal", "Normal", "Normal", "Normal"] 

die folgende Methode definieren, und es während der Initialisierung der View-Controller irgendwann anrufen, bevor die Collection auf dem Bildschirm angezeigt wird, und vor jeder Zeit die Sammlung Ansicht Daten neu geladen wird:

func randomizeReuseIdentifiers() { 
    var randomized = [String]() 

    for _ in initialIdentifiers { 
     let random = reuseIdentifiers.removeAtIndex(Int(arc4random_uniform(UInt32(reuseIdentifiers.count)))) 
     randomized.append(random) 
    } 

    reuseIdentifiers = randomized 
} 

Und dann in Ihrem collectionView(cellForItemAtIndexPath:NSIndexPath) Methode, die passende reuseIdentifier für den aktuellen indexPath nachzuschlagen, wie folgt aus:

func collectionView(_ collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let identifier = reuseIdentifiers[indexPath.item] 
    return collectionView.dequeueReusableCellWithReuseIdentifier(identifier, forIndexPath: indexPath) 
} 

Dieser Ansatz hat auch den Vorteil, dass Sie zusätzliche Identifikatoren in die Ausgangs reuseIdentifiers Array in der Zukunft hinzuzufügen, andere Arten von Zellen in einer oder mehreren beliebigen Stellen aufzunehmen.

+0

Das hat funktioniert! Ich habe nicht einmal daran gedacht, ein Array von wiederverwendbaren Bezeichnern in der cellForItemAtIndexPath-Methode zu verwenden. Ein bisschen außerhalb des Rahmens meiner anfänglichen Frage ... wenn ich GameOver und Normal in ihre eigenen Arrays (2 Arrays) setzen wollte, wäre das mit Ihrer Antwort machbar? Idea hier ist, ich möchte die "normalen" Zellen deaktivieren, nachdem Sie getappt haben, während Sie immer einen GameOver auf dem Bildschirm halten. Wenn sie alle im selben Array sind, besteht die Möglichkeit, dass ich die GameOver-Zelle deaktivieren kann, was ich nicht möchte. Wieder ... außerhalb des Geltungsbereichs, nur um Ihre Eingabe anzufordern. – Joe

+0

@Joe Es ist möglich, aber wesentlich komplexer, zwei Arrays zu verwenden. Es gibt einfachere Möglichkeiten, wie Sie mit einem Array arbeiten können. Beispielsweise können Sie dem View-Controller eine 'isGameOver'-Eigenschaft hinzufügen und dann die folgende Zeile hinzufügen, nachdem Sie die Zelle aus der Warteschlange genommen haben, bevor Sie sie zurückgeben:' cell.userInteractionEnabled = isGameOver? identifier == "GameOver": true'. Das sagt im Grunde genommen „wenn das Spiel vorbei ist, wird nur Interaktion mit dem Benutzer für diese Zelle aktiviert, wenn die Kennung für diesen Index zu‚Gameover‘gleich ist. Wenn das Spiel nicht vorbei ist, dann wird Interaktion mit dem Benutzer immer für diese Zelle aktiviert“ –

+0

I tatsächlich könnte es mit 2 Arrays herausgefunden haben. Ich habe GameOver und Normal in ihre eigenen Arrays getrennt. Dann setze ich in randomizeReuseIdentifiers initialIdentifiers als gameOverArray + contintinueArray. Allerdings mag ich deine Vorstellung vom ternären Operator und deaktiviere die Interaktion. Dies könnte nützlich sein ... Danke für Ihre Hilfe !!! – Joe