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

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

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

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

Q&A

解決済

1回答

2874閲覧

メイン画面からモーダル画面1を開き、ボタン押下するとモーダル画面1を閉じてモーダル画面2を表示する方法

i-yamaguchi

総合スコア7

Swift

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

0グッド

1クリップ

投稿2017/05/10 02:54

編集2017/05/10 17:11

下記のオペレーションを実現するためにはどのように実装するべきかをご教示いただければと思います。

###環境
swift3

###前提・実現したいこと

【画面構成】
・メイン画面
・モーダル画面1
・モーダル画面2

【実現したいオペレーション】
<1>メイン画面からモーダル画面1をモーダル表示
<2>モーダル画面1で次へボタンを押下
<3>モーダル画面1を閉じる
<4>モーダル画面2をモーダル表示←これが実現できないです

【※追加情報】
<3>で閉じる必要はあります。モーダル表示する際、背景を透過しています。<4>で画面を表示した際に、<3>の画面を背景に見せたくありません。
NavigationControllerは未使用です。

###発生している問題・エラーメッセージ

<3>のモーダル画面1を閉じるところまではできるのですが、delegateで呼び出したメイン画面のメソッドで「performSegueメソッド」や「presentメソッド」を実行してもモーダル画面2が呼び出せません。

初めて投稿します。至らぬ点などありましたらお知らせください。宜しくお願いします。

###解決後ソース
イメージ説明

swift

1 2import UIKit 3 4class ViewController: UIViewController, Modal1ViewControllerDelegate { 5 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 } 9 10 override func didReceiveMemoryWarning() { 11 super.didReceiveMemoryWarning() 12 } 13 14 @IBAction func goBack(_ segue:UIStoryboardSegue) {} 15 16 @IBAction func goNext(_ sender:UIButton) { 17 let next = storyboard!.instantiateViewController(withIdentifier: "nextView") 18 self.present(next,animated: true, completion: nil) 19 } 20 21 // セグエ遷移用に追加 ↓↓↓ 22 @IBAction func goNextBySegue(_ sender:UIButton) { 23 performSegue(withIdentifier: "nextSegue", sender: nil) 24 } 25 26 func goToNextPage() { 27 print("Modal1ViewControllerのdelegate") 28 performSegue(withIdentifier: "nextSegue2", sender: nil) 29 } 30 31 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 32 if(segue.identifier == "nextSegue"){ 33 print("aaa") 34 let modal1ViewController = segue.destination as! Modal1ViewController 35 modal1ViewController.delegate = self 36 }else if(segue.identifier == "nextSegue2"){ 37 print("bbb") 38 } 39 } 40}

swift

1import UIKit 2 3protocol Modal1ViewControllerDelegate: class { 4 func goToNextPage() 5} 6 7class Modal1ViewController: UIViewController { 8 weak var delegate: Modal1ViewControllerDelegate? 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 } 13 14 override func didReceiveMemoryWarning() { 15 super.didReceiveMemoryWarning() 16 } 17 18 @IBAction func didTappedNextPage(_ sender: Any) { 19 self.dismiss(animated: true, completion: nil) 20 self.delegate?.goToNextPage() 21 } 22}

swift

1import UIKit 2 3class Modal2ViewController: UIViewController { 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 } 8 9 override func didReceiveMemoryWarning() { 10 super.didReceiveMemoryWarning() 11 } 12}

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

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

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

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

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

fuzzball

2017/05/10 04:12

<3>で閉じる必要はあるのでしょうか? NavigationControllerは使用しているでしょうか?
i-yamaguchi

2017/05/10 04:37

ご指摘ありがとうございます。【※追加情報】 を付記しました。ご助力宜しくお願いします。
guest

回答1

0

ベストアンサー

present(_:animated:completion:)でもperformSegue(withIdentifier:sender:)でも遷移できるはずです。

  • 「メイン画面のメソッド」がちゃんと呼び出されているか?
  • presentの場合 → モーダル画面2のViewControllerを正しく取得出来ているか?
  • performSegueの場合 → Segue Idを正しく設定出来ているか?

この辺りを確認してみて下さい。

投稿2017/05/10 05:01

fuzzball

総合スコア16731

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

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

i-yamaguchi

2017/05/10 05:10

ありがとうございます。確認してみます。
i-yamaguchi

2017/05/10 17:12

無事解決しました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問