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

Это мой текущий код

func(){

       let vc = storyboard?.instantiateViewControllerWithIdentifier("messagesViewController") as! UINavigationController
        let posts = self.postList[indexPath.row]

        //this is the var that i want to past
       //vc.previousViewMessageId = posts.postKey

        self.presentViewController(vc, animated: true, completion: nil)


}
0
SwiftER 7 Сен 2016 в 20:49

3 ответа

Лучший ответ

Если я вас правильно понял, у вас есть контроллер представления, который может представлять второй VC. И этот VC встроен в UINavigationController. Что вы не знаете, как это сделать, так это передать данные из первого виртуального канала в контроллер навигации, а затем во второй виртуальный канал.

Вот решение грубой силы. Это не красиво, но все равно работает.

Создайте свой собственный подкласс UINavigationController:

class DataPasserController: UINavigationController {
    var previousViewMessageId: SomeType?
    override func viewDidLoad() {
        if let vc = self.topViewController as? YourSecondViewController {
            vc.previousViewMessageId = self.previousViewMessageId
        }
    }
}

Теперь вы можете добавить контроллер навигации в раскадровку, установить для него класс DataPasserController и подключить к нему второй VC в качестве корневого контроллера представления.

Теперь предположим, что у вас есть экземпляр DataPasserController, вызвав instantiateViewControllerWithIdentifier, вы можете сделать это:

yourDataPasserControllerInstance.previousViewMessageId = posts.postKey

И представьте экземпляр!

0
Sweeper 7 Сен 2016 в 18:05

Чтобы передать значение корневому контроллеру представления контроллера навигации, вы получаете доступ к viewControllers[0] и приводите его к классу вашего контроллера представления сообщений (контроллер, имеющий свойство previousViewMessageId):

func () {
    let messagesNC = storyboard?.instantiateViewControllerWithIdentifier("messagesViewController") as! UINavigationController
    let messagesVC = messagesNC.viewControllers.first as! MessagesViewController

    messagesVC.previousViewMessageId = postList[indexPath.row].postKey

    presentViewController(messagesNC, animated: true, completion: nil)
}
0
Callam 7 Сен 2016 в 18:05

У вас есть просто представление контроллера представления ... Вы пропускаете контроллер навигации.

Что вам нужно сделать, так это представить новый контроллер представления внутри контроллера навигации. Как только вы это сделаете, он будет отображаться правильно. Вы также можете передать переменные после создания переменной vc.

Это представляет новый viewController (vc) в контроллере навигации ...

self.navigationController?.pushViewController(vc, animated: false)

Это устанавливает переменную в новом viewController (vc) (вы правы)

vc.previousViewMessageId = posts.postKey

Итак, полный:

func(){

    let vc = storyboard?.instantiateViewControllerWithIdentifier("messagesViewController") as! MessagesViewController
    let posts = self.postList[indexPath.row]

    //this is the var that i want to past
    vc.previousViewMessageId = posts.postKey

    navigationController?.pushViewController(vc, animated: false)
}

PS. Хотя это и не является частью вопроса, я чувствую, что все же должен упомянуть ... Использование слова self следует оставить только по необходимости. Другими словами, не используйте его, когда он не нужен. например self.postList[indexPath.row] :) https://github.com/raywenderlich/swift-style-guide#use -себе

0
Byron Coetsee 7 Сен 2016 в 18:11