質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iPhone 6

iPhone 6は、2014年に発売されたアップル社のスマートフォンです。画面サイズは4.7インチあり、A8コアチップとM8モーションコプロセッサを搭載しています。

iOS 8

iOS 8(アイ・オーエス8)は、アップル社が2014年9月に発表したオペレーティングシステムです。iPhone 4sより対応しています。デザイン性の変更はなく、アプリや各種機能が強化されています。また、サードパーティ開発者のために、多くのAPIが開放されています。

Q&A

解決済

1回答

1837閲覧

上位のクラスを取得し、その中にある画像のインデックス番号を取得する方法

saikoro

総合スコア10

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iPhone 6

iPhone 6は、2014年に発売されたアップル社のスマートフォンです。画面サイズは4.7インチあり、A8コアチップとM8モーションコプロセッサを搭載しています。

iOS 8

iOS 8(アイ・オーエス8)は、アップル社が2014年9月に発表したオペレーティングシステムです。iPhone 4sより対応しています。デザイン性の変更はなく、アプリや各種機能が強化されています。また、サードパーティ開発者のために、多くのAPIが開放されています。

0グッド

0クリップ

投稿2015/02/03 16:05

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

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

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

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

lang

1-(void)viewDidLoad{ 2[super viewDidLoad]; 3 4// クラス①(Aisatuと名付けてあります)のインスタンスを取得する 5NSUInteger idx = [[self.navigationController viewControllers] indexOfObject: self] - 1; 6Aisatu *masterVC = [[self.navigationController viewControllers] objectAtIndex: idx]; 7 8// タップした画像のインデックスを算出する※detailItemの型はNSString型です。 9NSUInteger nextImageIdx = [masterVC.photos[0] indexOfObject: self.detailItem] - 1; 10 11NSString *st=[[NSString alloc] initWithFormat:@"List%lu",(unsigned long)nextImageIdx]; 12 13NSString* dataFile = [[NSBundle mainBundle]pathForResource:st 14 ofType:@"plist"]; 15arrayList = [NSArray arrayWithContentsOfFile:dataFile]; 16} 17

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

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

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下ご確認ください

1.

lang

1NSString *st=[[NSString alloc] initWithFormat:@"List%lu",(unsigned long)nextImageIdx];

にて@"List%02lu"と0詰めされていないためplistファイルの名前が正しく作られていない

2.

lang

1NSUInteger nextImageIdx = [masterVC.photos[0] indexOfObject: self.detailItem] - 1;

にてphotos[0]の要素が配列でないか、photosにindexOfObjectをするつもりが間違えている

3.

self.detailItemへ代入している文字列が正しくない(確実にNSStringならばid型よりもNSString型を使うべきです)

4.

masterVC.photosが画面遷移後に開放されてしまっている

5.

lang

1NSUInteger nextImageIdx = [masterVC.photos[0] indexOfObject: self.detailItem] - 1;

indexOfObjectは1番目を0と返す為、1番目をタップした際に1を取得したい場合は+1してみてください。

また、このような実装の場合はclassAからclassBへ押した場所のindexを渡す仕組みにするのが良いかと思います。

投稿2015/02/03 18:30

noppefoxwolf

総合スコア231

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

saikoro

2015/02/03 22:51

ご回答ありがとうございます。 すみません、試してみたのですが、変わりありませんでした。 NextImageIdxには今までと変わらず「9223372036854775807」というような 数字が並ぶだけでインデックス番号は出してくれませんでした。
noppefoxwolf

2015/02/03 22:52

photosはどんな変数なのでしょうか?
saikoro

2015/02/03 23:04

NSArray型の変数であり、ログを取った場合、画像(01〜10)の名前が列挙されます。
noppefoxwolf

2015/02/03 23:05

ありがとうございます!のちほど回答訂正しておきます
noppefoxwolf

2015/02/03 23:52

回答修正しました。ご確認ください
saikoro

2015/02/04 00:26

ご回答ありがとうございます。すみません、結果は変わりませんでした。 それともう一つすみません、改めて他の変数をログで調べたところ、nextImageIdxよりも 先に、nextImageIdxと同じ行の「self.detailItem」がNULLを吐いていました。 detailItemはクラス②.hで「@property (strong, nonatomic) NSString* detailItem;」で 定義してあります。id型からNSString型に変えてみても結果は変わりませんでした。
noppefoxwolf

2015/02/04 00:29

detailItemへの代入部分に恐らく問題があるのかと思われます。 この場合、detailItemの中身はphotosの要素でなくてはなりませんがいかがでしょうか?
saikoro

2015/02/04 00:38

>detailItemの中身はphotosの要素でなくてはなりませんがいかがでしょうか? すみません、ここをもう少し詳しく教えていただけないでしょうか。
noppefoxwolf

2015/02/04 00:41

photos = @[@"image01",@"image02",@"image03",@"image04"]; と定義されている場合、 detailItem = @"image02"; など、detailItemがphotosの要素の1つで無いとindexOfObjectが正しく動作しません。
saikoro

2015/02/04 02:37

detailItemの中身が入るよう見直したら全て上手くいきました。 本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問