23118


プログラミング初心者です。  
現在スタンプカメラアプリを作成中です。  
CollectionViewと配列に関しまして、質問させて頂きます。  
質問内容は下記のとおりです。

質問：配列の要素にtagの値を設定するには、どのようなコーディングをすべきでしょうか。

CollectionViewと配列を用いて画像を20個ならべて、1つの画像をタップしたらCollectionViewが閉じ、画像を指定した座標に設置するという仕様を考えております。  
この場合、各画像にtagの値と座標の値をあたえるといいのではと思っております。

配列のコードは下記のとおりです。

[code]

    override func viewDidLoad() {
        super.viewDidLoad()
        for i in 1...20 {
            imageArray.append(UIImage(named: "\(i).png")!)
        }
    }
    
[/code]

最初はstoryboardで各画像にtagの値をあたえようと思いましたが、配列を用いているため  
storyboardでtagの値をあたえることができないと思いました。

storyboardのコレクションビューの様子は下記のとおりです。  
[![画像の説明をここに入力](https://i.stack.imgur.com/AfYzG.png)](https://i.stack.imgur.com/AfYzG.png)

20個の画像にtagの値をあたえるにはどのようなコーディングをすべきでしょうか。  
また、storyboardで配列使用時20個の画像にtagの値をあたえる方法などありますでしょうか。  
お手数をおかけいたしますが、ご教示願います。


CC BY-SA 3.0
2016-03-13T13:54:26.857
23098
2016-03-14T09:30:12.847
2016-03-14T08:21:37.640
14329
14329
question
swift xcode swift2 xcode7 uicollectionview
配列の要素にtagの値を設定するにはどのようにすべきでしょうか


まだ少しわかりにくいところもあるのですが、Storyboard上に複数同種のUIControlを配置した時にtagプロパティの値によってそれらを区別する、と言った使い方が念頭にあるのだと想定して、ご質問の内容を考えさせていただきます。

_質問：配列の要素にtagの値を設定するには、どのようなコーディングをすべきでしょうか。_  
→tagの値を設定できるような要素を配列に入れてください。

と言うのが回答になるでしょうか。  
「画像」というのがUIImageを意識しているのであれば、UIImageにはtagプロパティはありませんから、ご自分でtagプロパティを持つようなデータ型を定義されれば良いのではないでしょうか。

[code]

    class MyImageItem {
        let tag: Int
        let image: UIImage
        //...座標などの情報もこのクラスに持たせると良いのかも知れません
        init(tag: Int, image: UIImage) {
            self.tag = tag
            self.image = image
            //他の情報を持たせるなら、その初期化...
        }
    }
    
[/code]

初期化の部分は、こんな感じになります。

[code]

        var itemArray: [MyImageItem] = [] //MyImageItemの配列を宣言
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
            itemArray.removeAll()
            for i in 1...20 {
                //tagを指定しながら初期化
                itemArray.append(MyImageItem(tag: i, image: UIImage(named: "\(i).png")!))
            }
        }
    
[/code]

今まで`imageArray[i]`で中身のUIImageを参照していた部分は`itemArray[i].image`と言った感じで書きなおすことになります。UIImageをパラメータとして渡して処理していた部分はMyImageItemを渡すように書き換えた方がわかりやすくなるかも知れません。

全然違うとか、他にも何かあればコメント等でお知らせください。


CC BY-SA 3.0
2016-03-14T09:06:38.900
23116
2016-03-14T09:06:38.900
13972
23098
answer


テーブルビューやコレクションビューを使用する場合は、通常そのようなtagを必要としない。これらのコレクションビュークラスはセルをNSIndexPathで指し示すので、これをそのままtagの代わりにする。

例えばセルを選択した場合にデリゲートで呼ばれるメソッド、

[code]

    collectionView(_:didSelectItemAtIndexPath:) 
    
[/code]

においても選択されたセルのindexPathが渡される。特に複雑なことをせず画像ファイルの名前に含む識別番号を0始まりにしていれば`indexPath.row`の値がその識別番号に対応する。

座標は必要になってから都度動的に計算するとよい。


CC BY-SA 3.0
2016-03-14T09:30:12.847
23118
2016-03-14T09:30:12.847
14783
23098
answer