Не удается передать значения в переходе UIStoryBoard

Мне нужно отправить логическое значение во второй viewController на основе некоторого условия. но во втором ViewController значение переменной bool всегда ложно. Это код первого ViewController:

import UIKit

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}
@IBAction func moveTo(_ sender: Any) {
    self.performSegue(withIdentifier: "Move2", sender: self)

}
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
    if segue.identifier == "Move2"
    {
        let secondVC = segue.destination as? SecondViewController
        secondVC?.second = true

    }
}
  override func didReceiveMemoryWarning() {
      super.didReceiveMemoryWarning()
      // Dispose of any resources that can be recreated.
  }
}

Код SecondViewController

import UIKit

class SecondViewController: UIViewController {
var second = Bool()

override func viewDidLoad() {
    super.viewDidLoad()
    print(second)
    // Do any additional setup after loading the view.
}

Но это значение второй переменной ложно.

Что не так в моем коде. нужна помощь. ТИА..

РЕДАКТИРОВАТЬ: В обоих ViewController у меня есть навигационный контроллер. Это проблема. SecondVC — это навигационный контроллер SecondViewController, поэтому я не могу передавать данные в этот secondVC.


person Vimalkumar N.M.    schedule 11.04.2018    source источник
comment
Вы установили идентификатор перехода в раскадровке? Щелкните стрелку перехода и в инспекторе идентификации установите идентификатор перехода как Move2.   -  person Alejandro Iván    schedule 11.04.2018
comment
Убедитесь, что class вашего SecondViewController был установлен в раскадровке.   -  person vacawama    schedule 11.04.2018
comment
да .. установить как Move2   -  person Vimalkumar N.M.    schedule 11.04.2018
comment
@vacawama это тоже сделано   -  person Vimalkumar N.M.    schedule 11.04.2018
comment
оставьте точку останова на строке secondVC?.second = true. и отладка компилятора останавливается здесь.   -  person MRizwan33    schedule 11.04.2018
comment
Прикрепите отпечаток под secondVC?.second = true, чтобы убедиться, что secondVC не равно нулю и действительно имеет это назначение.   -  person bauerMusic    schedule 11.04.2018
comment
изменить second = Bool() to second: Bool = false   -  person Scriptable    schedule 11.04.2018
comment
Объявите эту переменную как необязательную var second:Bool!   -  person RajeshKumar R    schedule 11.04.2018
comment
@bauerMusic secondVC?.second это ноль   -  person Vimalkumar N.M.    schedule 11.04.2018
comment
Ну вот и все. Это ваша проблема. Это означает, что secondVC равно нулю. Это означает, что венчурный капитал, который вы получаете, — это не то, что вы думаете. Попробуйте посмотреть в отладчике   -  person bauerMusic    schedule 11.04.2018
comment
@RajeshKumarR теперь печатается как ноль   -  person Vimalkumar N.M.    schedule 11.04.2018
comment
Таким образом, значение не передается из предыдущего контроллера представления. Использовали ли вы точки останова в методе prepareforsegue?   -  person RajeshKumar R    schedule 11.04.2018
comment
Убедитесь, что объект secondVC создан, а не равен нулю   -  person RajeshKumar R    schedule 11.04.2018
comment
Сегмент работает. Кажется, что ViewController не является классом SecondViewController.   -  person bauerMusic    schedule 11.04.2018
comment
@RajeshKumarR второй VC равен нулю. объект не создан.   -  person Vimalkumar N.M.    schedule 11.04.2018
comment
Попробуйте: print(String(describing: segue.destination)) Посмотрите, какого класса венчурный капитал вы получаете.   -  person bauerMusic    schedule 11.04.2018
comment
print(segue.destination) и проверьте имя класса контроллера целевого представления   -  person RajeshKumar R    schedule 11.04.2018
comment
в обоих контроллерах просмотра он содержит контроллер навигации. Я удалил навигационный контроллер во втором VC. теперь он работает нормально .. это проблема?   -  person Vimalkumar N.M.    schedule 11.04.2018
comment
Перетащите ли вы свой переход из ViewController или из кнопки.   -  person Kazi Abdullah Al Mamun    schedule 11.04.2018
comment
@KaziAbdullahAlMamun из контроллера представления   -  person Vimalkumar N.M.    schedule 11.04.2018
comment
Тогда это должно работать, возможно, проблема была с navController, о чем вы упомянули выше.   -  person Kazi Abdullah Al Mamun    schedule 11.04.2018
comment
Проверьте дубликат, чтобы узнать, как передавать данные через UINavigationController.   -  person vacawama    schedule 11.04.2018


Ответы (2)


Перейдите в свою раскадровку и выберите SecondViewController (желтый кружок в левом верхнем углу). Перейдите к инспектору удостоверений и выберите SecondViewController в раскрывающемся списке «Класс».

См. изображение ниже:

введите здесь описание изображения

person Martin Muldoon    schedule 11.04.2018
comment
в обоих контроллерах просмотра он содержит контроллер навигации. Я удалил навигационный контроллер во втором VC. теперь он работает нормально .. это проблема? - person Vimalkumar N.M.; 11.04.2018
comment
Если бы SecondViewController был встроен в контроллер навигации, это вызвало бы проблему. Обычно ваш First VC встроен, и все. - person Martin Muldoon; 11.04.2018

Держите вещи простыми и чистыми:

Первый венчурный капитал:

override func prepare(for segue: UIStoryboardSegue, sender: Any?)
    {
        if segue.identifier == "Move2"
        {
            let secondVC = segue.destination as? SecondViewController
            secondVC.second = true

        }
    } 

Второй венчурный капитал:

class SecondViewController: UIViewController {
    var second: Bool = false

