2017-11-17 8 views
0

まずは、この問題を解決するためにすべてのことについてiveを試してみてください。 ?スウィフト4:閉鎖コードの実行を拒否する

コード:この次の印刷ラインは上記のコードの行を実行し、ないということである理由

self.messagesControl?.showChatController() 

が実行されていない、それは却下()クロージャ内にありますか助けてください!

messagesControlメソッド呼び出し

var messagesControl : MessagesViewController? 
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

     self.dismiss(animated: true, completion: { 
      self.messagesControl?.showChatController() 
      print("dismiss closure finished running") 
     }) 

} 

showChatControllerは()

func showChatController() 
{ 
    performSegue(withIdentifier: "goToChatLogControllerPlz", sender: self) 
} 

期待される結果:

: セグエが実行される印刷ラインは

観測結果を実行します

印刷行が実行されます。何セグエない:(私は交換した

EDIT

self.messagesControl?.showChatController() 

をして:

 self.performSegue(withIdentifier: "showChatController", sender: self) 

まだ問題があることであるカントー:(

+0

どのようにmessagesControlを割り当てましたか?あなたは確信しています、あなたが完了時にcompletionHandlerを呼び出すとき、messagesControlはnilではありません。 –

+0

私はテストするセグを直接リンクして同じ問題を抱えているので、問題がないことを確認します。私はこのチュートリアル(ima noob)を使用しています –

+0

https://www.youtube.com/watch?v=cw0gLZHJOiE&list= PL0dzCUj1L5JEfHqwjBV0XFb9qx9cGXwkq&index = 9 –

答えて

-1

同じ結果を得ますからセグを実行しようとしていますはもう存在しません。あなたがすべきことは、問題のView Controllerの親にSegueを接続し、親View ControllerにSegueを実行させることです。あなたのコードは、Appleが却下ない方法が奇妙である親ビューコントローラでこの

var messagesControl : MessagesViewController? 
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    dismiss(animated: true, completion: { [weak self] 
     self?.parent?.showChatController() 
    }) 
} 

func showChatController(){ 
    performSegue(withIdentifier: "goToChatLogControllerPlz", sender: self) 
} 
0

ようになります。あなたは、提示されたVC上または発表者上でそれを呼び出すことができます。あなたはここで何をしていますか?表示されたビューコントローラで呼び出す場合は、閉じた後にメモリを残し、いずれの場合でも次のビューコントローラを表示してはいけません。親はすべきです。

  1. がアンワインドセグエを使用します。

    は、あなたがこの問題に対処できる3つの方法があります。親がアンワインドを取得すると、今度は のように、 を呼び出して、コンプレクションハンドラでセグを実行します。

  2. デリゲートを使用して、モーダルショーを終了するときに親に伝えます。その後親は却下を呼び出してセグを開始する。
  3. 閉じる前に親VCを見つけるためにUIResponderチェーンを上げてください。あなたの親VCでperformSegueコールを終了するための完了で。

方法1は、モーダルの最終状態のみが関連する場合(つまり、他に何も代理人を必要としない場合)に適しています。デリゲートを既に使用している場合は、方法2を使用することをお勧めします。方法3は最小のコードですが、親VCが呼び出すことができる標準プロトコルに準拠していない限り、一般的に貧弱なスタイルです。

関連する問題