TableViewのタップ制御

TableViewで、データの表示をしたいだけで、特にタップ時のアクションなどを起こしたくない場合の設定。

- (void)viewDidLoad
{
    //タップ時のハイライトをOFF
    self.tableView.allowsSelection = NO;
    [super viewDidLoad];
}

//タップ時のアクションをコメントアウト
//- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
//{
//}

 
 
特定のセルだけタップを可能にして、他のセルのタップアクションはOFFにする場合の設定。
※例は、セクション0のセルはタップ可能、それ以外はタップ不可

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        //cellの作成時に、タップさせたいセルとそうじゃないセルを切り分け
        if (indexPath.section == 0) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        }else {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:CellIdentifier];
            //セル単位でタップ時のハイライトをOFF
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
        }
    }
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    //タップ時のアクションで、ハイライトを設定したセルを切り分け
    if (indexPath.section == 0){
        if (indexPath.row == 0) {
            //セクション0ロウ0の処理;
        }
    }
}

TableView – TableViewをリロード

1.セルの画像をタップしたらセルのデータをお気に入りに登録
2.セルの画像をお気に入り登録済みの画像に変える
3.お気に入り画面に遷移
4.お気に入り画面でデータを削除
5.NavigationBarのBackボタンで元の画面に戻ってくる
6.セルの画像がお気に入り登録済みのまま

こんな状況の時に役立つ、TableViewを更新する方法。
NavigationBarのBackボタンはブラウザバックのようなものなので、画面遷移時にキャッシュを削除するイメージ。

//画面表示時のアクション
- (void)viewWillAppear:(BOOL)animated
{
    [self.tableView reloadData]; //TableViewを更新
    [super viewWillAppear:animated];
}

これだけ。
こういう仕組みがしっかり用意されてるのが、Objective-Cのいいところですね。

TableView – セルの画像を変えたときにサイズが変わる

セルの初期設定(?)のメソッド『- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath』で設定した画像(cell.imageView.image)を、後から別のメソッドで変更すると、画像のサイズがimageviewのサイズにめいいっぱい引き伸ばされた状態になってしまう問題の修正。

初期設定の時と後から変えた時で設定が違うのは、謎。
セル画像の初期設定が左詰めで、imageViewの初期設定がストレッチになってるっぽい?

cell.imageView.contentMode = UIViewContentModeLeft;
cell.imageView.image = [UIImage imageNamed:@"test.png"];

上記のように、画像を設定する前に『contentMode』プロパティを変えてあげると、画像が引き伸ばされたりしなくなる。

TableView – セルを指定して編集

一度作成されたセルに対して変更を加える方法

『セルの取得』

NSIndexPath* indexPath = [NSIndexPath indexPathForRow:【変更するセルのrow】 inSection:【変更するセルのsection】];
UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:indexPath];

例:セクションのないテーブルの上から2番目のセル

NSIndexPath* indexPath = [NSIndexPath indexPathForRow:1 inSection:0];

『画像を変更する』

cell.imageView.image = [UIImage imageNamed:@"test.png"];

TableView – 編集モードの切替

TableViewでセルを削除するためのボタンの呼び出しを、ナビゲーションバーの右上に編集ボタンを設置して、そこで切り替える方法。

編集ボタンを配置するTableViewのviewDidLoadに、以下を記述。

    self.navigationItem.rightBarButtonItem = [self editButtonItem];

デフォルトでボタンのラベルがEditになるのを自由に変えるには、以下を記述

    self.editButtonItem.title = @"編集";

これだけ。
さらに、編集時、完了時のボタンのラベルを変える場合は、以下のメソッドをコードに追加する。

-(void)setEditing:(BOOL)editing animated:(BOOL)animated{
    [super setEditing:editing animated:YES];

    if(editing){
        self.editButtonItem.title = @"完了";
    }else{
        self.editButtonItem.title = @"編集";
    }
}

editingがTrueなら編集モード、Falseなら非編集モード。