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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

2回答

7695閲覧

presentで開いた画面を閉じ、親画面からpushで開く

tropfen

総合スコア12

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/06/09 12:47

モーダル画面を閉じた後、下記の通り親画面からpushした画面を表示したいのですが、うまく動作させられません。

  • モーダル画面を閉じる前の状態

topViewController -(push)-> listViewController -(present)-> modalViewController

  • モーダル画面で閉じるボタン押下後の期待する状態

topViewController -(push)-> listViewController -(push)-> detailViewController -(push)-> editViewController

modalViewを閉じた後はeditViewが表示され、editViewで戻るボタンを押下した際はdetailViewが表示されるのが理想です。(detailViewの戻るボタンはListViewへ遷移する)

pushViewControllerのみで遷移をしていた場合、setViewControllerで強引に画面遷移の書き換えを行って遷移ができたので、応用して下記の実装で行けるかと思ったのですが、モーダル画面が閉じて終了してしまい、手詰まりの状態です。

lang

1func closeAndPush() { 2 self.dismissViewControllerAnimated(true, completion: { 3 var history = self.navigationController?.viewControllers 4 history?.removeLast() 5 if let detailView = self.storyboard?.instantiateViewControllerWithIdentifier("DetailView") as? detailViewController { 6 history?.append(detailView) 7 if let editView = self.storyboard?.instantiateViewControllerWithIdentifier("EditView") as? editViewController { 8 history?.append(editView) 9 self.navigationController?.setViewControllers(history!, animated: true) 10 } 11 } 12 }) 13}

ナビゲーションのviewControllersを取る位置を変えたりなど、色々と試してはみたのですが、listViewでいずれも処理が終了してしまいます。
手段がない場合、listView以降の画面は、delegateを使用し、必ずlistViewを経由して表示を行う実装を検討しておりますが、表示上スマートではないため、できれば上記仕様を実現したく思っています。

勉強を始めたばかりで概念の部分はほとんど理解できていないのですが、実装せざるを得ない状況のため、お知恵を借りれると大変助かります。

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

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

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

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

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

guest

回答2

0

ベストアンサー

最低限の動作確認しかしていませんが、モーダルを閉じる処理を親のListViewControllerに記述して呼び出すことで思った通りに動作しました。

swift

1import UIKit 2 3// TopViewController 4class TopViewController: UIViewController { 5 6 @IBAction func pushNext(sender: UIButton) { 7 if let listView = self.storyboard?.instantiateViewControllerWithIdentifier("list") as? ListViewController { 8 self.navigationController?.pushViewController(listView, animated: true) 9 } 10 } 11} 12 13// ListViewController 14class ListViewController: UIViewController { 15 16 @IBAction func pushModal(sender: UIButton) { 17 if let modalView = self.storyboard?.instantiateViewControllerWithIdentifier("modal") as? ModalViewController { 18 19 guard var history = self.navigationController?.viewControllers, 20 let detilView = self.storyboard?.instantiateViewControllerWithIdentifier("detail") as? DetailViewController, 21 let editView = self.storyboard?.instantiateViewControllerWithIdentifier("edit") as? EditiewController else { 22 return 23 } 24 25 history.append(detilView) 26 history.append(editView) 27 modalView.editView = editView 28 29 self.presentViewController(modalView, animated: true) { 30 self.navigationController?.setViewControllers(history, animated: false) 31 } 32 } 33 } 34} 35 36// ModalViewController 37class ModalViewController: UIViewController { 38 39 weak var editView: EditiewController! 40 41 @IBAction func pushCloseButton(sender: UIButton) { 42 // 親のViewControllerからModalを閉じる 43 editView?.modalClose(self) 44 } 45} 46 47// DetailViewController 48class DetailViewController: UIViewController { 49 50 @IBAction func pushNext(sender: UIButton) { 51 if let editView = self.storyboard?.instantiateViewControllerWithIdentifier("edit") as? EditiewController { 52 self.navigationController?.pushViewController(editView, animated: true) 53 } 54 } 55} 56 57// EditViewController 58class EditiewController: UIViewController { 59 60 var modalView: ModalViewController! 61 62 func modalClose(modalView: ModalViewController) { 63 modalView.dismissViewControllerAnimated(true, completion: nil) 64 } 65}

image

投稿2016/06/09 14:19

編集2016/06/10 04:05
_Kentarou

総合スコア8490

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

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

tropfen

2016/06/10 02:53

今回はsegueは使わず全てコードから画面遷移を行っているため、適宜読み替えて試したところ、無事に遷移させることができました。 一度ListViewControllerの画面が表示されてしまうのが気になりますが、ひとまずこちらの方法で進めたいと思います。 大変分かりやすい回答ありがとうございました!
_Kentarou

2016/06/10 04:07

やりたい動きが分かったので、ListViewControllerも表示されないように修正しました。 確認してみてください。
tropfen

2016/06/10 09:05

編集頂いた内容で動作確認が取れました。 特殊な動きをさせようとしているのは分かっていたのですが、やはり複雑度が増しますね。 大変勉強になりました。ありがとうございました!
guest

0

  • ナビゲーションコントローラのviewControllersを得る
  • modalViewControllerpresentingViewController(listViewController)のインスタンスを得る
  • viewControllersの配列の0からlistViewControllerのインデックスまでの要素を得る
  • 抜き出した要素の末尾にdetailViewController、editViewControllerのインスタンスを足す
  • ナビゲーションコントローラのsetViewControllers()に渡す

投稿2016/06/09 14:02

編集2016/06/09 14:20
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問