因此,我对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]())
}
ViewModel
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 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,而隐式展开了一个可选值”。
我基本上是在尝试创建具有两个视图的PageController,其中一个具有我需要绑定的UITextField,以便每当用户更改值并将其滑动到第二个视图时,第二个视图上显示的数据已是最新。
我尝试过:
1)将ViewModel设置为optional(?),但不幸的是,必须将其打开。
2)在UserSlide视图(而不是ViewController)中初始化ViewModel。 ViewModel仍然为零。
3)在ViewController中初始化UILabel并以这种方式绑定ViewModel。结果相同,ViewModel为nil。
任何建议将不胜感激! :)
答案 0 :(得分:0)
代码未显示的是您在userviewmodel
中设置ViewController
的位置
如果要从外部注射,例如父级或当前的ViewController,您必须确保在之前 viewDidLoad
之前进行设置,因为那是您访问它的地方。
另一种方法是在设置viewModel时调用的单独方法中创建绑定。
我个人喜欢ViewModelOwners,here