質問: [item objectForKey:@"title"]; //cellにdescriptionを設定 //cellにimageを設定 //cellを押した時に発生するsequeを指定、link要素を渡す return cell; } ```
回答: > > クリック時にsequeにlinkを渡す > > > (sequeってsegueですよね) 他の回答で「UITableViewのCellをカスタマイズする方法」と「`didSelectRowAtIndexPath`でCell選択を検知する方法」は出てますので、この回答では**Segueを使って選択されたCellに関する情報を保持しながら遷移する方法**についてのみ説明します。 今回の例ではTableViewControllerの`Custom Class`を`SourceTableViewController`、遷移先のViewControllerの`Custom Class`を`DestinationViewController`だとします。 読む際は実際は、2つのクラス名を実際プロジェクトでご利用のファイル名に脳内変換して御覧ください。 Step1. StoryBoard上でSegueを定義しておく StoryBoard上で以下の設定を行います。 1. 「TableViewController」と「遷移先ViewController」をStoryBoard上に設置 2. 「TableViewController」の`Custom Class`を`SourceTableViewController`に設定 3. 「 遷移先Controller」の`Custom Class`を`DestinationViewController`に設定 4. 「TableViewController」から「遷移先ViewController」へ`Segue`を張り、`Segue`の`identifier`を`toDestinationViewController`に設定 Step2. DestinationViewController.hにlinkをpropertyとして定義しておく Cellをタップしたときの遷移先のDestinationViewControllerはlinkを値として受け取る必要があるので 外部から受け取れるようにheaderファイルに`link`をproeprtyとして定義しておきます。 ``` # DestinationViewController.h( Cellをタップした時に移動する遷移先のControllerクラス) @interface DestinationViewController : UIViewController # 外部から受け取りたいパラメータを定義(今回は文字列のlink情報) @property NSString *link; @end ``` Step3. SourceTableViewController.mで選択Cellの情報をSegueを経由して遷移先に渡す処理を実装 まずCellが選択された際に遷移が実行されるように`didSelectRowAtIndexPath`の中で`performSegueWithIdentifier`の呼び出しを実装します。 ``` # SourceTableViewController.m( JSONを表示するTalebViewControllerのクラス ) - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { # "toDestinationViewController"はStoryBoardで設定したSegueのIdentifier [self performSegueWithIdentifier:@"toDestinationViewController" sender:nil]; } ``` 次にSegueを経由して遷移先のに選択されたCellに表示されている情報をパラメータとして渡す処理を実装します。 `prepareForSegue`が遷移前に呼ばれ、そこでSegueに関する情報を処理できます。 なので、`prepareForSegue`で選択されたCellのlink情報を、遷移先のDestinationViewControllerに渡す処理を実装することで、やりたいことが実現できるはずです。 具体的な実装例は以下のようになります。 ``` # SourceTableViewController.m - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { # 選択されたCellのIndexPathを取得します NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow]; # indexPathから、選択されたItemを取得します NSDictionary *selectedItem = self.items[ selectedIndexPath.row ]; # segueが持っている遷移先のViewControllerのインスタンスを取り出します. DestinationViewController *destinationViewController = segue.destinationViewController; # DestinationViewControllerのインスタンスのプロパティのlinkに選択されたItemのlinkを代入 destinationViewController.link = [selectedItem objectForKey:@"link"]; } ``` Step5. DestinationViewController.mで受け取った値を利用する 今までの実装で、DestinationViewControllerが表示された際にはインスタンスはlink値を持ってるはずです。 viewDidLoad等の中で値が入っていることを確認して利用してください。 ``` # DestinationViewController.m - (void)viewDidLoad { [super viewDidLoad]; # 選択されたCellのlink値が_linkに入っているはず NSLog(@"link:%@",_link); # _linkを使った処理を実装 } ``` 以上の処理で、Segueを利用してUITableViewControllerで選択されたCellの情報を遷移先のControllerに渡すことができると思います。