1

モーダルコントローラーを終了し、最初のモーダルコントローラーのボタンを押して新しいモデルコントローラーを表示しようとしています。私はこの試みた:現在のモーダルビューコントローラーを終了し、新しいモーダルビューコントローラーを表示します。

dismiss(animated: true, completion: {_ in 
       self.navigateToAtmDetail(atmId:id) 

      }) 

をしかし、すぐに現在のビューコントローラが却下され、それは却下したままで、次のコントローラに移動しません。また、私たちはストーリーボードやセグの代わりにペン先を使用しているので、それらにアクセスすることはできません。現在のモーダルビューコントローラを却下する方法は、新しいモーダルビューコントローラを提示するよりも簡単ですか?

+3

あなたはモーダル1ではなく、プレゼンテーションビューコントローラに新しいものを提示する必要があります。 – chengsam

+0

navigateToAtmDetail関数内のコードは何ですか? – muazhud

答えて

4

私はここでもっと答えを出そうとします。 iOSでプログラミングするときは、すべてのインスタンスを他のインスタンスから作成する必要があります。インスタンスとは、インスタンス化されたオブジェクト(コンピュータのメモリ内に作成されたオブジェクト)を意味します。したがって、Xcodeを使ってプロジェクトを作成するときはいつも、'最初のビューコントローラ'をマークする必要があります。 (See that the bottom right says 'is initial View Controller, ask yourself... why does XCode really need to know that?')これは最初に作成するインスタンスです。次に、他のインスタンスを生成するために使用されます。 Appleがこのアーキテクチャを選択した理由はセキュリティ上の理由によるものです(私は...誰かが良い答えを持っていれば私を正しています)。ビューのすべての「インスタンス」を非常に明確に見ることができます。このボタンをクリックすると、はXCodeでプログラムを実行していますです。次に、ビューの階層を見ることができます。私はボタンをクリックすると別のビューを読み込むシンプルなプログラムを作った。ここで私はボタンをクリックせず、1つのビューしかロードしていません。 Before I click the button and add a new viewしかしここで私はボタンをクリックし、次のビュー、enter image description hereをロードしました。上部には、両方ともUIWindowと表示されます。それは...(私があなたがこの部分を推測できることを願っています!)両方ともUIWindow Viewからインスタンス化されているからです。私を信じていない?これをチェック!実際のビュー階層は次のとおりです。 The one where the button has not been pressedおよびThe one where the button has been pressed。だから、あなたが私のポイントが何であるかを知りません。あなたはあなたの質問を読むだけで、あなたが却下しようとしている別のモデルコントローラからモデルコントローラをインスタンス化しようとしていることは明らかです。したがって、モデルコントローラが却下された場合、別のモデルコントローラをどのようにインスタンス化することになっていますか?また、MenuViewController、MainController、VideoControllerなどの目的の後で、コントローラの名前を付ける方がよいことにも注意してください。 modelという語は通常MVCで使用され、ViewControllerの名前の一部として使用しないでください。 (私はXDを教える方法であるので、私はXDを教える方法ですので、嫌な笑を聞いていない、私は中高生を教えていました)

+0

非常に目を和らげる答え! –

1

試してみてください。

let presenting = (self.presentingViewController.childViewControllers[0] as! <VIEWCONTROLLERTYPE>) //Or whatever index your controller is! 
dismiss(animated: true, completion: {_ in 
       presenting.navigateToAtmDetail(atmId:id) 

      }) 

ご提示コントローラのタイプがあります。 navigateToAtmDetailメソッドを他のコントローラに移動する必要もあります

短い説明(以下の回答で詳しく説明します)は、すでに解除されているコントローラから新しいコントローラを表示することができないということです。だから私たちは(presentingViewController)を提示しているコントローラーに戻って、navigationViewControllerになりたいと思っています。これには必要なロジックがないため、(childViewControllers[x])の子ビューコントローラが必要です。次に、次のプレゼンテーションロジックを実行するようコントローラに指示します。がんばろう!

+0

どこに行くのか分かりますが、エラーが返されます:インスタンスメソッド 'navigateToAtmDetail'は 'BGMATMLocatorDetailViewController'のメンバタイプではありません – SwiftyJD

+0

申し訳ありませんが、あなたがコメントしていた間に投稿を編集した可能性があります。もう一度チェック! – Mars

+0

OK、もう一度試しましたが、EXC_BAD_INSTRUCTIONがスローされました。オプション値のアンラッピング中に予期せずnilが見つかりました – SwiftyJD

関連する問題