5847


iPhoneアプリ作成中です。  
一つ目のクラスにCollectionViewで画像を並べ（以降、このクラスはGazouクラスと呼びます）、  
タップした画像ごとに別々のplistを呼び出させます。  
そして、二つ目のクラスの中身であるtableViewで、セルのテキストとしてplistの中身を表示させようと  
しています（以降、このクラスはListクラスと呼びます）。条件と手順は以下の通りです。

＜条件＞  
・UIViewControllerのサブクラスとして、GazouクラスとListクラスを用意する  
・画像（名前：photo01〜10)と、plist(名前：List01〜10)を用意する  
・plistの中身は以下の通り  
Rootのタイプ：Array  
Itemのタイプ：Dictionary  
Itemの中身のキー：文章  
Itemの中身のValue：（各種文章）  
・画像photo01〜10は、にコレクションビューで並べてある  
・画像をタップするとListクラスに遷移するよう、Presenting Seguesで設定しておく

＜手順＞  
・Gazouクラスにコレクションビューで並べた画像（例：photo01)をタップする  
・Listクラスに遷移する（これ以降はListクラス内での処理）  
・タップした画像のインデックス番号を取得し、plist(例：List01)を呼び出す  
・最終的に、plistの中身である（各種文章）をTableViewのセルのテキストとして表示する

としたいと考えています。  
そこで、

[code]

    - (void)viewDidLoad{
    [super viewDidLoad];
    
    // Gazouクラスのインスタンスを取得する
    NSUInteger idx = [[self.navigationController viewControllers] indexOfObject: self] - 1;
    Gazou *masterVC = [[self.navigationController viewControllers] objectAtIndex: idx];
    
    // タップした画像のインデックスを算出する
    // detailItemの型はid型です。
    // detailItemはList.hで「@property (strong, nonatomic) id detailItem;」で定義されています。
    // photosはNSArray型です。
    // photosはGazou.hで「@property (nonatomic, strong, readonly) NSArray *photos;」で定義されています。これのログを取ると、画像ファイル(photo01〜10)の名前が列挙されます。
    NSUInteger nextImageIdx = [masterVC.photos[0] indexOfObject: self.detailItem];
    
    NSString *st=[[NSString alloc] initWithFormat:@"List%lu",(unsigned long)nextImageIdx];
    
    NSString* dataFile = [[NSBundle mainBundle]pathForResource:st
                                                    ofType:@"plist"];
    arrayList = [NSArray arrayWithContentsOfFile:dataFile];
    }
    
[/code]

と書いてみたのですが、うまくいきません。nextImageIdxの値を取得するときに  
トラブルがあるようです。  
どんな画像をタップしてもnextImageIdxのログを取ると「１」しか出てきません。  
本来はnextImageIdxには 01〜10のうち、タップした画像の名前の末尾の数字が入る予定です。

この原因は同じ行にある「self.detailItem」にあるようです。これのログを取ると、  
なぜかNULLになります。しかし、その原因がわかりません。

どなたか原因がわかる方がいらっしゃったらご教示いただけないでしょうか。  
以上、何卒よろしくお願いいたします。


CC BY-SA 3.0
2015-02-03T07:26:21.737
5838
2015-02-04T01:06:24.577
2015-02-04T00:21:18.840
7470
7470
question
objective-c iphone ios8
上位のクラスを取得し、その中にある画像のインデックス番号を取得する方法がわかりません


まず、ここのコメントにある改善案は受け入れた方が良さそうです。  
その上で、あなたのコードについての疑問の一つについてお答えすると、

[code]

    // クラス①（Aisatuと名付けてあります）のインスタンスを取得する
    NSUInteger idx = [[self.navigationController viewControllers] indexOfObject: self] - 1;
    Aisatu *masterVC = [[self.navigationController viewControllers] objectAtIndex: idx];
    
[/code]

上記処理の中で、"self"が表示中のViewController(②)だとすると、  
この処理でクラス①のインスタンスを取得するためのidxを正しく取得するためには、  
この処理の実行タイミングを②のViewControllerの画面遷移後にする必要があります。  
上記処理を正しい位置に記述している場合、idxの値が1ならば①のAisatuクラスを含むviewControllerのスタックは下記のようになっていると考えられます。

> NavigationContoroller  
>  -RootViewController (idxは0)  
>  -Aisatu (idxは1)  
>  -クラス②のViewController (idxは2)

つまり、Aisatuクラスの画面からどのような画像をタップして画面遷移をしても、クラス②のViewControllerのスタックされるインデックス(順番)は変わらないため、常にログに1が出てると考えられます。


CC BY-SA 3.0
2015-02-03T09:25:11.780
5847
2015-02-03T09:25:11.780
7364
5838
answer


iOS6/7の時点ででviewDidLoadが呼ばれるタイミングが変わっています。  
前の画面でdetailItemに値を設定しているのであれば、それが原因かもしれません。

参考：iOS6/7のviewDidLoadが呼ばれるタイミングの違い  
<http://quesera2.hatenablog.jp/entry/2014/04/24/212158>


CC BY-SA 3.0
2015-02-04T01:06:24.577
5902
2015-02-04T01:06:24.577
3516
5838
answer