質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • Swift 2

    1337questions

    Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

  • iOS 9

    215questions

    iOS 9は、アップル社のモバイルOSであるiOSシリーズのバージョン。特徴として検索機能の強化、Siriの機能改良、iPad向けマルチタスクなどがあります。マルチウィンドウ機能をサポートし、iPad向けマルチタスクもサポートされています。

【Swift】UIcollectionViewCellに配置したUIStepperにタッチイベントが止められている?

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 840

mk_mkee

score 2

現在,私はECアプリを作成しています.
商品リスト画面では,UICollectionViewと自前で用意したCellを用いて,商品をリスト表示したいと考えています.
Cell内にはUIStepperを配置し,各商品をいくつ購入するかをユーザに設定してもらうことを想定しています.
また,商品リスト画面の上部に,現在選択している商品の合計金額を動的に表示したいと考えています.

class ItemListViewController: UIViewController,UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout {

    @IBOutlet weak var total: UILabel! //合計金額を表示するLabel
    @IBOutlet weak var collectionView: UICollectionView!

  //商品データ
    var itemList:[(name:String, price:Int, imgName:String)] = []


    override func viewDidLoad() {
        super.viewDidLoad()

        //--------------------------------------------------
        //CustomCellをViewに登録
        let nibName = UINib(nibName: "ItemCellView", bundle: nil)
        collectionView.registerNib(nibName, forCellWithReuseIdentifier: "cell")

        //--------------------------------------------------
        //商品のデータを用意
        itemList.append( (name:"いちご", price:100, imgName:"ichigo") )
        itemList.append( (name:"ぶどう", price:200, imgName:"ぶどう") )
        itemList.append( (name:"さんま", price:300, imgName:"samma") )
        itemList.append( (name:"ワイン", price:1000, imgName:"wine") )
        itemList.append( (name:"ヤクルト", price:80, imgName:"yakuruto") )


    }

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

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell:ItemCell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! ItemCell

        //セルにデータをセット
        cell.title.text = itemList[indexPath.row].name
        cell.image.image = UIImage(named: "pic/" + itemList[indexPath.row].imgName)
        cell.price.text = "¥" + String(itemList[indexPath.row].price)

        return cell
    }


    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
        return 1
    }

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return itemList.count;
    }

    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
  //Stepperを押した時はイベントが飛んでこない
        print("たっちすけっちわんたっち!")
    }
}
class ItemCell: UICollectionViewCell {

    @IBOutlet weak var title: UILabel! //商品名
    @IBOutlet weak var image: UIImageView! //商品画像
    @IBOutlet weak var number: UILabel! //注文数
    @IBOutlet weak var price: UILabel! //価格

    override init(frame: CGRect){
        super.init(frame: frame)
    }
    required init?(coder aDecoder: NSCoder){
        super.init(coder: aDecoder)
    }

    //商品の個数をステッパーで変更
    @IBAction func changedStepperValue(sender: UIStepper) {
        let num = Int(sender.value)
        //ラベルに表示
        let gray = UIColor.grayColor()
        number.backgroundColor = gray.colorWithAlphaComponent(0.6)
        number.textColor = UIColor.whiteColor()
        number.text = String(num)

        //0の時は表示しない
        if num == 0 {
            number.text = ""
            number.backgroundColor = UIColor.clearColor()
        }

    }
}

そこで,Cell内のStepperが押されたときに,ItemListViewControllerで合計金額のラベル(total)を更新するため,
Cellが選択されたときのイベントを取得しようと,以下のメソッドを実装しました.

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath)


ところが,Cell内のStepper以外の部分をタッチすると,確かにイベントは飛んできているのが確認できたのですが,
Stepperをタッチした場合は,Cell選択時のイベントが飛んで来ませんでした.

Cell内のStepperのイベントをItemListViewController側から取得する方法はありますでしょうか???

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

didSelectItemAtIndexPathはセルがタッチされたかですので、Stepperの状態が変化したかどうかをチェックするには、StepperのvalueChangedイベントを監視すれば良いです。

各Stepperのtagにセルのインデックスを入れておくなどして、セルを作成する部分で

cell.stepper.tag = indexPath.row
cell.stepper.addTarget(self, action: "onStepperChanged:", forControlEvents: UIControlEvents.ValueChanged)


などとしておいて、

func onStepperChanged(sender: UIStepper) {
    //sender.tagでどの商品の個数が変化したかを取得して処理
}


のようなメソッドを用意しておけば良いと思います。
手打ちですので、ビルドが通らなかったら適宜直して下さい。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/27 11:53

    ありがとうございます!
    上記の方法で実装できました.

    cell.stepper.addTarget(self, action: "onStepperChanged:", forControlEvents: UIControlEvents.ValueChanged)
    の3つ目の引数は「指定したactionをどのイベントの時のactionにするか」を表しているという理解でよろしいでしょうか

    キャンセル

  • 2016/04/27 12:24

    3つめの引数についてはその通りです。
    お役に立ててなによりでした。

    キャンセル

同じタグがついた質問を見る

  • Swift 2

    1337questions

    Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

  • iOS 9

    215questions

    iOS 9は、アップル社のモバイルOSであるiOSシリーズのバージョン。特徴として検索機能の強化、Siriの機能改良、iPad向けマルチタスクなどがあります。マルチウィンドウ機能をサポートし、iPad向けマルチタスクもサポートされています。