質問: iPhone アプリを作成中です。 タイトルのとおり、「CollectionViewとUIImageViewを使用して、ボタンを押すごとに画像をファイル名の番号順に切り替えていく」ことをしたいです。具体的には、 1画像ファイル (ファイル名: photo01〜10 )を用意する 2それらをCollectionViewを用いて一画面に全て並べて表示する 3並べた画面のうち一つをクリックすると、別画面に飛び、そこで、 クリックされた画像がImageViewで表示される 4(例えばphoto03をクリックして表示された場合で)クリックされた 画像が表示されている画面に配置した、 「次」ボタンを押すと、photo04がphoto03の代わりに表示される 「前」ボタンを押すと、photo02がphoto03の代わりに表示される ※1〜3を実現するプロジェクトは下記アドレスにあります。 といった具合にしたいのですが、ソースはどのようなものになるのでしょうか? 不勉強で申し訳ありませんが、どなたかご教示いただけないでしょうか。 以上、何卒よろしくお願いいたします。
回答: (4) の動作を実現するポイントは、 * データソースであるUIImageのリスト(そのプロジェクトではMasterViewController.photos)を外部に公開すること * 単一表示画面(DetailViewController)で表示中のUIImageのリスト内でのインデックスを元に前後の画像を取得すること * そのために(そのプロジェクトの構造で言えば)DetailViewControllerからMasterViewController.photosへアクセスできるようにすること * 単一表示画面の表示を、取得した前(または後)の画像に更新すること です。 **プロパティの外部公開** ``` // MasterViewController.h @property (nonatomic, strong, readonly) NSArray *photos; // 読みのみで公開 ``` ``` // MasterViewController.m @interface MasterViewController () { ... } @property (nonatomic, strong, readwrite) NSArray *photos; // 内部では読み書き可 ``` **DetailViewControllerにMasterViewControllerのヘッダをインポート** ``` // DetailViewController.m #import "DetailViewController.h" #import "MasterViewController.h" // 追加 ``` このふたつの準備をした後で、例えば「次へ」のボタンに以下のようなメソッドを割り当てることになると思います。 ``` - (void)changeToNextImage { // どうにかしてMasterViewControllerのインスタンスを取得する NSUInteger idx = [[self.navigationController viewControllers] indexOfObject: self] - 1; MasterViewController *masterVC = [[self.navigationController viewControllers] objectAtIndex: idx]; // 後のイメージのインデックスを算出する NSUInteger nextImageIdx = [masterVC.photos[0] indexOfObject: self.detailItem] + 1; // UIImageViewのイメージを差し替える if (nextImageIdx < [masterVC.photos[0] count]) { UIImage *nextImage = [masterVC.photos[0] objectAtIndex: nextImageIdx]; self.detailItem = nextImage; [self configureView]; } } ``` 上記の回りくどいコードを改善するには設計の見直しが必要です。 * データソース(UIImageの配列)はViewControllerから独立させる * もしくは、せめてDetailViewControllerが担当している画像リストへの参照を予め持っておく などを推奨します。