Почему такой код может быть скомпилирован?Вызовите popToRootViewController, анимированный в iOS UIViewController? - PullRequest
0 голосов
/ 24 мая 2019

У меня вопрос по поводу разработки под iOS.Почему это может быть скомпилировано?

__kindof UIViewController *selectedViewController;
[selectedViewController popToRootViewControllerAnimated:YES];

Ответы [ 3 ]

2 голосов
/ 24 мая 2019

Использование __kindof означает, что в этом случае компилятор может предположить, что selectedViewController будет иметь тип UIViewController или любой подкласс, имеющий в своей иерархии UIViewController.

popToRootViewController - это метод UINavigationController.Поскольку UINavigationController является подклассом UIViewController, компилятор говорит:

Хорошо, я собираюсь предположить, что вы знаете, что делаете, и позвольте вам вызвать метод, от которого я знаю, чтоподкласс UIViewController.

Это похоже на использование приведения:

UIViewController *selectedViewController;
[(UINavigationController *)selectedViewController popToRootViewControllerAnimated:YES];

Вы говорите компилятору доверять вам.

Но, конечно,в обоих случаях, если во время выполнения переменная на самом деле не является UINavigationController, то код завершится сбоем во время выполнения.

0 голосов
/ 24 мая 2019

UINavigationController имеет свойство rootViewController и может иметь несколько контроллеров представления, поэтому вы можете получить доступ к первому контроллеру представления с помощью popToRootViewController. Вы можете использовать следующий код для быстрой версии.

    viewController.navigationController?.popToRootViewController(animated: true)
0 голосов
/ 24 мая 2019

UIViewController не может открыть контроллер, UINavigationController делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...