import UIKit
class MyTableViewController : UITableViewController {
@IBOutlet weak var dueDateLabel: UILabel !
//日期选择器显示状态
var datePickerVisible: Bool = false
override func viewDidLoad() {
super .viewDidLoad()
self .title = "添加任务"
//去除尾部多余的空行
self .tableView.tableFooterView = UIView (frame: CGRectZero )
}
override func didReceiveMemoryWarning() {
super .didReceiveMemoryWarning()
}
//选择cell的row之后
override func tableView(tableView: UITableView , didSelectRowAtIndexPath indexPath: NSIndexPath ) {
self .tableView.deselectRowAtIndexPath(indexPath, animated: true )
//当执行到日期选择器上一行的时候,可以判断是否要显示日期选择器了
if indexPath.section == 0 && indexPath.row == 1{
if !datePickerVisible{
self .showDatePicker()
} else {
self .hideDatePicker()
}
}
println (indexPath.row)
}
//显示日期选择器
func showDatePicker(){
//日期选择器的状态设为打开
datePickerVisible = true
let indexPathDatePicker = NSIndexPath (forRow: 2, inSection: 0)
self .tableView.insertRowsAtIndexPaths([indexPathDatePicker],
withRowAnimation: UITableViewRowAnimation . Automatic )
}
//隐藏日期选择器
func hideDatePicker(){
if datePickerVisible {
//日期选择器的状态设为关闭
datePickerVisible = false
let indexPathDatePicker = NSIndexPath (forRow: 2, inSection: 0)
self .tableView.deleteRowsAtIndexPaths([indexPathDatePicker],
withRowAnimation: UITableViewRowAnimation . Fade )
}
}
override func numberOfSectionsInTableView(tableView: UITableView ) -> Int {
return 1
}
//设置cell
override func tableView(tableView: UITableView , cellForRowAtIndexPath indexPath: NSIndexPath )
-> UITableViewCell {
//因为日期选择器的位置在日期显示Label下面。它的位置就是第2个section 和第3个row
if indexPath.section == 0 && indexPath.row == 2{
//用重用的方式获取标识为DatePickerCell的cell
var cell = tableView.dequeueReusableCellWithIdentifier( "DatePickerCell" )
as UITableViewCell ?
//如果没找到就创建一个
if cell == nil {
//创建一个标识为DatePickerCell的cell
cell = UITableViewCell (style: UITableViewCellStyle . Default ,
reuseIdentifier: "DatePickerCell" )
//设置cell的样式
cell?.selectionStyle = UITableViewCellSelectionStyle . None
//创建日期选择器
var datePicker = UIDatePicker (frame: 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( self , action: "dateChanged:" ,
forControlEvents: UIControlEvents . ValueChanged )
}
return cell!
} else {
return super .tableView(tableView, cellForRowAtIndexPath: indexPath)
}
}
//日期选择器响应方法
func dateChanged(datePicker : UIDatePicker ){
//更新提醒时间文本框
let formatter = NSDateFormatter ()
//日期样式
formatter.dateFormat = "yyyy年MM月dd日 HH:mm:ss"
self .dueDateLabel.text = formatter.stringFromDate(datePicker.date)
}
//根据日期选择器的隐藏与否决定返回的row的数量
override func tableView(tableView: UITableView , numberOfRowsInSection section: Int ) -> Int {
if section == 0 && datePickerVisible{
return 3
} else {
return super .tableView(tableView, numberOfRowsInSection: section)
}
}
//因为日期选择器插入后会引起cell高度的变化,所以要重新设置
override func tableView(tableView: UITableView ,
heightForRowAtIndexPath indexPath: NSIndexPath ) -> CGFloat {
//当渲染到达日期选择器所在的cell的时候将cell的高度设为217
if indexPath.section == 0 && indexPath.row == 2{
return 216.0
} else {
return super .tableView(tableView, heightForRowAtIndexPath: indexPath)
}
}
//当覆盖了静态的cell数据源方法时需要提供一个代理方法。
//因为数据源对新加进来的日期选择器的cell一无所知,所以要使用这个代理方法
override func tableView(tableView: UITableView ,
indentationLevelForRowAtIndexPath indexPath: NSIndexPath ) -> Int {
if indexPath.section == 0 && indexPath.row == 2{
//当执行到日期选择器所在的indexPath就创建一个indexPath然后强插
let newIndexPath = NSIndexPath (forRow: 0, inSection: indexPath.section)
return super .tableView(tableView, indentationLevelForRowAtIndexPath: newIndexPath)
} else {
return super .tableView(tableView, indentationLevelForRowAtIndexPath: indexPath)
}
}
}
|