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

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

ただいまの
回答率

88.07%

NavigationControllerで2階層以上のViewControllerを作れない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,889

score 14

Xcode7.2 OS X 10.11.3を使用しています。

画像の通り、iPhone標準の「設定」のようなNavigationControllerを使った深い階層まで辿れるアプリを作成しています。
イメージ説明
ここで、各ビューにクラスを設定していない(ただパーツをstoryboardにドラッグドロップしてsegueで繋げただけ)状態でビルドすると正常に右端のビューまで遷移するのですが、

下の画像のようにそれぞれのビューにクラスを設定すると、右端まで正常に遷移せず左のビューの「次へ」ボタンを押した時点でクラッシュしてしまいます。
イメージ説明
NavigationControllerを使った終点の遷移先のビューで、クラスを設定して動作させるためにはどのような処理をすればよいでしょうか?
また、この方法では無理ならば他にどのような代替案があるのでしょうか?

かなり分かりにくい説明ではあると思いますが、ご教授いただけたら嬉しいです。
ご不明な点があれば分かる限りお答えしますので遠慮なくご質問お願いします。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
追記<2/17 3:07>
コメントがありましたので、階層の画像を添付します。
イメージ説明
この画像が参考になればと思います・・・。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
追記<2/17 15:49>
クラッシュログを追加しました。

2016-02-17 15:47:27.806 NaigationControllerTest3[10469:1571701] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Pushing a navigation controller is not supported'
*** First throw call stack:
(
    0   CoreFoundation                      0x00000001067f4e65 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x000000010475fdeb objc_exception_throw + 48
    2   UIKit                               0x0000000104da5f6d __71-[UINavigationController pushViewController:transition:forceImmediate:]_block_invoke + 0
    3   UIKit                               0x0000000104da5299 -[UINavigationController pushViewController:animated:] + 848
    4   UIKit                               0x00000001053725d8 __66-[UIStoryboardPushSegueTemplate newDefaultPerformHandlerForSegue:]_block_invoke + 1660
    5   UIKit                               0x00000001052eff5c -[UIStoryboardSegueTemplate _performWithDestinationViewController:sender:] + 460
    6   UIKit                               0x00000001052efd5f -[UIStoryboardSegueTemplate _perform:] + 82
    7   UIKit                               0x00000001052f0023 -[UIStoryboardSegueTemplate perform:] + 156
    8   UIKit                               0x0000000104bc8194 -[UIApplication sendAction:to:from:forEvent:] + 92
    9   UIKit                               0x0000000104fc97b7 -[UIBarButtonItem(UIInternal) _sendAction:withEvent:] + 152
    10  UIKit                               0x0000000104bc8194 -[UIApplication sendAction:to:from:forEvent:] + 92
    11  UIKit                               0x0000000104d376fc -[UIControl sendAction:to:forEvent:] + 67
    12  UIKit                               0x0000000104d379c8 -[UIControl _sendActionsForEvents:withEvent:] + 311
    13  UIKit                               0x0000000104d37b43 -[UIControl _sendActionsForEvents:withEvent:] + 690
    14  UIKit                               0x0000000104d36af8 -[UIControl touchesEnded:withEvent:] + 601
    15  UIKit                               0x0000000104c3749b -[UIWindow _sendTouchesForEvent:] + 835
    16  UIKit                               0x0000000104c381d0 -[UIWindow sendEvent:] + 865
    17  UIKit                               0x0000000104be6b66 -[UIApplication sendEvent:] + 263
    18  UIKit                               0x0000000104bc0d97 _UIApplicationHandleEventQueue + 6844
    19  CoreFoundation                      0x0000000106720a31 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    20  CoreFoundation                      0x000000010671695c __CFRunLoopDoSources0 + 556
    21  CoreFoundation                      0x0000000106715e13 __CFRunLoopRun + 867
    22  CoreFoundation                      0x0000000106715828 CFRunLoopRunSpecific + 488
    23  GraphicsServices                    0x00000001084e1ad2 GSEventRunModal + 161
    24  UIKit                               0x0000000104bc6610 UIApplicationMain + 171
    25  NaigationControllerTest3            0x000000010425ebff main + 111
    26  libdyld.dylib                       0x000000010743c92d start + 1
    27  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

ViewControllerSecondViewControllerに書いてあるコードがあれば教えて下さい。

参考までに、こちらで作ったview1 Sceneの階層を貼っておきますので比べてみて下さい。
view1 Scene

追記

もし、SecondViewControllerのスーパークラスがUINavigationControllerになっているなら、

@interface SecondViewController : UINavigationController

UIViewControllerに修正して下さい。

@interface SecondViewController : UIViewController

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/17 16:31 編集

    >>TakeOneさん
    追記が入れ違いになってしまいましたが、その通りだと思います。

    キャンセル

  • 2016/02/17 16:55

    ①Single View Applicationで新規作成
    ②Embed in で最初のViewControllerにNavigationControllerを追加(最初のViewControllerにView1と名付ける)
    ③右下のパーツからViewControllerを新規で追加(View2と名付ける)
    ④View1でボタンを作成し、View2へPush segueを作成(Ctrl+ドラッグで)
    ⑤SecondViewControllerクラスを作成、View2に設定

    以上が操作した内容です。
    またクラッシュコードは質問本文に追記しました。
    ご確認よろしくお願いします。

    キャンセル

  • 2016/02/17 17:27 編集

    16:29にfuzzballさんが回答を追記されたのを確認していますか?
    15:50にあなたが開示したクラッシュログにより、SecondViewController.hのソースに問題があるのだろうと、既にあたりがついています。
    「SecondViewControllerのソースコードは何も追記してないから問題ないはず」ではないです。
    おそらくSecondViewControllerをXcodeのメニューから作成する時に、「Subclass of:」の欄で「UIViewController」と指定とすべきところを誤って「UINavigationController」と指定したのではないかと推測しています。どうしてもコードを触りたくないなら、SecondViewControllerのファイルを一旦削除して、この点に注意して再度Xcodeのメニューから作り直してもいいですが、「Subclass of:」の指定はSecondViewController.hの@interfaceの記述に反映されるだけですので、fuzzballさんの追記回答にあるように直接コードを修正するだけでよいです。

    キャンセル

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

  • ただいまの回答率 88.07%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る