Tag: mvvm

RXSwift绑定返回意外地发现零,而解包一个可选的值

我是MVVM和RxSwift的初学者,我想在我的下一个项目中实现它。 目前,我正在处理我的login模块,一切都看起来不错,但每次运行我的应用程序时,它会触发一个错误时绑定文本字段到我的ViewModel说“意外地发现零,而解包可选值”。 有人能帮我摆脱它吗? 以下是我如何做到的: class LoginViewController: UIViewController { @IBOutlet weak var emailTextField: UITextField! @IBOutlet weak var passwordTextField: UITextField! @IBOutlet weak var loginButton: UIButton! private var loginViewModel: UserLoginViewModel! private let disposeBag = DisposeBag() override func viewDidLoad() { super.viewDidLoad() emailTextField.rx.text.orEmpty .bind(to: loginViewModel.emailAdd) .disposed(by: disposeBag) <—- Displays "Unexpectedly found nil while unwrapping an Optional value" passwordTextField.rx.text.orEmpty .bind(to: loginViewModel.password) […]

具有业务和数据层的Swift MVVM示例

我遇到的大部分Swift MVVM示例都使用dependency injection将Model注入ViewModel,然后将ViewModel注入到ViewController中。 这个注入通常build议在AppDelegate中作为一个单例来处理。 这简单的例子都很好。 然而,在现实世界中,“模型”实际上不仅仅是一个DTO对象,它假定返回模型/ DTO的业务和数据层。 因此,将模型注入AppDelegate级别的ViewModel是不现实的,因为View / ViewController将触发实际的数据刷新。 所以模型注射需要在别处发生。 此外,大多数示例直接从ViewModel到DataAccess,这会导致ViewModel获取大量的业务逻辑,理想情况下它应该保持视图的状态。 有人可以转发一个全面的端到端的Swift MVVM示例与离散分离的业务和数据层。 为了保持这个问题不是基于意见,而是问题/答案的格式,这个例子应该有: 独立的业务逻辑层 独立的数据访问逻辑层 单独的模型/ DTO(仅状态对象) 这个例子还应该清楚地说明: dependency injection发生的地方 在上面定义的层之间有明确的调用层次结构

带有ReactiveCocoa的MVVM:限制视图模型中的UITextField的文本长度

我正在采用MVVM与ReactiveCocoa。 现在我有一个UITextField,我需要限制它的最大文本长度为100。 在我看来: – (void)bindViewModel { RAC(self.viewModel, text) = self.textField.rac_textSignal; [RACObserve(self.viewModel, text) subscribeNext:(NSString *text) { self.textField.text = text; }]; } 在我看来的模型 – (id)init { [RACObserve(self, text) subscribeNext:^(NSString *x) { //block 1 if (x.length > maxTextLength) { x = [x substringToIndex:maxTextLength]; } }]; } 但是这不行, block 1从来不叫。 通过使用MVVM,我相信文本长度控制逻辑应该放在我的视图模型中,但是实现这一点的正确方法是什么?

在closures类和结构的Swift可变结构行为有所不同

我有一个类(A)有一个结构variables(S)。 在这个类的一个函数中,我调用了structvariables的变异函数,这个函数需要一个闭包。 这个闭包的主体检查结构variables的名称属性。 Struct的变异函数依次调用某个类(B)的函数。 这个类的函数再次closures。 在这个闭包的主体中改变结构,即改变name属性,并调用第一个类提供的闭包。 当第一个类(A)闭包被调用时,我们正在检查结构的名称属性,它永远不会改变。 但是在步骤2中,如果我使用结构(C)而不是类B,则会发现类A的闭包结构实际上已更改。 以下是代码: class NetworkingClass { func fetchDataOverNetwork(completion:()->()) { // Fetch Data from netwrok and finally call the closure completion() } } struct NetworkingStruct { func fetchDataOverNetwork(completion:()->()) { // Fetch Data from netwrok and finally call the closure completion() } } struct ViewModelStruct { /// Initial value var data: […]

如何使用ReactiveCocoa 3实现基本的UITextFieldinput+ UIButton操作场景?

我是一个Swift和ReactiveCocoa noob在同一时间。 使用MVVM和Reactive Cocoa v3.0-beta.4框架,我想实现这个设置,学习新的RAC 3框架的基础知识。 我有一个文本字段,我希望文本input包含超过3个字母,用于validation。 如果文本通过validation,则应该启用下面的button。 当button收到触发事件时,我想使用视图模型的属性触发一个动作。 由于目前关于RAC 3.0 beta的资源非常less,我通过阅读框架的Github回购库上的QA来实现以下function。 以下是我可以提出的到目前为止: ViewModel.swift class ViewModel { var text = MutableProperty<String>("") let action: Action<String, Bool, NoError> let validatedTextProducer: SignalProducer<AnyObject?, NoError> init() { let validation: Signal<String, NoError> -> Signal<AnyObject?, NoError> = map ({ string in return (count(string) > 3) as AnyObject? }) validatedTextProducer = text.producer.lift(validation) //Dummy […]

iOS中使用MVVM

我是一个iOS开发人员,我在我的项目中拥有大量视图控制器,所以我一直在寻找一种更好的方式来构build我的项目,并遇到了MVVM(Model-View-ViewModel)架构。 我已经阅读了很多与iOS的MVVM,我有几个问题。 我会用一个例子来解释我的问题。 我有一个名为LoginViewController的视图控制器。 LoginViewController.swift import UIKit class LoginViewController: UIViewController { @IBOutlet private var usernameTextField: UITextField! @IBOutlet private var passwordTextField: UITextField! private let loginViewModel = LoginViewModel() override func viewDidLoad() { super.viewDidLoad() } @IBAction func loginButtonPressed(sender: UIButton) { loginViewModel.login() } } 它没有Model类。 但是我创build了一个名为LoginViewModel的视图模型来放置validation逻辑和networking调用。 LoginViewModel.swift import Foundation class LoginViewModel { var username: String? var password: String? init(username: […]