Как понять, что эта строка кода Swift появляется в корневом контроллере представления?

Я хочу написать некоторый код для извлечения из текущего контроллера представления обратно в корневой контроллер представления. Как ни странно, я нашел множество ответов по этому поводу со всевозможным синтаксисом. (Я предполагаю, что старые ответы в Objective C или другой версии Swift...) Вот самый простой синтаксис, который сейчас работает у меня в моем AppDelegate:

let navigationViewController = self.window?.rootViewController as! UINavigationController

[navigationViewController .popToRootViewController(animated: true)]

Я зашел так далеко, просмотрев этот ответ: https://stackoverflow.com/a/23027260/8887398 Его синтаксис пренебрегал отличается, что, я думаю, является старым синтаксисом, так как он был с 2012 года, поэтому мне пришлось его немного изменить, но он работает с моим кодом выше.

Вопрос: я не совсем понимаю, что происходит во второй строке кода. Конечно, я понимаю, что он возвращается к корневому контроллеру представления, но я вообще не понимаю синтаксиса. Больше всего сбивает с толку то, что код окружен парой квадратных скобок [ ], которые я вообще не понимаю. Затем popToViewController начинается с точки '.', которая отличается от ответа, который я связал. Я привык использовать '.' для доступа к свойствам объекта, но здесь он просто используется отдельно, без чего-либо слева от него.

Этот код, кажется, работает правильно для меня, но какие бесчисленные версии синтаксиса и способы возврата к корневому контроллеру представления я нашел в Интернете, я понятия не имею, правильно ли то, что я делаю, или как это работает в все. Все, что я знаю, это «это работает прямо сейчас». Пожалуйста, помогите мне понять этот код.


person Birdman    schedule 25.02.2019    source источник
comment
использование [ ] является объективным подходом в Swift, вы можете просто написать navigationViewController.popToRootViewController(animated: true)   -  person Manish_Nainwal    schedule 25.02.2019
comment
Это код Objective-C в связанном ответе. Вам не нужен [] вокруг вызова метода.   -  person Dávid Pásztor    schedule 25.02.2019
comment
Код, который вы написали, неверен. Квадратные скобки - это синтаксис target-c, а не быстрый. Если вы пишете что-то в квадратных скобках в Swift, это рассматривается как объект внутри массива.   -  person Pankaj Teckchandani    schedule 25.02.2019
comment
Вау, тогда это просто игнорирует мое пространство? Кроме того, любое объяснение этого синтаксиса, даже если это Objective-C, было бы полезно.   -  person Birdman    schedule 25.02.2019


Ответы (2)


Внутри класса UINavigationController есть метод с именем popToRootViewController, который принимает логический параметр с именем анимированный. Если вы передадите анимированное значение как true, навигация будет происходить с анимацией.

Итак, чтобы вызвать метод в цели c

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, приведенный выше синтаксис написан на языке swift. мы получаем экземпляр navController и вызываем метод popToRootViewController()

person Pankaj Teckchandani    schedule 25.02.2019

На самом деле это просто массив...

Вы можете написать: 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];
person Zaphod    schedule 25.02.2019
comment
Нет, OP пытался скопировать код Objective-C в Swift без изменения синтаксиса. - person Dávid Pásztor; 25.02.2019
comment
@DávidPásztor В Objective-C между объектом и именем метода в вызове в скобках нет точки. - person Zaphod; 25.02.2019
comment
Хорошо, это имеет больше смысла ... Я не понимал, как Objective-C вызывает вызовы методов ... это так неудобно. - person Birdman; 25.02.2019
comment
@Birdman Хорошо, если это имеет больше смысла, вы можете принять ответ;)! - person Zaphod; 25.02.2019
comment
@Zaphod да, OP неправильно скопировал код :) Технически вы правы, это будет массив, содержащий Void, но это не настоящий ответ. Настоящий ответ - OP скопировал код Obj-C, не осознавая этого. - person Dávid Pásztor; 25.02.2019