反应性可可MVVM初始化

时间:2019-07-11 21:32:23

标签: swift reactive-cocoa reactive reactive-swift

因此,我对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。

任何建议将不胜感激! :)

1 个答案:

答案 0 :(得分:0)

代码未显示的是您在userviewmodel中设置ViewController的位置

如果要从外部注射,例如父级或当前的ViewController,您必须确保在之前 viewDidLoad之前进行设置,因为那是您访问它的地方。

另一种方法是在设置viewModel时调用的单独方法中创建绑定。

我个人喜欢ViewModelOwnershere