比如我们做一个消息提醒页面,默认页面只显示两个单元格。当点击第二个单元格(时间标签)时,下面会再添加一个单元格放置日期选择控件(同时新增单元格的高度也会变化)。而再次点击第二个单元格,日期选择控件又会隐藏。
|
import
UIKit
class
MyTableViewController
:
UITableViewController
{
@IBOutlet
weak
var
dueDateLabel:
UILabel
!
//日期选择器显示状态
datePickerVisible:
Bool
=
false
override
func
viewDidLoad() {
super
.viewDidLoad()
self
.title =
"添加任务"
//去除尾部多余的空行
.tableView.tableFooterView =
UIView
(frame:
CGRectZero
)
}
didReceiveMemoryWarning() {
.didReceiveMemoryWarning()
}
//选择cell的row之后
tableView(tableView:
UITableView
,didSelectRowAtIndexPath indexPath:
NSIndexPath
) {
.tableView.deselectRowAtIndexPath(indexPath,animated:
true
)
//当执行到日期选择器上一行的时候,可以判断是否要显示日期选择器了
if
indexPath.section == 0 && indexPath.row == 1{
!datePickerVisible{
.showDatePicker()
}
else
{
.hideDatePicker()
}
}
println
(indexPath.row)
}
//显示日期选择器
showDatePicker(){
//日期选择器的状态设为打开
datePickerVisible =
true
let
indexPathDatePicker =
(forRow: 2,inSection: 0)
.tableView.insertRowsAtIndexPaths([indexPathDatePicker],
withRowAnimation:
UITableViewRowAnimation
.
Automatic
)
}
//隐藏日期选择器
hideDatePicker(){
datePickerVisible {
//日期选择器的状态设为关闭
false
.tableView.deleteRowsAtIndexPaths([indexPathDatePicker],
Fade
)
}
}
numberOfSectionsInTableView(tableView:
) ->
Int
{
return
1
}
@H_289_301@
//设置cell
)
->
UITableViewCell
{
//因为日期选择器的位置在日期显示Label下面。它的位置就是第2个section 和第3个row
indexPath.section == 0 && indexPath.row == 2{
//用重用的方式获取标识为DatePickerCell的cell
cell = tableView.dequeueReusableCellWithIdentifier(
"DatePickerCell"
)
as
?
//如果没找到就创建一个
cell ==
nil
{
//创建一个标识为DatePickerCell的cell
cell =
(style:
UITableViewCellStyle
Default
reuseIdentifier:
)
//设置cell的样式
cell?.selectionStyle =
UITableViewCellSelectionStyle
None
//创建日期选择器
datePicker =
UIDatePicker
CGRectMake
(0.0,0.0,320.0,216.0))
//给日期选择器的tag
datePicker.tag = 100
datePicker.locale =
NSLocale
(localeIdentifier:
"zh_CN"
)
//将日期选择器加入cell
cell?.contentView.addSubview(datePicker)
//注意:action里面的方法名后面需要加个冒号“:”
datePicker.addTarget(
"dateChanged:"
forControlEvents:
UIControlEvents
ValueChanged
)
}
cell!
{
return
.tableView(tableView,cellForRowAtIndexPath: indexPath)
}
}
//日期选择器响应方法
dateChanged(datePicker :
){
//更新提醒时间文本框
formatter =
NSDateFormatter
()
//日期样式
formatter.dateFormat =
"yyyy年MM月dd日 HH:mm:ss"
.dueDateLabel.text = formatter.stringFromDate(datePicker.date)
}
//根据日期选择器的隐藏与否决定返回的row的数量
{
section == 0 && datePickerVisible{
3
{
}
}
//因为日期选择器插入后会引起cell高度的变化,所以要重新设置
heightForRowAtIndexPath indexPath:
) ->
CGFloat
{
//当渲染到达日期选择器所在的cell的时候将cell的高度设为217
indexPath.section == 0 && indexPath.row == 2{
216.0
{
}
}
//因为数据源对新加进来的日期选择器的cell一无所知,所以要使用这个代理方法
indentationLevelForRowAtIndexPath indexPath:
{
indexPath.section == 0 && indexPath.row == 2{
//当执行到日期选择器所在的indexPath就创建一个indexPath然后强插
newIndexPath =
(forRow: 0,inSection: indexPath.section)
{
}
}
}
|