iOS MVVM结合RAC实现一个简单的登录功能

针对MVC和MVVM这两种构建模式,网上随便一百度就是一大堆针对这两种构建模式的解说,总结起来无非以下两点:
  • MVC(Model View Controller)是一种成熟的,苹果推荐的一个用来组织代码的权威范式,日常用的最多的一种构建模式,缺点就是viewController里面代码量厚重,耦合性强;
  • MVVM(Model View View-Mode)是MVC衍生出来一种维护性较强、耦合性低的新的架构,它正式规范了视图和控制器紧耦合的性质,并引入新的组件,分离了视图(View)和模型(Model), 用户输入验证逻辑,视图显示逻辑,发起网络请求等代码的都放在viewModel中处理,从而大大的减少了viewController的代码量。
如果想深入了解他们的区别,就请移步自行Google吧,这里就不赘述了。对于这些东西,只有自己写过了,才能慢慢的从中体会到他们的差别,至于哪个好哪个适合自己,就只能自己从中取舍了。

下面讲述的是一个结合了三方ReactiveObjC,采用MVVM的构建模式结合RAC写了一个登录的小功能,从demo中,能够很清楚的看到,viewController中的代码量大大的减少了,至少达到了V瘦身的效果��。

首先要pod ReactiveObjC到项目当中

先来看view,里面处理简单的页面布局和一些判断

DCLoginView.h

@property (strong, nonatomic)UITextField *usernameTextField;//用户名
@property (strong, nonatomic)UITextField *passwordTxtField;、、密码

@property (strong, nonatomic)UIButton *signInButton;//登陆按钮
@property (strong, nonatomic)UIButton *signUpButton;//注册按钮

@property(nonatomic,assign)BOOL isValidate;//判断用户名和密码是否为空

DCLoginView.m

-(instancetype)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        [self setUpLoginView];
    }
    return self;
}
-(void)setUpLoginView
{
    //用户名
    _usernameTextField = [[UITextField alloc]init];
    _usernameTextField.placeholder = @"用户名";
    _usernameTextField.textColor = [UIColor blackColor];
    _usernameTextField.font = [UIFont systemFontOfSize:15];
    _usernameTextField.backgroundColor = [UIColor lightGrayColor];
    _usernameTextField.layer.borderColor = [UIColor lightGrayColor]
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的WPF MVVM登录DEMO的代码示例: XAML代码: ``` <Window x:Class="LoginDemo.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Login Demo" Height="250" Width="400"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <Label Grid.Row="0" Grid.Column="0" Content="Username:" Margin="10"/> <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding Username}" Margin="10"/> <Label Grid.Row="1" Grid.Column="0" Content="Password:" Margin="10"/> <PasswordBox Grid.Row="1" Grid.Column="1" Password="{Binding Password}" Margin="10"/> <Button Grid.Row="2" Grid.Column="1" Content="Login" Command="{Binding LoginCommand}" Margin="10"/> <TextBlock Grid.Row="3" Grid.Column="1" Text="{Binding ErrorMessage}" Foreground="Red" Margin="10"/> <CheckBox Grid.Row="4" Grid.Column="1" Content="Remember me" IsChecked="{Binding RememberMe}" Margin="10"/> </Grid> </Window> ``` ViewModel代码: ``` using System; using System.ComponentModel; using System.Windows; using System.Windows.Input; namespace LoginDemo { public class LoginViewModel : INotifyPropertyChanged { private string _username; private string _password; private bool _rememberMe; private string _errorMessage; public string Username { get { return _username; } set { _username = value; OnPropertyChanged("Username"); } } public string Password { get { return _password; } set { _password = value; OnPropertyChanged("Password"); } } public bool RememberMe { get { return _rememberMe; } set { _rememberMe = value; OnPropertyChanged("RememberMe"); } } public string ErrorMessage { get { return _errorMessage; } set { _errorMessage = value; OnPropertyChanged("ErrorMessage"); } } public ICommand LoginCommand { get; set; } public LoginViewModel() { LoginCommand = new RelayCommand(Login); } private void Login(object parameter) { if (string.IsNullOrEmpty(Username) || string.IsNullOrEmpty(Password)) { ErrorMessage = "Please enter both username and password."; } else if (Username == "admin" && Password == "password") { ErrorMessage = ""; MessageBox.Show("Login successful!"); } else { ErrorMessage = "Invalid username or password."; } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } } ``` 其中,RelayCommand是一个自定义的ICommand实现,用于绑定按钮的Command属性,代码如下: ``` using System; using System.Windows.Input; namespace LoginDemo { public class RelayCommand : ICommand { private readonly Action<object> _execute; private readonly Predicate<object> _canExecute; public RelayCommand(Action<object> execute, Predicate<object> canExecute = null) { _execute = execute ?? throw new ArgumentNullException(nameof(execute)); _canExecute = canExecute; } public bool CanExecute(object parameter) { return _canExecute?.Invoke(parameter) ?? true; } public void Execute(object parameter) { _execute(parameter); } public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } remove { CommandManager.RequerySuggested -= value; } } } } ``` 在MainWindow的构造函数中,将ViewModel与View绑定: ``` public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataContext = new LoginViewModel(); } } ``` 这样,就完成了一个简单的WPF MVVM登录DEMO。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值