2016-04-22 15 views
0

私は16セルのUICollectionViewを持っています。 1つのセル(Game Overセル)はランダムでなければなりません。私はコレクションビューでGame Overセルをランダム化したいと思います。1セクションにランダム化されたreuseIdentifiersを持つUICollectionView

私はそれが多少異なるセクションを使用して作業していますが、それは私もそれは多少、文字列の配列を作成することにより、 "という文字列のいずれかを働いていた、視覚的に16

でブレンドの目的に反しGameOver " - そして、このセルがどのように表示されるかをカスタマイズするために、配列のシャッフルを行った。

それは私にゲームオーバーのIBコントロールを与えなかったので、それもうまくいきませんでした。

2つのプロトタイプセル識別子を作成し、1つのゲームでセルをランダム化し、15個の通常のセルを16個の合計セルのコレクションビューに作成すると、ストーリーボードを使用できますか?あなたのビューコントローラで

、後で参照することができ、細胞の再利用識別子の任意の配列を保持するためのプロパティを定義します。

+0

現在のコードを表示できますか? – kye

答えて

1

は、ここに1つの、かなり単純なアプローチです。

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

次のメソッドを定義し、collectionViewが画面に表示される前に、あなたのビューコントローラの初期化中にいつかそれを呼び出すと、毎回の前に:あなたはこのように、初期の、非ランダムな構成を設定することができますコレクションビューのデータがリロードさ:あなたのcollectionView(cellForItemAtIndexPath:NSIndexPath)方法で

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

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

    reuseIdentifiers = randomized 
} 

そしてを、現在のindexPathのためのマッチングreuseIdentifierを調べ、次のように:

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

この方法には、後で最初の配列reuseIdentifiersに追加の識別子を追加して、1つ以上のランダムな場所に他のタイプのセルを含めることもできます。

+0

それはうまくいった!私はcellForItemAtIndexPathメソッドで再利用可能な識別子の配列を使用するとは考えていませんでした。私の最初の質問の範囲外です...ゲームオーバーとノーマルを自分の配列(2配列)に入れたいのであれば、それはあなたの答えで実現可能でしょうか?ここでのアイデアは、タップした後で「通常」のセルを無効にして、画面上に常にGameOverを保持したいということです。それらがすべて同じArray内にある場合は、GameOverセルを無効にすることができます。再度...あなたの入力を要求するだけで、範囲外です。 – Joe

+0

@Joe 2つの配列を使うことは可能ですが、はるかに複雑です。 1つの配列で簡単に動作させる方法があります。たとえば、ビューコントローラに 'isGameOver'プロパティを追加してから、セルをデキューした後、それを返す前に次の行を追加することができます:' cell.userInteractionEnabled = isGameOver? identifier == "GameOver":true'。これは基本的に「ゲームが終了すると、このインデックスの識別子が「GameOver」に等しい場合にのみ、このセルに対してユーザー対話が有効になります。ゲームが終了していない場合、このセルに対してユーザー対話が常に有効になります。 " –

+0

I実際には2つの配列でそれを理解しているかもしれません。私はGameOverとNormalをそれぞれの配列に分けました。次に、randomizeReuseIdentifiersで、私はgameOverArray + contintinueArrayとしてinitialIdentifiersを設定しました。しかし私は三項演算子と相互作用を無効にするというあなたの考えが好きです。これは便利です...あなたの助けをありがとう! – Joe

関連する問題