我正在尝试设置主细节导航。 我使用storyboard,master是动态表,details是静态表。 我有一个名称标签设置为控制器中的插座但是当我尝试在viewDidLoad中访问它时,它仍然设置为nil。
我没有使用prepareForSegue,而是使用了didSelectRowAtIndexPath来推送详细信息视图:(因为我使用TableViewBindingHelper,请参阅https://github.com/ColinEberhardt/ReactiveTwitterSearch/tree/master/ReactiveTwitterSearch/Util)
func showLessonView(lessonVM: LessonViewModel) {
let lessonViewController = LessonViewController(WithViewModel: lessonVM)
self.navigationController?.pushViewController(lessonViewController, animated: true)
}
LessonViewController:
import Foundation
import ReactiveCocoa
class LessonViewController: UITableViewController {
@IBOutlet var lessonNameLabel: UILabel!
private var viewModel: LessonViewModel
init(WithViewModel viewModel: LessonViewModel){
self.viewModel = viewModel
super.init(nibName: nil, bundle: nil)
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
bindData()
}
func bindData() {
// null here!
if (lessonNameLabel != nil) {
lessonNameLabel.rac_text <~ viewModel.name
}
}
}
我该如何解决这个问题?
我见过的其他示例代码在segue中执行导航,最终调用init(编码器aDecoder:NSCoder)构造函数,并且所有出口都已初始化。
答案 0 :(得分:1)
因为您使用WithViewModel
初始化程序初始化视图控制器,所以它对故事板一无所知,因此不会连接出口。要使故事板中指定的出口连接起来,您需要使用segue,或使用故事板的instantiateViewControllerWithIdentifier(identifier:)
方法来创建视图控制器。无论哪种方式,您都不能(轻松)将ViewModel作为初始化的参数传递,因此您需要公开viewModel var(删除private
)并在showLessonView
方法中单独设置它。要使用instantiateViewControllerWithIdentifier(identifier:)
,请在故事板中为您的Lesson View Controller
提供一个标识符(例如“LessonViewController”)。然后修改您的showLessonView
,如下所示:
func showLessonView(lessonVM: LessonViewModel) {
let lessonViewController = self.storyboard!.instantiateViewControllerWithIdentifier(identifier:"LessonViewController") as! LessonViewController
lessonViewController.viewModel = lessonVM
self.navigationController?.pushViewController(lessonViewController, animated: true)
}
当从故事板实例化视图控制器时,会使用init(coder:)
初始化程序,因此要么删除该方法的覆盖,要么修改它以调用超级实现:
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}