微专业GeekBand-IOS应用开发实战笔记-第三周

导读:

这一章主要整理了UITableView的一些重点知识,主要关于DataSource和Delegate的作用和使用方法。最主要的内容还是我自己在试图重制一个原版通讯录的过程中遇到的问题和解决办法。

1. UITableView

Table,顾名思义,是桌子【明明是表格的意思啊喂!】,那么TableView呢,也就是桌子试图,【明明是表格式图啊喂!】这个桌子本身呢是没有生命的,所以说,它只能被动的把你摆子桌子上的东西给托起来,而不能主动地去捡起东西摆在桌子上【这和表格的属性是一样的呢】所以,我们就需要DataSource和Delegate啦。

重点1:DataSource

DataSource的用途是为表格提供数据,使用方法是先在ViewController的头文件(.h文件)里加入UITableViewDataSource,如下

@interface ViewController : UIViewController 

这代表这个ViewController就可以使用以下的函数来为表格添加数据,不要忘记把DataSource连线过去哦


微专业GeekBand-IOS应用开发实战笔记-第三周_第1张图片
@Required
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; //这个是必须的哦,也就是在区域里有几行呢?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; //这个也是必须的哦,问的是具体的Cell

@Optional
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView; //表格的分栏有几个?初始是1.

... //后面还有很多,都可以通过commend点击UITableViewDataSource来查看官方API文档哦

那么这里的重点是Cell、行数以及分栏的返回。一般分栏放在第一位,因为后面的行数会需要引用到它。

在返回Cell时所可以使用的indexPath是我想要讲一讲的,它里面包含了两个很重要的只读变量section和row,分别代表区块和行数。通过if语句的判断,我们可以制作出多种样式的Cell然后提供给不同的区块或是行数。

以下是我所制作的范例截图


微专业GeekBand-IOS应用开发实战笔记-第三周_第2张图片
左边为代码,右边是实际样式

可以看到我使用的是官方的模板,Subtitle的CellStyle,但是通过自定义的字体大小和颜色,变得好看很多。

以上是我要详细讲的内容了,不过Cell的定制还有很多方法,比如自己制作xib文件等,我就不一一赘述了。

重点2:Delegate

Delegate的用法和一般ViewController的Delegate很相似,不过在UITableViewDelegate的Protocol中有着不少Table独有的函数,用来响应各种用户的行为。

2. 我在仿造通讯录的过程中遇到的问题:

在制作通讯录的过程中我与到了不少的问题,其中最大的是关于数据整理的问题。我遇到的第一个问题是数组排序:

数组排序:

因为我使用的是一个自定义的类,然后数组中放的全部都是我自定义的类的实例,所以Sorting变得有些复杂。
首先需要建立一个检索机制,这个机制里面包含了一个Key,这个Key是一个selector,通过这样写之后,数组在排序时会自动找到每一个我自定义的类里面的name属性,然后再通过name属性加以排序。

NSSortDescriptor *sortDescriptor;
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
[PersonArray sortUsingDescriptors:sortDescriptors];

然后当我解决了这个问题之后,我又遇到了另一个问题:数组划分问题。

数组划分问题:

这个问题的起因是为了要将数组,也就是人的名字,按照字母表的顺序分割开来,以此来决定有多少个section以及每一个section里面有多少个row。以下是代码:

int i = 0;
        for (PersonDetails* person in _personsArray) {
            NSString* ch = [person.name substringToIndex:1];
            
            if (![_headerList containsObject:ch]) {
                [_headerList addObject:ch];
                [_headerListStart addObject:@(i)];
            }
            else {
            }
            i++;
        }
        
        _listItemCount = i;

这里面有三个变量,_headerList,_headerListStart,_listItemCount。它们分别是两个数组和一个数字。
这里面的重点首先是substringToIndex:1,它截取了person的名字属性,name的首字母。通过if语句比较,如果它没有出现过,那么就把这个字母本身存储在_headerList里面,然后把它出现的位置,记录在_headerListStart,然后最终的总共数量也记录了下来(其实这个并没有必要,因为可以随时通过[原数组 count]来获取。)
听起来很简单,但是当时为了找到这几个代码还是花费了我不少心思,而且当时我还反了一个错误,就是_headerList_headerListStart并没有初始化,于是一直都只是nil。所以一定要记得加上初始化哦:

_headerList = [NSMutableArray array];
_headerListStart = [NSMutableArray array];

然后还值得一提的便是Cell的自定义

Cell的自定义:

我第一次自定义Cell的时候曾很迷惑,因为在设置好基本模板后,竟然找不到text这个属性。
在当时的我看来应该有这么一行代码:

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nameCellId]; //定义cell

cell.text = @"我想要的文字";  //但是事实上它被划掉了,为什么呢?因为这是旧版的写法

后来我才发现,只是要稍微多增加一步

cell.textField.text = @"文字"; //就是这么简单地解决了我的问题,这是新版的写法,在不少网站的旧帖子上没有显示。

结尾:

其实我发现,网络上的帖子绝对没有官方文档来得可靠,但是官方文档也会过时,所以查资料一定要慎重!
一开始我并不觉得通讯录的功能很难制作,但是现在我发现,想要制作出一个像模像样的原版通讯录绝非易事,还是有不少的问题需要解决的。

你可能感兴趣的:(微专业GeekBand-IOS应用开发实战笔记-第三周)