美文网首页
关于UI通讯录

关于UI通讯录

作者: 隔壁家的老田 | 来源:发表于2016-06-13 22:03 被阅读0次

    做了好几天的通讯录,微微有些心得,在这里希望能跟大家 分享一下,同时也加深自己的记忆。入过很多坑,所以经验应该对新手有所帮助。

    首先我卡住的地方就是数据解析,一般数据都是字典套数组,数组里再套字典,这应该是最基础的数据解析了。但由于是新手所以还是绕了很久。

    先说下思路,想要获取字典所有的联系人,首先必须要通过Key值(也就是联系人分组名)获得所有联系人的分组,然后再遍历这些分组,最后才能过去所有联系人。

    //通过遍历的Key值获取每个联系人分组里所有的联系人并存入数组

    //数据解析

    - (void)analyData

    {

    NSString *path = [[NSBundle mainBundle]pathForResource:@"Contact" ofType:@"plist"];

    self.ContactDic = [NSMutableDictionary dictionaryWithContentsOfFile:path];

    self.keyArr = [NSMutableArray array];

    self.keyArr = [[_ContactDic.allKeys sortedArrayUsingSelector:@selector(compare:)]mutableCopy];

    self.modelArr = [NSMutableArray array];

    for (NSString *key in _ContactDic) {

    NSArray *array = _ContactDic[key];

    for (NSDictionary *dic in array) {

    Contact *model = [[Contact alloc]init];

    [model setValuesForKeysWithDictionary:dic];

    [_modelArr addObject:model];

    }

    }

    然后第二个注意点就是利用model传值,我们都知道,从前往后传值一般使用属性,从后往前传值一般使用block或者代理,而model则可以用作传值的参数,但是赋值的时候需要特别注意,model存值得方式类似与字典,取值赋值都需要key和value来进行。赋值方法如下:

    //通过属性赋值,将信息传到显示信息的界面

    - (void)getMessage

    {

    self.NameLabel.text = [_contact valueForKey:@"name"];

    self.SexLabel.text = [_contact valueForKey:@"sex"];

    self.PhoneNumLabel.text = [_contact valueForKey:@"phoneNumber"];

    self.IntroduceLabel.text = [_contact valueForKey:@"introduce"];

    self.imageV.image = [UIImage imageNamed:[_contact valueForKey:@"photoName"]];

    }//这里通过setValueForKey的方法来实现赋值。

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    {

    //这里的_keyArr是我用来存储所有分组名的可变数组

    //去model得

    NSString *key = _keyArr[indexPath.section];

    NSArray *array = _ContactDic[key];

    Contact *model = array[indexPath.row];

    TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell" forIndexPath:indexPath];

    if (!cell) {

    cell = [[TableViewCell alloc]initWithStyle:(UITableViewCellStyleValue2) reuseIdentifier:@"CustomCell"];

    }

    cell.model = model;

    return cell;

    }

    这里的话一定要注意model的类型,不然创建出来的Cell是无法赋上值的.

    //如果想要自定义cell的高度可以使用该方法

    + (CGFloat)getHeightWidthLab4:(NSString *)text

    {

    CGSize baseSize = CGSizeMake(KScreenW - 20, CGFLOAT_MAX);

    NSDictionary *attrDic = @{NSFontAttributeName : [UIFont systemFontOfSize:17]};

    CGRect rectToFit = [text boundingRectWithSize:baseSize options:(NSStringDrawingUsesLineFragmentOrigin) attributes:attrDic context:nil];

    return rectToFit.size.height;

    }

    只需要在给Cell布局时将Cell的高度定义成这个返回值即可,然后在- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

    这个方法中将返回值调用,就可以根据Label的高度来确定Cell的高度了

    感觉这个方法不是太过重要,因为i之后StoryBoard中只需要写两个属性:self.tableView.rowHeight = UITableViewAutomaticDimension;

    self.tableView.estimatedRowHeight = 10;

    就可以实现自定义Cell了。

    这只是通讯录的一小部分,新人会经常犯的错误,老司机就不用看了,太过于浅薄。

    相关文章

      网友评论

          本文标题:关于UI通讯录

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