美文网首页
通讯录的实现

通讯录的实现

作者: 金歌漫舞 | 来源:发表于2016-08-07 17:44 被阅读12次

    一.搭建界面

    二,登录界面

    - (void)setupUI {  
       // 为 textField 添加 监听事件  
        // 当我们需要监听textField文本改变的时候, 需要添加 监听事件: UIControlEventEditingChanged  
        [_userNameField addTarget:self  
                           action:@selector(valueChanged)  
                 forControlEvents:UIControlEventEditingChanged];  
          
          
        [_passwordField addTarget:self  
                           action:@selector(valueChanged)  
                 forControlEvents:UIControlEventEditingChanged];  
          
          
          
        // 读取用户偏好中存储的内容, 对 界面进行设置  
        BOOL isRecord = [NSUserDefaults getBoolWithType:SwitchTypeRecord];  
          
        if (isRecord) {  
            /** 
             1. 填充用户名和密码 
             2. 修改 记住密码的状态为on 
             3. 登录按钮为可用状态 
             */  
              
            // 取出用户名和密码  
            NSString *userName = [NSUserDefaults getObjectWithType:UserInfoTypeUserName];  
              
            NSString *userPassword = [NSUserDefaults getObjectWithType:UserInfoTypeUserPassword];  
              
            // 为输入框进行赋值  
            _userNameField.text = userName;  
              
            _passwordField.text= userPassword;  
              
            // 修改 记住密码  的 状态  
            [_recordSwitch setOn:YES animated:NO];  
              
              
            // 登录按钮为可用状态  
            _loginButton.enabled = YES;  
        }  
          
          
        // 对自动登录做判断  
        BOOL isAutoLogin = [NSUserDefaults getBoolWithType:SwitchTypeAutoLogin];  
          
        if (isAutoLogin) {  
              
            // 调用 登录按钮的监听方法  
            [self didClickLoginButton:nil];  
              
            // 修改 自动登录 按钮的状态  
            _autoSwitch.on = YES;  
        }  
          
          
    }  
    
    - (IBAction)didClickLoginButton:(id)sender {  
          
        // 让键盘消失  
        [self.view endEditing:YES];  
          
        [MBProgressHUD showLoadingWithMessage:@"正在请求..."];  
          
        // 对用户名和密码做判断  
        if ([_userNameField.text isEqualToString:@"a"] && [_passwordField.text isEqualToString:@"a"]) {  
              
              
            [self showNoticeAfterDelay:2 withBlock:^{  
                  
                // 在这里 对 用户名和密码完成 存储  
                  
                if (_recordSwitch.isOn) {  
                      
                    // 记住 用户名和密码  
                      
                    [NSUserDefaults saveUserName:_userNameField.text andPassword:_passwordField.text];  
                      
                      
                }  
          
                // 调用方法, 完成跳转  
                [self performSegueWithIdentifier:@"loginToList" sender:@"123"];  
      
            }];  
              
        } else {  
      
              
            [self showNoticeAfterDelay:2 withBlock:^{  
                // block的赋值  
                [MBProgressHUD showErrorMessage:@"用户名或者密码错误" afterDelay:2];  
            }];  
        }  
          
    }  
    

    三.添加联系人

    - (void)viewDidLoad {  
        [super viewDidLoad];  
      
       // 通过通知 监听 输入框的 文本输入  
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(valueChanged) name:UITextFieldTextDidChangeNotification object:nil];  
    }  
      
      
    #pragma mark  
    #pragma mark - 监听textField文本变化  
    - (void)valueChanged {  
          
        // 根据文本的输入情况, 来修改 保存按钮的状态  
        _saveButton.enabled = (_nameField.text.length != 0 && _numberField.text.length != 0);  
          
    }  
      
      
    #pragma mark  
    #pragma mark - 当界面显示之后  
    - (void)viewDidAppear:(BOOL)animated {  
        [super viewDidAppear:animated];  
          
        // 让 nameField 成为第一响应者  
        [_nameField becomeFirstResponder];  
    }  
      
      
      
    - (IBAction)didClickSaveButton:(id)sender {  
          
        // 回退键盘  
        [self.view endEditing:YES];  
          
        // 实例化一个模型对象  
        ContactModel *model = [ContactModel new];  
          
        model.name = _nameField.text;  
        model.number = _numberField.text;  
          
        // 通知代理  
        if ([self.delegate respondsToSelector:@selector(addViewController:withModel:)]) {  
            [self.delegate addViewController:self withModel:model];  
        }  
          
        // 进行跳转  
        [self.navigationController popViewControllerAnimated:YES];  
          
    }  
      
      
    #pragma mark  
    #pragma mark - 移除监听者  
    - (void)dealloc {  
          
        [[NSNotificationCenter defaultCenter] removeObserver:self];  
    }  
    
    #pragma mark  
    #pragma mark - 添加好友的代理方法  
    - (void)addViewController:(AddViewController *)addController withModel:(ContactModel *)model {  
          
        // 让model 显示到  cell中  
        // 1. 添加model到数组  
        [self.dataArray addObject:model];  
          
        // 2. 刷新数据  
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:self.dataArray.count - 1 inSection:0];  
          
          
        [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];  
          
    #warning 数据增加了, 需要进行归档  
        [NSKeyedArchiver archiveRootObject:self.dataArray toFile:kFilePath(@"user.data")];  
    }  
    

    四.修改页面

    #pragma mark  
    #pragma mark - 点击编辑  
    - (IBAction)didClickEditItem:(UIBarButtonItem *)sender {  
          
          
        if (_saveButton.enabled) {  
            // 设置 item 为 编辑  
            _editItem.title = @"编辑";  
              
    //        _saveButton.enabled = NO;  
    //          
    //        _nameField.enabled = NO;  
    //        _numberField.enabled = NO;  
              
            [self changeFieldStatus:NO];  
              
            // 如果 内容修改了, 然后点击取消item, 就应该把输入框的内容, 变成 原来的  
            _nameField.text = _model.name;  
            _numberField.text = _model.number;  
              
        } else {  
              
            _editItem.title = @"取消";  
              
    //        [_nameField becomeFirstResponder];  
              
    //        _saveButton.enabled = YES;  
    //          
    //        // 两个输入框要 可用  
    //        _nameField.enabled = YES;  
    //        _numberField.enabled = YES;  
              
            [self changeFieldStatus:YES];  
        }  
          
    }  
    
    #pragma mark  
    #pragma mark - 点击保存  
    - (IBAction)didClickSaveButton:(id)sender {  
         
        // 取得当前的修改之后的model  
        _model.name = _nameField.text;  
        _model.number = _numberField.text;  
          
        // 通知 ListController 进行数据的刷新  
        // 谁要传递消息, 谁就定义block  
        // 谁要传递消息, 谁就是调用方  
          
        // 先判断  _editBlock 是否被赋值, 如果有值就直接调用block  
          
    #warning 在这里 调用block  
        if (_editBlock) {  
            _editBlock();  
        }  
          
        // 跳转会 listController  
        [self.navigationController popViewControllerAnimated:YES];  
    }  
    
    #pragma mark  
    #pragma mark - 如果需要对目标控制器做些操作, 需要实现这个方法  
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {  
          
        NSString *identifier = segue.identifier;  
          
        if ([identifier isEqualToString:@"logToAdd"]) {  
              
            // 取出 目标控制器  
            AddViewController *addController = segue.destinationViewController;  
              
            // 设置当前控制器成为它的代理  
            addController.delegate = self;  
              
        } else if ([identifier isEqualToString:@"logToEdit"]) {  
            // 跳到编辑界面  
            EditViewController *editController = segue.destinationViewController;  
              
            editController.model = sender;  
              
    #warning 在这里为 block进行赋值  
              
            editController.editBlock = ^{  
            // 要执行的代码块  
                // 刷新数据  
                // 只要刷新, push进 editController 之前的 cell  
                // 获取选中cell的indexPath  
                NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];  
                  
                [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];  
                  
    #warning 数据被修改, 也需要进行归档  
                [NSKeyedArchiver archiveRootObject:self.dataArray toFile:kFilePath(@"user.data")];  
            };  
              
        }  
    }  
    

    相关文章

      网友评论

          本文标题:通讯录的实现

          本文链接:https://www.haomeiwen.com/subject/idulsttx.html