UITableViewCellに置いたボタンのイベント処理

2013.10.04 Friday 11:48
0
    画面に置いたUITableViewCellのボタンイベントってどうやって処理するのかなぁって思いました。


    単純な処理ならば、UITableViewCellを継承したクラス内でイベント処理をするのが一番簡単だと思います。
    でも、複雑な処理をしたい場合、UIViewControllerを継承したメインの画面側で処理を書く方がスマートな気がしてきました。


    ボタンイベントの取得

    こういう感じの各セルのボタンが押された時の処理をメイン画面側で行いたい(^^;;



    調べた内容を自分なりにまとめてみました。


    以下の例では「myButton」という名前のボタンに対して、addTargetを使ってボタンが押されたときに実行される「onMyButtonTouch」という任意の名前のメソッドを設定しています。

    そして、そのメソッド内では「myTable」というテーブルから現在押されたボタンのインデックスを取得してログ出力います。


    //---------------------------------
    // セルの内容表示
    //---------------------------------
    - (UITableViewCell*)tableView:(UITableView *)tableView
            cellForRowAtIndexPath:(NSIndexPath *) indexPath
    {
        static NSString* CellIdentifier = @"Cell";
        myTVCell* cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (!cell) {
            cell = [[myTVCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                            reuseIdentifier:@"myTVCell"];
        }
    
        // タッチイベントを追加    
        [cell.myButton addTarget:self action:@selector(onMyButtonTouch:event:)
                                            forControlEvents:UIControlEventTouchUpInside];
    
        
        return(cell);
    }
    
    
    //---------------------------------
    // ボタンが押された時の処理を記述
    //---------------------------------
    - (void)onMyButtonTouch: (UIButton *)sender
                      event:(UIEvent *)event
    {
        // 押されたボタンのセルのインデックスを取得
        UITouch *touch = [[event allTouches] anyObject];
        CGPoint point = [touch locationInView:_myTable];
        NSIndexPath *indexPath = [_myTable indexPathForRowAtPoint:point];
    
        // ログを出力    
        NSLog(@"row : %d", indexPath.row);
    }
    


    押されたボタンのセルの行番号が取得できたらもうこっちのものです(^-^)

    これでUIViewController側でUITableViewCellのイベント処理を記述できるようになりました。
    category:画面関連 | by:こもcomments(2) | - | -
    Comment
    はじめまして。
    最近Objective-cでプログラミングを始めた者です。

    ちょうどこちらの記事に書かれているようなことで詰まっており、大変参考にしてただきました。ありがとうございます。

    ただ、少しまだ疑問が解決されていない点がありまして・・・、
    ボタンをタップした際に、セル内のアイテムに処理を施したい場合(たとえばセル内のmyLabelのテキストを変更するなど)には、どのようにしてそのアイテムを呼び出せばよいのでしょうか?
    cell.myLabel , self.tableView.myLabelなど試してみたのですがうまくいきません。

    非常に初歩的な質問かと思いますので大変恐縮ですが、ご教授いただけるとありがたいです。
    どうかよろしくお願い致します。
    • かつお
    • 2014/08/22 3:29 PM
    コメントいただいているのに気がつかず、すいません。
    もしかすると、もう解決済みかもしれませんが、念のため。

    行の再描画を使って、テキストを変更する方法なら少しの追加でできそうです。

    ます、ボタンが一度以上押された時のフラグを持っておきます。
    BOOL isTap = NO;

    そして、onMyButtonTouchメソッド内に下記を追加します。
    isTap = YES; // 押された
    [self updateStatus:indexPath.row]; // 表示を更新


    すると、ボタン押した行の描画が走ると思うので、tableViewメソッド内に下記の処理を追加します。

    if (isTap == YES) {
    cell.myLabel.text =@"一度以上押された時のテキスト";
    } else {
    cell.myLabel.text =@"一度も押されていない時のテキスト";
    }

    あとはこれの応用だと思います。
    おそらくこの例のisTap変数 は、行数分の情報を保持する必要があると思います。

    …そう考えると、少し面倒くさいコードになるかもしれませんね(^^;;
    • こも
    • 2014/12/31 9:04 PM








       

    Calender
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
    << August 2017 >>
    Sponsored Link
    Selected entry
    Category
    Archives
    Recent comment
    • NSUnknownKeyExceptionが出た時の回避方法
      itotake
    • 画面を縦方向に固定にする
      iphone 画面 固定
    • NSUnknownKeyExceptionが出た時の回避方法
    • NSUnknownKeyExceptionが出た時の回避方法
      atsushi
    • NSUnknownKeyExceptionが出た時の回避方法
      kanejun
    • UITableViewCellに置いたボタンのイベント処理
      こも
    • UITableViewCellに置いたボタンのイベント処理
      かつお
    • NSUnknownKeyExceptionが出た時の回避方法
      こも
    • NSUnknownKeyExceptionが出た時の回避方法
       
    • iOS7のベータ版を入れてみた
      こも
    Sponsored Link
    Link
    Profile
    Search
    Others
    Mobile
    qrcode
    Powered
    無料ブログ作成サービス JUGEM