56331


<https://stackoverflow.com/a/44115223/1979953>

> `self.view.window!.rootViewController?.dismiss(animated: false, completion:
> nil)`
>
> It will dismiss all the presented view controllers and remain root  
>  view controller.

すべてのview controllerをdismissして、root view controllerはいつづけるとありました。

たしかに、試してみるとこの挙動になったのですが、公式の動きなのでしょうか？  
どこかに言及している場所はありますか？

`rootViewController`に限って`dismiss`の動きが特殊（実際に試したところ`rootViewController`に代入されている`ViewController`で`dismiss`しても同じ）なので気になりました。


CC BY-SA 4.0
2019-07-02T04:34:34.083
56311
2019-07-02T17:56:11.660
9008
question
swift ios
rootViewControllerをdismissするとrootViewControllerはいつづけることについてドキュメントは存在しますか？


公式APIドキュメントの
[dismiss(animated:completion:)](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621505-dismiss)
は以下のように記載されています。

> Dismisses the view controller that was presented modally by the view
> controller.  
>  (Google翻訳) View Controllerによってモーダルモードで表示されていたView Controllerを閉じます。

つまり、このメソッドはモーダルモードで表示されたView Controllerを閉じるためのものであり、それ以外の方法で表示されたView
Controllerを閉じる目的では使用できないことがわかります。  
rootViewControllerは当然モーダルで開かれてはいないのでdismissで閉じることはできません。

また、次の記載もあります。

> If you present several view controllers in succession, thus building a stack
> of presented view controllers, calling this method on a view controller
> lower in the stack dismisses its immediate child view controller and all
> view controllers above that child on the stack.  
>  (Google翻訳) 複数のView Controllerを連続して表示して、表示されているView
> Controllerのスタックを構築する場合は、スタックの下の方のView Controllerでこのメソッドを呼び出すと、直接の子View
> Controllerとその子より上のすべてのView Controllerがスタック上で閉じられます。

この2つの挙動の組み合わせにより、

  1. rootViewControllerから開かれた子モーダルVCが閉じる
  2. rootViewControllerはモーダルでないので閉じない

となるのだと思われます。

なお、モーダルかモーダルじゃないかが重要なので、rootViewControllerではなくてもモーダルじゃないVC
(rootがUINavigationControllerでそれにpushされている他のVCなど) も同様になります。

ただし、仕様は「モーダルのVCとその子VCを閉じる」であって、モーダルじゃない場合の挙動は明記されていないので、できればrootViewControllerではなく、閉じたい実際のモーダルVCに対して
dissmiss するほうが良いと思います。


CC BY-SA 4.0
2019-07-02T08:06:21.890
56319
2019-07-02T08:06:21.890
23829
56311
answer


[`dismiss(animated:completion:)`](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621505-dismiss)の動作を論ずるのであれば、公式ドキュメントの以下の部分を正しく理解しておかないといけません。

> The presenting view controller is responsible for dismissing the view  
>  controller it presented. If you call this method on the presented view  
>  controller itself, UIKit asks the presenting view controller to handle  
>  the dismissal.

(拙訳)

> 表示している側のview controllerは、自分の表示したview controllerを dismiss
> する責任があります。もしあなたがこのメソッドを表示された側のview controller自体に対して呼んだ場合、UIKitは表示している側のview
> controllerに dismiss を取り扱うよう依頼します。

いろいろと解釈の余地のある文章ですが、 _call this method on the presented view  
controller **itself**_ の中の _itself_ は、

[code]

    (表示されている側のview controller).dismiss(...)
    
[/code]

のような呼び方を指していると考えられます。

(表示されている子VCの側で、`self.dismiss(...)`とやるのもこれにあたる。)

多くのサンプルコードの中で、子VC側で「自分自身を閉じる」意味で使われている`self.dismiss(...)`ですが、iOS的にはその方が特殊なケースだと言うことになります。

ご質問内に「実際に試したところ`rootViewController`に代入されている`ViewController`で`dismiss`しても同じ」とあるのは、まさにこの記述に沿った動きになっていたと思っているのですが、いかがでしょうか。


CC BY-SA 4.0
2019-07-02T17:56:11.660
56331
2019-07-02T17:56:11.660
13972
56311
answer