1

所以我对反应式 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。

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

4

1 回答 1

0

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

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

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

就个人而言,我喜欢这里描述的ViewModelOwners

于 2019-07-15T16:08:15.897 回答