2016-12-17 15 views
1

Iは、一つの画面に提示された場合、右から左への標準的な「ショー」セグエが提示さUITableViewControllerあり、別の画面(UIViewController)から提示されたとき、底部からモーダル提示されます。私は数ヶ月前に尋ねたquestion(スクリーンショットあり)の助けを借りてこれを正しく動作させました。なぜこのUITableViewControllerはモーダルを解除しますか?

鍵はUITableViewCellから作成する代わりに、自分の設定画面のUINavigationControllerから共有UITableViewControllerにセグを作成していました。しかし、奇妙なことに、右から左に正しく提示されても、それを却下することはモーダルで(上から下に)閉じます。

私が提示テーブルビューコントローラにそれが解雇を処理するので、それが提示だUITableViewControllerのデリゲートを作ってるんです。ここでは、実装したプロトコルと拡張子は(スウィフト2.3)です:

protocol DismissalDelegate : class { 
    func selectionDidFinish(controller: UIViewController) 
} 

extension DismissalDelegate where Self: UIViewController { 
    func selectionDidFinish(viewController: UIViewController) { 
     self.dismissViewControllerAnimated(true, completion: nil) 
    } 
} 

そして私は提示コントローラで定義されたセグエでそれを設定します。ユーザーが行ったときに提示テーブルビューコントローラがdelegate?.selectionDidFinish(self)を呼び出し

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "goToLifts" { 
     let destination = segue.destinationViewController as! LiftSelectionTableViewController 
     destination.dismissalDelegate = self 
    } else { 
     return 
    } 
} 

didSelectRowAtIndexPathで)選択::提示テーブルビューコントローラにこのメソッドを呼び出す

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     tableView.deselectRowAtIndexPath(indexPath, animated: true) 
     guard (dismissalDelegate != nil) else { 
      return 
     } 
     dismissalDelegate?.selectionDidFinish(self) 
    } 

私はビューコントローラを表示するためにAPIsを見てきましたが、これを制御するオプションを公開しているものは見つかりませんでした。 dismiss(animated:completion:) APIは、モーダルに表示されているビューコントローラを無効にするためのものだとも言っていますが、私は解雇に関連して何もしていません。

は、どのように私はこの事は、それが私のUITableViewControllerから提示(右から左へ、そしてバック)が、他のビュー(UIViewController)から提示されたとき、モーダル動作を保つだとき、それが提示のと同じ方法を解任するために得ることができますか?

答えて

1

私が提示ビューコントローラがLiftSelectionTableViewControllerを提示してしまった方法を知っている必要がありますので、あなたがデリゲートを使用しているように見える、ここで少し混乱しています。

だからテーブルビューコントローラでは、あなたが他のビューコントローラで

func selectionDidFinish(viewController: UIViewController) { 
    self.navigationController?.popViewControllerAnimated(true) 
} 

を持っているでしょう私が間違っていると、あなたはどのように知ることができない場合は、

func selectionDidFinish(viewController: UIViewController) { 
    self.dismissViewControllerAnimated(true, completion: nil) 
} 

を持つべきですビューコントローラが提示された場合、ナビゲーションコントローラ上のトップビューコントローラがビューコントローラに提示されているかどうかをチェックすることを試みる。表示コントローラがポップしている場合はポップし、そうでない場合はビューコントローラを閉じます。

func selectionDidFinish(viewController: UIViewController) { 
    if self.navigationController?.topViewController == viewController { 
     self.navigationController?.popViewControllerAnimated(true) 
    } else { 
     self.dismissViewControllerAnimated(true, completion: nil) 
    } 
} 
+0

彼は正しかったです。 +1 –

+0

@ジェフリー、それはかなり近いです。両方ともtableViewControllerです。私はあなたの両方の提案を試みましたが、その動作は同じです。何が起きているのか分からなかったので、私は自分の質問と例を編集して理解しやすくしました(あなたは正しい、それははっきりとは分かりませんでした)。見てみて、違いがあるかどうか私に知らせてください。 – Jim

+0

私はデリゲートビューコントローラで 'func selectionDidFinish(viewController:)'メソッドを実装する必要がないことに気づきました。プロトコルに準拠すれば、拡張で定義された実装を自動的に持つからです。だから私はあなたの提案をプロトコルの拡張に入れ、それは動作します!それはあなたが私がそれを置くべきだと示唆していた場所ですか? – Jim

関連する問題