swift - react 性 Cocoa MVVM 初始化

标签 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]())
}

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。

如有任何建议,我们将不胜感激! :)

最佳答案

您的代码没有显示的是您设置 ViewControlleruserviewmodel 的位置

如果您从外部注入(inject)它,例如父级或呈现 ViewController,您必须确保在之前 viewDidLoad 设置它,因为那是您访问它的地方。

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

就我个人而言,我喜欢ViewModelOwners如所述here

关于swift - react 性 Cocoa MVVM 初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56997552/

相关文章:

ios - 如何使用 ReactiveCocoa 处理无效 token

objective-c - Reactive Cocoa 中 RACAble()、RACObserve() 和 RACBind() 的区别

swift - 如何在 Swift 中调用函数?

swift - 尝试获取存储引用的下载 URL 以填充标签

json - 如何在便利初始化程序中检查 Swift 中的 JSON nil

java - Spring boot MongoDB Change Streams 不起作用

java - Spring Reactive WebFlux 使用 application/stream+json 时报告空通量

ios - 更改 TableViewCell 内部 UIPageControl 的 CurrentPage 时出现问题

ios - swift 的reactivecocoa 是双向数据绑定(bind)吗

android - DiffUtil 和 registerAdapterDataObserver