gpt4 book ai didi

swift - react 性 Cocoa MVVM 初始化

转载 作者:行者123 更新时间:2023-11-28 07:24:24 24 4
gpt4 key购买 nike

所以我对 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com