- ベストアンサー
スタート画面以外でViewDeckが使えない
- Objective-CでViewDeckというライブラリを導入しようとしていますが、スタート画面以外で利用する際に問題が発生しています。
- CenterViewControllerとLeftViewControllerを作成し、DeckViewControllerでそれらを読み込んでいます。しかし、ビルドするとCenterViewControllerを表示しようとすると真っ暗な画面が表示されます。
- 原因としては、初期化コードに問題がある可能性があります。対策としては、初期化コードを再確認し、必要な設定を追加することです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
No.1,2です。 > DeckViewControllerの生成/遷移は(a),(b)の両方で試してみましたがともに同じ結果になりました。 それ以上は試してみないとわからないので、 私もちょっと試してみました。 すると同じようにいきなりLeftViewControllerが表示されてしまいます。 ただ、画面の回転ロックを外し、端末を横にしてまた戻すと、 正しく表示されるようになりますので、ライブラリの画面遷移処理に 問題があってLeftViewControllerが表示されたままになっている ような感じがしました。 ちなみに、試しに、ナビゲーションコントローラーをつけて、 push segueで画面遷移するとうまく表示されました。 なんとなく、そのライブラリはmodal画面遷移に問題が あるような気がしましたが、それ以上はよく調べてないので わかりません。
その他の回答 (2)
- Lchan0211b
- ベストアンサー率61% (573/930)
> 例えばFirstViewControllerというようなViewControllerを新しくつくり、ボタンアクションでDeckViewControllerへの遷移を実装すると、CenterViewControllerではなくいきなりLeftViewControllerが表示されてしまいます。 この場合、DeckViewControllerの生成/遷移はどうやっているんですか? 主に3種類の方法があると思います。 (a)storyboardのsegueで接続し、自動的に生成/遷移してもらう。 (b)instantiateViewControllerWithIdentifierで生成してpresentViewControllerで遷移する。 (c)[[DeckViewController alloc] init]で生成してpresentViewControllerで遷移する。 DeckViewControllerをinitWithCoderで初期化しているなら、 (a)か(b)の方法じゃないとinitWithCoderは呼ばれませんよ。 (c)の方法にするならinitを実装する必要あります。 ただ、LeftViewControllerが表示されているということは、 (a)か(b)の方法でinitWithCoderが呼ばれているんだとは思いますが、 もしいずれでもなくて、既に生成済みのDeckViewControllerを 使い回して遷移したりしたら、おかしなことになるかもしれません。 まずはそのあたり、どうやって生成/遷移しているか説明してもらう必要が あります。それによって確認すべき点とか注意点とか変わってくると 思います。
お礼
Lchan0211bさん お早い回答ありがとうございます。 DeckViewControllerの生成/遷移は(a),(b)の両方で試してみましたがともに同じ結果になりました。 (a) [self performSegueWithIdentifier:@"showDeckView" sender:nil]; (b) DeckViewController *viewcon = [self.storyboard instantiateViewControllerWithIdentifier:@"deckView"]; [self presentViewController:viewcon animated:YES completion:nil]; よろしく御願いいたします。
- Lchan0211b
- ベストアンサー率61% (573/930)
まずはDeckViewControllerのinitWithCoderがちゃんと呼ばれているかどうか を確認して問題点を切り分けるところから始めればよいと思います。 ここが呼ばれてないなら、Storyboardに定義したDeckViewControllerを 生成しようとしてないという話だし、呼ばれているなら生成しようと したけどinitWithCoderの処理がどこか誤っているという話だと思います。 今回の質問は、黒画面が表示されたのに、上記の確認をしたか書かれてないし 前者の部分があまりしっかり説明されていないので、 なんとなく前者の問題のような気がしました。 だとすると storyboardのDeckViewControllerを「is initial View Controller」に 設定していますか? あるいは「is initial View Controller」に設定したViewControllerの クラスはDeckViewControllerにしていますか? そもそもDeckViewControllerを使う初期ViewControllerをstoryboardに 作っていますか? あとストーリーボードファイル名は"Main.storyboard"で合っていますか? (Webサイトの説明は"MainStoryboard.storyboard"を使うコーディング になっていますが、あなたの方は"Main.storyboard"を使うつもりなのですよね?)
お礼
Lchan0211bさん 詳しくご回答ありがとうございます。 まずお詫びしなければいけないこととして、自分にひとつ重大な間違いがあり、DeckViewControllerではなくCenterViewControllerを直接呼び出そうとしていました。 これでは黒画面が表示されて当然ですよね・・・。 >storyboardのDeckViewControllerを「is initial View Controller」に >設定していますか? >あるいは「is initial View Controller」に設定したViewControllerの >クラスはDeckViewControllerにしていますか? のご指摘通りDeckViewControllerをinitial View Controllerに指定すると正しく動作してくれました。 ありがとうございます。 答えていただいた上でさらに恐縮なのですが、もう一点ご教授いただいてもよろしいでしょうか。 DeckViewControllerではない画面からアプリをスタートしたい場合についてです。 例えばFirstViewControllerというようなViewControllerを新しくつくり、ボタンアクションでDeckViewControllerへの遷移を実装すると、CenterViewControllerではなくいきなりLeftViewControllerが表示されてしまいます。 NSLogを置いてみると、一瞬CenterViewControllerが表示されてからすぐLeftViewControllerが表示されているようなのですが。。。 ちなみに本来であればCenterViewController内のボタンが押された際に[self.viewDeckController toggleLeftViewAnimated:YES]が呼ばれて遷移するようになっています。 重ね重ねで申し訳ありませんが、なにとぞよろしくお願いします。
お礼
わざわざそこまでしていただいて、ありがとうございます。 自分の方でもやってみましたが確かに、画面の向きを変えた時に元どおりになることはあるようですね。 pushだけで実装するか、あるいは似た機能の他のライブラリを使うことも視野に入れて考えてみます。 本当にありがとうございました。