Передача данных в конкретный контроллер представления без перехода - PullRequest
0 голосов
/ 06 января 2019

Я пытаюсь передать простое значение вперед в экземплярный экземпляр контроллера представления. Я не уверен в правильном способе сделать это.

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

Это решение обновляет переменную в моем экземпляре контроллера представления в момент создания экземпляра.

Я использую Mapbox и при нажатии аннотации пытаюсь передать уникальное значение, хранящееся в моей базе данных, в подробный вид аннотации. Приведенный ниже пример упрощен до всего, что, по моему мнению, имеет значение для решения проблемы.

В моем первом контроллере вида, вид карты:

// function that fires on annotation tap
func mapView(_ mapView: MGLMapView, didSelect annotation: MGLAnnotation) {

        let placeID = "123456" // simplified for the purpose of this question

        func createPlaceDetailSheet() {

            let placeDetailSheet = PlaceDetailViewController()

            self.addChildViewController(placeDetailSheet)
            self.view.addSubview(placeDetailSheet.view)
            placeDetailSheet.didMove(toParentViewController: self)

            let height = view.frame.height
            let width  = view.frame.width
            placeDetailSheet.view.frame = CGRect(x: 0, y: self.view.frame.maxY, width: width, height: height)

            placeDetailSheet.uniqueID = "123456" // trying to set value here
    }

        createPlaceDetailSheet()
    }

Во втором контроллере представления у меня есть следующее:

class PlaceDetailViewController: UIViewController {

    var uniqueID: String = ""

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

Я ожидаю, что уникальный идентификатор ("123456") будет напечатан из второго контроллера представления, но печатается только инициализатор пустой строки.

Я часами читал статьи о переполнении стека, пытаясь решить эту проблему, и теперь я в полном восторге. Большинство ответов основаны на использовании executeSegue, которое я не использую. Я также не уверен, является ли подход выше или использование протоколов и делегатов правильным вызовом.

Спасибо.

1 Ответ

0 голосов
/ 06 января 2019

Представление загружается при доступе к переменной для добавления подпредставления, поэтому оператор print в методе viewDidLoad выполняется до того, как вы установите значение uniqueID контроллера.

Установите uniqueID сразу после установки класса контроллера.

let placeDetailSheet = PlaceDetailViewController()

placeDetailSheet.uniqueID = "123456"

Либо создайте пользовательский инициализатор контроллера, который принимает уникальный идентификатор в качестве аргумента.

class PlaceDetailViewController: UIViewController {

    // MARK: Properties

    var uniqueID: String = ""

    // MARK: Initializers

    init(uniqueID: String) {
        self.uniqueID = uniqueID
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    // MARK: View Lifecycle

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

let placeDetailSheet = PlaceDetailViewController(uniqueID: "foo")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...