【问题标题】:Reactive Cocoa MVVM Initialization反应式 Cocoa MVVM 初始化
【发布时间】:2019-07-11 21:32:23
【问题描述】:

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

带有插座的用户幻灯片视图

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 视图而不是 ViewController 中初始化 ViewModel。 ViewModel 仍然是 nil。

3) 在 ViewController 中初始化 UILabel 并以这种方式绑定 ViewModel。同样的结果,ViewModel 为 nil。

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

【问题讨论】:

    标签: swift reactive-cocoa reactive reactive-swift


    【解决方案1】:

    您的代码未显示的是您设置userviewmodelViewController 的位置

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

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

    就个人而言,我喜欢ViewModelOwners,正如here所描述的那样

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-25
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多