美文网首页
11-UI进阶(私人通讯录和数据存储)

11-UI进阶(私人通讯录和数据存储)

作者: 木喳喳的夏天 | 来源:发表于2016-03-19 18:20 被阅读85次

    设置导航条的内容

    • 一个导航控制器只有一个导航条
    • 导航栏的内容由栈顶控制器的navigationItem属性决定
    • iOS7之后默认会把导航条上面的按钮渲染成蓝色
        // 在iOS7之后默认会把导航条上面的按钮渲染成蓝色
        UIImage *image = [UIImage imageNamed:@"navigationbar_friendsearch"];
        
        // 通过代码告诉苹果不要渲染图片
        image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    
    • 以后只要看到Item,一般都是苹果提供的模型

    • UINavigationItem:控制导航条的内容

    • UIBarButtonItem:控制导航条上面按钮的内容

    • 自定义导航条按钮的步骤

        // 创建自定义的UIButton对象
        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
    
        // 设置UIButton在Normal和Highlighted状态下的图片
        [btn setImage:[UIImage imageNamed:@"navigationbar_friendsearch"] forState:UIControlStateNormal];
        [btn setImage:[UIImage imageNamed:@"navigationbar_friendsearch_highlighted"] forState:UIControlStateHighlighted];
    
        // 导航条上面的内容位置不能由开发者决定,开发者只能控制尺寸
        // btn.frame = CGRectMake(2000, 3000, 30, 30);
        
        // 控件的尺寸由图片决定
        // 仅仅是设置尺寸
        [btn sizeToFit];
        
        self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:btn];
    

    控制器view的生命周期

    • 在非ARC中,有两个控制生命周期的方法(已过时)
    • viewWillUnload // view即将销毁的时候调用
    • viewDidUnload // view完全销毁的时候调用,在此方法中一般都是管理内存和清空界面数据的代码
    • 在ARC中,一个控制器view的完整生命周期如下
        // 控制器的view加载完成的时候调用
        - (void)viewDidLoad
      
        // 控制器的view即将显示的时候调用
        - (void)viewWillAppear:(BOOL)animated
      
        - (void)viewWillLayoutSubviews
    
        - (void)viewDidLayoutSubviews
    
        - (void)viewDidAppear:(BOOL)animated
    
        - (void)viewWillDisappear:(BOOL)animated
    
        - (void)viewDidDisappear:(BOOL)animated
    
    • 通过storyboard修改导航控制器的标题和返回按钮文字

    通讯录的登录界面和功能

    • 四个约束决定控件的位置,label比较特殊,不需要考虑label的尺寸,只需要两个约束即可决定其位置
    • 监听文本框的改变
        // 给文本框添加监听器,及时监听文本框内容的改变
        [_accountField addTarget:self action:@selector(textChange) forControlEvents:UIControlEventEditingChanged];
        [_pwdField addTarget:self action:@selector(textChange) forControlEvents:UIControlEventEditingChanged];
    

    来源控制器给目的控制器进行数据传值(顺传)

    • 接收方一定要有属性接收
    • 传递方必须要拿到接收方本身

    通过segue获取来源控制器和目的控制器的底层实现

    1. [self performSegueWithIdentifier]
    2. 创建segue
    3. 设置来源控制器,segue.sourceViewController = self
    4. 创建目的控制器,segue.destinationViewController = 目的控制器
    5. [self prepareForSegue]跳转之前的准备操作
        // 在执行跳转之前的时候调用
        - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
        {    
            UIViewController *vc = segue.destinationViewController;
            vc.title = [NSString stringWithFormat:@"%@的联系人列表", _accountField.text];
            NSLog(@"%@--%@",segue.sourceViewController,segue.destinationViewController);
        }
    
    1. [segue perform]
        // 跳转到联系人界面
        [self performSegueWithIdentifier:@"login2Contact" sender:nil];
    
    1. 判断segue的类型,如果是push,拿到导航控制器进行push
        [self.navigationController pushViewController:segue.destinationViewController animated:YES];
    

    第三方框架的使用(HUD指示器)

    • 显示HUD
        // 提示用户,正在登录ing...
        [MBProgressHUD showMessage:@"正在登录ing..."];
    
        // 提示用户账号或者密码错误
        [MBProgressHUD showError:@"账号或者密码错误"];
    
    • 隐藏HUD
        // 隐藏蒙版
        [MBProgressHUD hideHUD];
    

    延迟执行的方法

        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            // TODO:延迟执行的任务
        }
    

    联系人数据的懒加载

    - (NSMutableArray *)contacts
    {
        if (_contacts == nil) {
            
            _contacts = [NSMutableArray array];
            
        }
        return _contacts;
    }
    

    进入添加联系人界面后自动弹出键盘的方法

    - (void)viewDidAppear:(BOOL)animated
    {
        [super viewDidAppear:animated];
        // 主动弹出姓名文本框
        [_nameField becomeFirstResponder];
    }
    

    目的控制器给来源控制器进行数据传值(逆传)

    • 通过代理进行数据模型的传递
    - (IBAction)add:(id)sender {
        // 0.把文本框的值包装成联系人模型
        XMGContact *c = [XMGContact contactWithName:_nameField.text phone:_phoneField.text];
        
        // 1.通知代理做事情
        // _delegate = _contactVc
        if ([_delegate respondsToSelector:@selector(addViewController:didClickAddBtnWithContact:)]) {
            [_delegate addViewController:self didClickAddBtnWithContact:c];
        }
        
        // 2.回到联系人控制器
        [self.navigationController popViewControllerAnimated:YES];
        
    }
    
    • 联系人界面在跳转之前将添加控制器传递给联系人控制器属性
    // 跳转之前的时候调用
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        // 给添加控制器传递联系人控制器属性
        XMGAddViewController *addVc = segue.destinationViewController;
        
        addVc.delegate = self;
    }
    
    • 联系人界面的控制器实现代理方法
    - (void)addViewController:(XMGAddViewController *)addVc didClickAddBtnWithContact:(XMGContact *)contact
    {
        // 把添加界面的联系人模型传递到联系人界面
        
        // 把联系人模型保存到数组
        [self.contacts addObject:contact];
        
        // 刷新表格
        [self.tableView reloadData];
        
    }
    

    注销功能的提示对话框(UIActionSheet)

    // 点击注销的时候调用
    - (IBAction)logout:(id)sender {
    
        // 弹出actionSheet
        UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"是否注销?" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:@"注销" otherButtonTitles:nil, nil];
        
        [sheet showInView:self.view];
    
    }
    

    在tableView有数据的时候才需要分割线

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        // 取消分割线
        // self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
        
        // tableView有数据的时候才需要分割线
        
        // 开发小技巧:快速取消分割线
        self.tableView.tableFooterView = [[UIView alloc] init];
        
    }
    

    通过代码创建tableView的cell

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        
        // 创建标示符
        static NSString *ID = @"cell";
        
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
        
        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:ID];
        }
        
        // 获取模型
        XMGContact *c = self.contacts[indexPath.row];
        
        cell.textLabel.text = c.name;
        cell.detailTextLabel.text = c.phone;
        
        return cell;
    }
    

    相关文章

      网友评论

          本文标题:11-UI进阶(私人通讯录和数据存储)

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