Реактивная инициализация какао MVVM - PullRequest
1 голос
/ 12 июля 2019

Так что я довольно новичок в понятиях 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 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()

}

View Controller, который ссылается на ViewModel и привязывает его кUILabel из представления UserSlide

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    

Ошибка, которую я продолжаю получать: «Неожиданно найден ноль при неявном развертывании необязательного значения» в ссылке UserViewModel I в ViewController в функции createSlides ().

Я в основном пытаюсь создать PageController с двумя представлениями, и у одного из них есть UITextField, который мне нужно связать так, чтобы всякий раз, когда пользователь изменяет значение и перемещается ко второму представлению, данные, отображаемые во втором представлении, работаютна свидание.

Я пробовал:

1) Установка ViewModel на необязательный (?), Но, к сожалению, его необходимо развернуть.

2) Инициализация ViewModel в UserSlideПосмотреть вместо ViewController.ViewModel по-прежнему равен nil.

3) Инициализация UILabel в ViewController и привязка ViewModel таким образом.Тот же результат, ViewModel ноль.

Любые предложения будет принята с благодарностью!:)

1 Ответ

0 голосов
/ 15 июля 2019

То, что ваш код не показывает, это то, где вы устанавливаете userviewmodel вашего ViewController

Если вы вводите его извне, например, родитель или представляющий ViewController, вы должны будете сделатьобязательно установите до viewDidLoad, так как это место, где вы к нему обращаетесь.

Другой подход заключается в создании привязок в отдельном методе, который вызывается при установке viewModel.

Лично мне нравится ViewModelOwners , как описано здесь

...