所以我对 Reactive 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]())
}
View 模型
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 View
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 并将其绑定(bind)到 UserSlide View 中的 UILabel 的 View Controller
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,同时隐式展开可选值”。
我基本上是在尝试创建一个具有两个 View 的 PageController,其中一个具有我需要绑定(bind)的 UITextField,以便每当用户更改值并滑动到第二个 View 时,第二个 View 上显示的数据已是最新。
我试过:
1) 将 ViewModel 设置为可选(?),但不幸的是,它必须展开。
2) 在 UserSlide View 而不是 ViewController 中初始化 ViewModel。 ViewModel 仍然为零。
3) 在 ViewController 中初始化一个 UILabel 并以此方式绑定(bind) ViewModel。同样的结果,ViewModel 为 nil。
如有任何建议,我们将不胜感激! :)
最佳答案
您的代码没有显示的是您设置 ViewController
的 userviewmodel
的位置
如果您从外部注入(inject)它,例如父级或呈现 ViewController,您必须确保在之前 viewDidLoad
设置它,因为那是您访问它的地方。
另一种方法是在设置 viewModel 时调用的单独方法中创建绑定(bind)。
就我个人而言,我喜欢ViewModelOwners如所述here
关于swift - react 性 Cocoa MVVM 初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56997552/