みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

iPhoneアプリの開発についてです。

iPhoneアプリにディレクトリ階層を管理し、テーブルビューに表示する機能を実装中です。
パスの後ろに、"/○○○(ディレクトリ名)"という文字列を足して指定のディレクトリのパスを取得し中のファイルやフォルダの一覧を取得するという手法を用いています。
次のディレクトリに進む分には問題ないのですが、元のフォルダに戻るときに問題が生じてしまいます。
セルをタップすることで元のパスの後ろに選択したフォルダの名前を足していますが、ナビゲーションコントローラーで戻る際にパスの後ろに足されたフォルダ名を取り除かなくてはなりません。
もちろん戻るボタンが押されたことを検知するコードを調べたのですが、

-(void) viewWillDisappear:(BOOL)animated {
if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) {
//ここでパスから文字列を取り除く
}
[super viewWillDisappear:animated];
}

これではルートフォルダ→次のフォルダの間でしか検知されません。僕がやりたいのはルートフォルダ→次のフォルダ→次のフォルダ→・・・とすべてのフォルダ間の戻るボタンの検知をしたいのです。
didSelectRowAtIndexPathメソッドに

UITableViewController *nextDir = [[UITableViewController alloc] init];
nextDir.tableView.delegate = self;
nextDir.tableVIew.dataSourse = self;

と記述することで、ストーリーボードにいくつもコントローラーを置かずにテーブルビューにディレクトリの内容を表示しています。
自前のコントローラー→nextDir間の戻るボタン検知は先ほど乗せたコードで検知できましたが、nextDir→nextDir間の戻るボタン検知はどうすればいいでしょうか?
簡単ですが説明図を作ってみました。わかりにくかったらすみません。

投稿日時 - 2014-05-22 14:37:17

QNo.8606021

困ってます

質問者が選んだベストアンサー

No.1です。追伸します。

> > didSelectRowAtIndexPathメソッドに
> > UITableViewController *nextDir = [[UITableViewController alloc] init];
> > nextDir.tableView.delegate = self;
> > nextDir.tableVIew.dataSourse = self;
> とのことですが、本当にこの通り書いているのですか?
>
> NextDirViewController *nextDir = [[NextDirViewController alloc] init];
> nextDir.tableView.delegate = nextDir;
> nextDir.tableVIew.dataSourse = nextDir;
> としないんですか?

見落としていました。
nextDir→nextDir間の戻るボタンが検知されない直接の原因は

> UITableViewController *nextDir = [[UITableViewController alloc] init];

の部分です。

これだとNextDirViewControllerでなくUITableViewControllerのインスタンスが
生成されますから、NextDirViewControllerのviewWillDisappearは呼ばれず、
UITableViewControllerのviewWillDisappearが実行されるだけです。

No.1回答で書いた通り
> NextDirViewController *nextDir = [[NextDirViewController alloc] init];
とする必要があると思います。

delegateやdataSourceの設定とか、そもそもフォルダ名取り除き処理の必要性とか
そんなところばっかり気になって、今回の質問の直接原因になるところを見落としていました。

投稿日時 - 2014-05-24 12:28:28

お礼

再び回答ありがとうございます。
自分でも混乱していたのですがおかげでなんとか解決しました。

投稿日時 - 2014-05-25 13:14:01

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

よく似た構成のプログラムでviewWillDisappearのタイミングで
([self.navigationController.viewControllers indexOfObject:self]
の値を確認したところ、戻るときにはNSNotFoundが得られますので
この方法で大丈夫だと思います。
以下のURLにも同じ方法が紹介されていました。
http://ameblo.jp/satoko-ohtsuki/entry-11369448573.html

ただ、
> didSelectRowAtIndexPathメソッドに
> UITableViewController *nextDir = [[UITableViewController alloc] init];
> nextDir.tableView.delegate = self;
> nextDir.tableVIew.dataSourse = self;
とのことですが、本当にこの通り書いているのですか?

NextDirViewController *nextDir = [[NextDirViewController alloc] init];
nextDir.tableView.delegate = nextDir;
nextDir.tableVIew.dataSourse = nextDir;
としないんですか?

気にしているのはdelegateやdataSourceにnextDirでなく
selfを指定している点です。
もしこの通りだと、新しく生成したビューコントローラーのテーブル
表示は、呼び出し元のビューコントローラーのメソッドが行うことに
なります。
このことが何か勘違いを生み出し、意図した通りに動作しない原因に
なっているような気がするのですが、どうでしょうか?


それと、そもそも戻る際にパスの後ろに足されたフォルダ名を
取り除こうとしている理由がわかりませんでした。

テーブルビューコントローラーのタイトル表示等、
どこかに現在のパス名を表示したい(または覚えておきたい)のであれば、
新しいテーブルビューコントローラーを生成した時に
フォルダ名を追加して新しいパスを生成し、それをテーブルビューコントローラー
の中に表示する(または覚えておく)だけよいように思えます。

移動先のテーブルビューコントローラーから戻ってきたら、
元のビューコントローラーには自分が今表示している
パス名が表示(または保存)されたままになっているはずです。
(つまり、取り除かなくても元のビューコントローラーには
元の値が維持されているはずです)

投稿日時 - 2014-05-22 17:25:22

あなたにオススメの質問