    override func viewDidLoad() {
        super.viewDidLoad()
        print(second)
    }  
}  

Только что проверил это на себе. true печатается.

person Nitish    schedule 11.04.2018
comment
secondVC?.second = true — необязательно - person Scriptable; 11.04.2018
comment
Как насчет if let secondVC = ..., secondVC является необязательным. - person bauerMusic; 11.04.2018
comment
@Scriptable: я не вижу необходимости в дополнительном. - person Nitish; 11.04.2018
comment
let secondVC = segue.destination as? SecondViewController как? создает необязательный - person Scriptable; 11.04.2018
comment
Вы можете изменить as? на as!, что является вполне допустимым кодовым решением. Вы бы хотели, чтобы он рухнул, если бы у вас не было перехода к правильному типу VC. - person vacawama; 11.04.2018
comment
@Scriptable: Вы пробовали это? Нет нет необходимости использовать этот необязательный параметр в secondVC?.second = true - person Nitish; 11.04.2018
comment
@vacawama Я должен не согласиться, допущение сбоя не является допустимым решением для кодирования. - person Scriptable; 11.04.2018
comment
@Scriptable, отсутствие подключения вашего перехода к правильному типу является ошибкой программирования, а не ошибкой времени выполнения. Это все равно, что не подключить розетку. Вы хотите, чтобы это рухнуло, чтобы найти проблему. - person vacawama; 11.04.2018
comment
@Nitish, это не имеет большого значения, просто пытаюсь улучшить свой ответ. let vc = SecondViewController() let secondVC = vc as? SecondViewController print(secondVC) печатает необязательный. xcode автоматически исправляет secondVC.second = true на secondVC?.second = true попробуйте - person Scriptable; 11.04.2018
comment
Вы не можете иметь кастинг as?, возвращающий необязательный. - person bauerMusic; 11.04.2018
comment
в обоих контроллерах просмотра он содержит контроллер навигации. Я удалил навигационный контроллер во втором VC. теперь он работает нормально .. это проблема? - person Vimalkumar N.M.; 11.04.2018
comment
@VimalkumarN.M. Нет, это не должно вызывать никаких проблем, если вам не нужен навигационный контроллер. - person Scriptable; 11.04.2018
comment
@Nitish @Scriptable, в чем разница между var myBool = Bool() и var myBool = false, оба инициализируются ложным логическим значением. - person Kazi Abdullah Al Mamun; 11.04.2018
comment
@Scriptable, если бы он использовал as!, он бы вылетел, говоря, что UINavigationController нельзя преобразовать в SecondViewController, и мы бы решили эту ошибку за 30 секунд. - person vacawama; 11.04.2018
comment
@KaziAbdullahAlMamun ничего, myBool: Bool() недействителен. Вакамама согласился, что мы бы быстрее занялись этим вопросом. Я использую Swiftlint и подтверждаю свой стиль кода. github.com/realm/SwiftLint/blob/master/ - person Scriptable; 11.04.2018