所以我对反应式 Swift/Cocoa 和 MVVM 的概念相当陌生。我想知道如果我在错误的地方初始化了 ViewModel。
模型
struct userInfo {
let name: String
let birthday: Date
init(name: String, birthday: Date) {
self.name = name
self.birthday = birthday
}
}
class User {
let user = MutableProperty([userInfo]())
}
视图模型
class UserViewModel {
let user: MutableProperty<userInfo>
init(_ user: userInfo) {
self.user = MutableProperty(user)
}
var nameTextSignal: SignalProducer<String, NoError> {
return user.producer.map { $0.name }
}
}
带有插座的 UserSlide 视图
class UserSlide: UIView, UITextViewDelegate {
@IBOutlet weak var userName: UITextField!
@IBOutlet weak var dateField: UITextField!
let picker = UIDatePicker()
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
createDatePicker()
}
引用 ViewModel 并将其绑定到 UserSlide 视图中的 UILabel 的视图控制器
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var pageControl: UIPageControl!
var userviewmodel: UserViewModel!
var slides:[Any] = []
override func viewDidLoad() {
super.viewDidLoad()
slides = createSlides()
setupSlideScrollView(slides: slides)
pageControl.numberOfPages = slides.count
pageControl.currentPage = 0
view.bringSubviewToFront(pageControl)
}
func createSlides() -> [Any] {
let slide1: UserSlide = Bundle.main.loadNibNamed("UserSlide", owner: self, options: nil)?.first as! UserSlide
//**Error is thrown
slide1.userName.reactive.text <~ userviewmodel.nameTextSignal
slide1.userName.keyboardAppearance = .dark
slide1.userName.delegate = self
let slide2:ZodiacSlide = Bundle.main.loadNibNamed("ZodiacSlide", owner: self, options: nil)?.first as! ZodiacSlide
我不断收到的错误是“在我在 createSlides() 函数的 ViewController 中引用的 UserViewModel 上,在隐式展开可选值时意外发现 nil”。
我基本上是在尝试创建一个具有两个视图的 PageController,其中一个具有我需要绑定的 UITextField 以便每当用户更改值并滑动到第二个视图时,第二个视图上显示的数据最多日期。
我试过了:
1) 将 ViewModel 设置为 optional(?) 但不幸的是,它必须被解包。
2) 在 UserSlide 视图中初始化 ViewModel 而不是 ViewController。ViewModel 仍然为零。
3) 在 ViewController 中初始化 UILabel 并以这种方式绑定 ViewModel。同样的结果,ViewModel 为 nil。
任何建议将不胜感激!:)