Итак, я экспериментировал с этими двумя разными способами объявления переменной ViewController и, похоже, дал мне те же результаты. Однако я считаю, что должна быть разница между установкой переменной destinationVC, потому что в противном случае люди не будут использовать более простой способ просто объявить новый объект?

[используя segue.destination как! ViewControllerName]

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "changeCityName" {
        let destinationVC = segue.destination as! ChangeCityViewController
        destinationVC.delegate = self
    }
}

[с использованием ViewControllerName ()]

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "changeCityName" {
        let destinationVC = ChangeCityViewController()
        destinationVC.delegate = self
    }
}
1
Wu Peirong 31 Дек 2017 в 08:09

2 ответа

Лучший ответ

В методе prepareForSegue эти два метода создания нового виртуального канала сильно различаются.

Если вы используете segue.destination, вы ссылаетесь на конкретный VC, к которому будет переходить, то есть на тот в вашей раскадровке, к которому подключен segue. Если вы создадите новый VC, то созданный вами VC не будет таким, каким будет переход. т.е. вы имеете дело с отдельным ВК. Установка делегата только что созданного виртуального канала ничего не сделает с виртуальным каналом, который фактически представлен.


Если вы говорите о разнице между использованием перехода для представления ВК и этим:

let vc = SomeViewController()
self.present(vc, animated: true)

Тогда разница меньше. Если вы используете сегменты, тогда представления в контроллере представления будут считаны из файла раскадровки (NIB). Если вы создаете VC, вызывая инициализатор, вам придется обрабатывать добавление представлений в свой класс контроллера представления.

0
Sweeper 31 Дек 2017 в 05:33

Результат может быть визуально таким же, но это не так.

Если вы не поместите код внутри подготовки (для перехода), вы все равно получите тот же результат (визуально)

Prepare (для перехода) вызывается, когда UIViewControllers подключаются через раскадровку.

Поскольку UIViewControllers уже подключены в раскадровке, целевой UIViewController вызывается при желаемом событии.

В вашем первом случае , используя (segue.destination as! ViewControllerName), который является правильным способом использования segue.

Прежде чем двигаться дальше, следует обсудить еще одну вещь, а именно:

Почему мы должны писать код внутри подготовки (для перехода), если он уже подключен через раскадровку

1. С помощью одного действия кнопки вы можете подключить несколько сегментов в зависимости от ваших требований, но каждый раз, когда нажимается кнопка, будет вызываться один и тот же метод подготовки (для перехода), поэтому, чтобы различать, какой UIViewController должен вызываться, мы делаем что-то вроде этого

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if(segue.identifier == "FirstViewControllerIdentifier")
    {

    }else if(segue.identifier == "SecondViewControllerIdentifier"){

    }else if(segue.identifier == "ThirdViewControllerIdentifier"){

    }else{

        // and so no
    }


}

Теперь мы получаем готовый объект целевого контроллера (UIViewController), поэтому нам не нужно создавать новый объект целевого контроллера.

2.Мы можем передавать данные контроллеру назначения, а также можем установить делегата

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if(segue.identifier == "FirstViewControllerIdentifier")
    {
        // here we get object of first view controller and set delegate
        let firstVC = segue.destination as! FirstViewController
        firstVC.delegate = self
    }else if(segue.identifier == "SecondViewControllerIdentifier"){
        // here we get object of second view controller and pass some data to it
        let secondVC = segue.destination as! SecondViewController
     secondVC.someData = someData
    }else if(segue.identifier == "ThirdViewControllerIdentifier"){

    }else{

        // and so no
    }


}

Теперь в вашем втором случае с использованием ViewControllerName () (неправильный код)

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if(segue.identifier == "FirstViewControllerIdentifier")
    {
       // here we create object of first view controller.This object is different from the destination view controller
        //you create an object and set a delegate but after that you are not using that object and that object is totallu useless.
        let firstVC = FirstViewController()
        firstVC.delegate = self
        // above code does not affect any thing but the contoller which is to be presented is destination view controller which is connected through storyboard
    }


}

Надеюсь, вы понимаете, как использовать segue, и дайте мне знать, если возникнут проблемы.

0
Vikky 31 Дек 2017 в 06:29