通讯录的实现

一.搭建界面

二,登录界面

- (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")];  
        };  
          
    }  
}  

你可能感兴趣的:(通讯录的实现)