通讯录的实现

来源:互联网 发布:冉莹颖的实际身高知乎 编辑:程序博客网 时间:2024/06/15 09:45

一.搭建界面



二,登录界面

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



0 0