Как понять эту строку кода Swift для всплывающего в корневой контроллер представления?
Я хочу написать некоторый код для извлечения из текущего контроллера представления обратно в корневой контроллер представления. Достаточно запутанно, я нашел многочисленные ответы на этот счет со всеми видами синтаксиса. (Я предполагаю старые ответы в Objective C или другой версии Swift...) Вот самый простой синтаксис, который в настоящее время работает для меня в моем AppDelegate:
let navigationViewController = self.window?.rootViewController as! UINavigationController
[navigationViewController .popToRootViewController(animated: true)]
Я получил это далеко, просмотрев этот ответ: /questions/33656213/dostup-k-kornevomu-kontrolleru-predstavleniya-v-delegate-prilozheniya/33656236#33656236 Его синтаксис пренебрегал другим, я думаю, это старый синтаксис, поскольку он был с 2012 года, поэтому мне пришлось немного его изменить, но это работая с моим кодом выше.
Вопрос: я не очень понимаю, что происходит во 2-й строке кода. Конечно, я понимаю, что он возвращается к корневому контроллеру представления, но я вообще не понимаю синтаксис. Наиболее запутанным является то, что код окружен парой скобок [ ], которые я совсем не понимаю. Затем popToViewController начинается с точки '.', Которая отличается от ответа, который я связал. Я привык использовать "." чтобы получить доступ к свойствам объекта, но вот он просто используется автономно без чего-либо с левой стороны от него.
Этот код, кажется, функционирует нормально для меня, но какие бесчисленные версии синтаксиса и способов возврата к контроллеру корневого представления, которые я обнаружил в Интернете, я понятия не имею, правильно ли то, что я делаю, или как оно работает все. Все, что я знаю, это "это работает прямо сейчас". Пожалуйста, помогите мне понять этот код.
2 ответа
Класс UINavigationController имеет внутри метод с именем popToRootViewController, который принимает параметр bool с именем animated. Если вы передадите анимированное значение как true, навигация произойдет с анимацией.
Таким образом, чтобы вызвать метод в цель с
UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
[navigationController popToRootViewControllerAnimated:YES];
Выше в первый раз мы получили указатель на navigationController. Используя это, мы вызываем метод popToRootViewControllerAnimated внутри класса UINavigationController со значением параметра YES(в Objc YES для true, а NO для false)
То же самое выше может быть написано в быстром как
let rootNavController = self.window?.rootViewController as! UINavigationController
rootNavController.popToRootViewController(animated: true)
Как и в сценарии в OBjc, приведенный выше синтаксис написан быстро. мы получаем экземпляр navController и вызываем метод popToRootViewController ()
На самом деле это просто массив...
Вы могли бы написать: navigationViewController.popToRootViewController(animated: true)
И это сделало бы то же самое.
Если вы делаете:
let x = navigationViewController.popToRootViewController(animated: true)
x
будет содержать необязательный массив UIViewController
типа [UIViewController]?
Если вы делаете:
let x = [navigationViewController.popToRootViewController(animated: true)]
x
будет содержать массив с необязательным массивом UIViewController
типа [[UIViewController]?]
Если вы делаете:
[navigationViewController.popToRootViewController(animated: true)]
Массив массива никогда не будет использоваться...
И пространство просто игнорируется в Swift, например, вы можете сделать:
myObject
.myMethod()
Это часто используется для свободного синтаксиса...
РЕДАКТИРОВАТЬ:
Вызов Objective C для этого метода будет:
[navigationViewController popToRootViewControllerAnimated: YES];