Как лучше всего передать 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)
}
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
И представьте экземпляр!
Чтобы передать значение корневому контроллеру представления контроллера навигации, вы получаете доступ к 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)
}
У вас есть просто представление контроллера представления ... Вы пропускаете контроллер навигации.
Что вам нужно сделать, так это представить новый контроллер представления внутри контроллера навигации. Как только вы это сделаете, он будет отображаться правильно. Вы также можете передать переменные после создания переменной 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 -себе
Похожие вопросы
Новые вопросы
swift
Swift — это язык программирования общего назначения, разработанный Apple Inc., впервые выпущенный в 2014 году для своих платформ и Linux. Swift имеет открытый исходный код. Используйте тег только для вопросов о языковых функциях или необходимости кода в Swift. Используйте теги [ios], [ipados], [macos], [watch-os], [tvos], [swiftui], [cocoa-touch] и [cocoa] для (не зависящих от языка) вопросов о платформах или рамки.