テーブルビューのセルに対してジェスチャリコグナイザを設定し、そのアクションでは Image Picker Controller を用いて写真を扱いながら、最終的に当該セルのサブビュー(イメージビュー)を更新するという機能を実現したかった。
対象となる処理の概要
1.セルのサブビュー(イメージビュー)をロングプレスするとジェスチャリコグナイザ起動
2.ジェスチャリコグナイザに対応するメソッド内でアクションシート起動
3.アクションシートの選択結果をもとにデリゲートメソッド-actionSheet:clickedButtonAtIndex:
で処理を振り分け(ここではカメラ or カメラロール起動で写真を選ぶ)
4.画像が選択されたら、デリゲートメソッド-imagePickerController:didFinishPickingMediaWithInfo:
内で CoreData の対応する画像パスレコードを登録 or 更新する(delete & insert 処理を行う)
5.この画像パスを使って、-tableView:cellForRowAtIndexPath:
内で、セルのサブビュー(イメージビュー)にサムネイル画像を設定する(Asset Libraryを使い、1件ごとにキーを用いて画像パステーブルを検索し、結果が返ってくればそれを設定する)
問題点とアプローチ
このとき、4.のプロセスで情報を更新をする際、更新対象となるキー値を取得する方式でハマった。
-imagePickerController:didFinishPickingMediaWithInfo:
で使える情報の中には、(当然だが)前画面で選択したセルの情報はないからだ。
アプローチとしては、2.のタイミングで取得した index path 情報を引き回す方法を探していたがうまいやり方に辿りつけなかったので、とりあえずブリッジ役としてのインスタンス変数を用意して、保持することにした。
結果、振る舞いとしては満足したものとなった。
//ジェスチャリコグナイザに対応するメソッド内でブリッジ役のインスタンス変数を利用
- (void)didLongPress:(UIGestureRecognizer *)gestureRecognizer
{
if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
CGPoint longPressLocation = [gestureRecognizer locationInView:self.tableView];
NSIndexPath *longPressedIndexPath = [self.tableView indexPathForRowAtPoint:longPressLocation];
_longPressedRowAtIndexPath = longPressedIndexPath.row; //インスタンス変数に入れてあとから利用する
継続して知りたいこと
この方法で一応目的は達成したものの、インスタンス変数の使い方としてなんだか気持ち悪い(メソッド間の単なる橋渡し的な使い途しかない)。
ジェスチャリコグナイザから取得した index path 情報を後続の処理(この場合、Image Picker Controllerのデリゲートオブジェクト、つまりself)まで引き渡す良い方法、またはセオリーってあるのだろうか。