UITableView作为iOS布局的重要组成部分,需要我们对它有一个比较升入和全面的认识。
首先,UITableView是UIScrollView的子类,它可以自定响应滚动事件。UITableView内部包含0到多个UITableViewCell对象,每个table cell展示各自的内容。当新cell需要被显示时,就会调用tableView:cellForRowAtIndexPath:方法来获取或创建一个cell,而不可视时,它又会被释放。由此可见,同一时间其实只需要存在一屏幕的cell对象即可,不需要为每一行创建一个cell。这里就是cell的复用机制的原理。
使用UITableView的时候,当前的controller需要遵循两个协议,分别是UITableViewDelegate 和 UITableViewDataSource,并设置UITableView的delegate和dataSource为self
tableView.delegate=self
tableView.dataSource=self
当然需要实现UITableViewDataSource的代理方法,必需实现的方法有两个:
1. func tableView(tableView:UITableView, numberOfRowsInSection section:Int) ->Int{
return1
}
2. func tableView(tableView:UITableView, cellForRowAtIndexPath indexPath:NSIndexPath) ->UITableViewCell{
var cell = tableView.dequeueReusableCellWithIdentifier("Cell")
if cell ==nil{
cell =UITableViewCell(style: .Default, reuseIdentifier:"Cell")
}
return cell!
}
上面的第一个方法是返回每一个区的cell的个数,也就是多少行;第二个方法是定制cell, 这个地方是比较关键的地方,一般在这个地方来定制各种个性化的cell元素。这里只是使用最简单最基本的cell类型,其中有一个主标题cell.textLabel还有一个副标题cell.detailTextLabel,还有一个image在最前头叫cell.imageView.还可以设置右边的图标,通过cell.accessoryType可以设置。
cell?.textLabel?.text = "11"//设置默认的cell类型中的textLabel
cell?.detailTextLabel?.text = "22"//设置默认的cell类型中的detailTextLabel
cell?.imageView?.image = UIImage(named:"")//设置默认的cell类型中的imageView的image
cell?.accessoryType = .DisclosureIndicator//设置默认的cell类型中的附件类型(指示器)
当然,仅仅使用上述的两个方法去定制cell当然是不够的,下面让我们来看看更多的关于UITableView的知识,开始吧:
1. 关于协议-UITableViewDataSource
1. tableView的section的个数,默认为1
func numberOfSectionsInTableView(tableView:UITableView) ->Int{
}
2. 每个section上面的标语内容(返回指定的section 的 header 的 title,如果这个section header 有返回view,那么title就不起作用了)
func tableView(tableView:UITableView, titleForHeaderInSection section:Int) ->String? {
}
3. 每个section下面的标语内容
func tableView(tableView:UITableView, titleForFooterInSection section:Int) ->String? {
}
4. 是否可编辑tableView的行(单元格)
func tableView(tableView:UITableView, canEditRowAtIndexPath indexPath:NSIndexPath) ->Bool{
}
5. 是否可拖拽
func tableView(tableView:UITableView, canMoveRowAtIndexPath indexPath:NSIndexPath) ->Bool{
}
6.右侧索引条需要的数组内容, 该方法返回值用于在表格右边建立一个浮动的索引
func sectionIndexTitlesForTableView(tableView:UITableView) -> [String]? {
}
7.索引值对应的section-index
func tableView(tableView:UITableView, sectionForSectionIndexTitle title:String, atIndex index:Int) ->Int{
}
2. 关于协议-UITableViewDelegate
1. 每个cell高度的返回(这里高度通过协议返回,是为了table能准确的定位出要显示的Cell-index,从而满足UITableView的重用机制),方法返回指定的 row 的高度
func tableView(tableView:UITableView, heightForRowAtIndexPath indexPath:NSIndexPath) ->CGFloat{
}
2. 返回每个section-header的自定义视图(返回指定的 section header 的view,如果没有,这个函数可以不返回view)
func tableView(tableView:UITableView, viewForHeaderInSection section:Int) ->UIView? {
}
3. 每个section-header高度的返回 或者说 返回指定的 section的header view 的高度
functableView(tableView:UITableView, heightForHeaderInSection section:Int) ->CGFloat{
}
4. 可返回每个section-footer的自定义视图
func tableView(tableView:UITableView, viewForFooterInSection section:Int) ->UIView? {
}
5. 每个section-footer高度的返回 或者说 返回指定的 section的footer view 的高度
func tableView(tableView:UITableView, heightForFooterInSection section:Int) ->CGFloat{
}
6. Cell选中和取消选择的回调(有4个方法)
func tableView(tableView:UITableView, willSelectRowAtIndexPath indexPath:NSIndexPath) ->NSIndexPath? {
}
func tableView(tableView:UITableView, willDeselectRowAtIndexPath indexPath:NSIndexPath) ->NSIndexPath? {
}
func tableView(tableView:UITableView, didSelectRowAtIndexPath indexPath:NSIndexPath) {
}//这个比较常用,点击单元格的方法(当用户选中某个行的cell的时候,回调用这个。但是首先,必须设置tableview的一个属性为可以select 才行。)
func tableView(tableView:UITableView, didDeselectRowAtIndexPath indexPath:NSIndexPath) {
}
7. Cell高亮的回调,一般式在选择的时候才高亮(3个方法)
func tableView(tableView:UITableView, shouldHighlightRowAtIndexPath indexPath:NSIndexPath) ->Bool{
}
func tableView(tableView:UITableView, didHighlightRowAtIndexPath indexPath:NSIndexPath) {
}
func tableView(tableView:UITableView, didUnhighlightRowAtIndexPath indexPath:NSIndexPath) {
}
下面在来说说一些比较常用的tableView中的属性
1. 当用户选中某个行的cell的时候,回调用这个。但是首先,必须设置tableview的一个属性为可以select 才行。(在didSelectRowAtIndexPath方法中设置哦)
self.tableView.allowsSelection=true
2. 设置单元格选中的风格
cell?.selectionStyle=UITableViewCellSelectionStyle.Blue
3. 让cell 能够响应 select,但是选中后的颜色又不发生改变呢,那么就设置
cell?.selectionStyle=UITableViewCellSelectionStyle.None
4. 设置tableview单元格之间的分割线
self.tableView.separatorStyle= .None
5.如何设置 tableview cell的背景颜色
cell?.contentView.backgroundColor=UIColor.whiteColor()
6.设置单元格的行高(默认为44)
self.tableView.rowHeight=60
7. 刷新单元格
self.tableView.reloadData()