在没有UITextField的情况下正确显示UIDatePicker

时间:2015-02-05 00:17:20

标签: ios iphone uitableview swift uidatepicker

我试图在没有 UITextField的情况下显示UIDatePicker 。我知道我可以设置UITextField的inputView属性,但我不想这样做。

我有UITableViewCell Right Detail样式,我想在选择行时显示UIDatePicker。当UIDatePicker更改值时,我将更新单元格中的详细信息标签。

问题是,如果没有UIDatePicker,我找不到显示UITextField的方法。如果我只是创建一个UIDatePicker并将其添加到我的视图中,它没有正确显示,因为它没有背景/容器视图(除非我设置背景颜色),我必须手动设置位置

此外,我的表视图控制器的view属性是UIScrollView ,如果用户在将日期选择器添加到视图后滚动,则日期选择器相对于滚动视图移动。为了解决这个问题,我目前正在将其添加到UIWindow。

有更好的方法可以做到这一点,还是应该手动完成?

  1. 创建UIDatePicker
  2. 设置背景颜色
  3. 计算位置
  4. 将其添加到窗口(以避免影响它的UIScrollView)
  5. 感谢。

1 个答案:

答案 0 :(得分:0)

这是一种对我有用的方法。我正在使用下面的例子:

显示日期选择器无需任何复杂功能。我只是将它拖到表格视图上,通过控制拖动它来建立IBOutlet( datePicker )和IBAction( pickDate )。在viewDidLoad中,我设置datePicker.hidden = true(以便最初隐藏选择器)。在didSelectRowAtIndexPath中,我将indexPath保存到全局变量savedIndexPath中,然后设置datePicker.hidden = false(在tableView的顶部显示日期选择器)。在IBAction pickDate中,获取所选单元格并更新单元格的textLabel。然后隐藏datePicker。 (我在模拟器上测试了这个)。我实施IBAction的方式是,只要你抬起手指然后隐藏选择器就会改变细胞。这需要改进。

以下代码中有:

    import UIKit

class TableViewController: UITableViewController {

    var myDate = ""
    var savedIndexPath = NSIndexPath()

    @IBAction func pickDate(sender: UIDatePicker) {
        myDate = convertDate(sender.date)
        let currentCell = tableView.cellForRowAtIndexPath(savedIndexPath) as UITableViewCell?
        datePicker.hidden = false
        currentCell?.textLabel?.text = myDate

        datePicker.hidden = true
    }

    @IBOutlet weak var datePicker: UIDatePicker!

    override func viewDidLoad() {
        super.viewDidLoad()
        datePicker.hidden = true
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

    }

    let cellIdentifier = "cell"
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as UITableViewCell!
        if cell == nil
        {
            cell = UITableViewCell( style:.Default, reuseIdentifier:cellIdentifier)
        }
        cell.textLabel?.text = "\(indexPath.row)"
        return cell
    }


    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {

        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 3
    }

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

        savedIndexPath = indexPath
        datePicker.hidden = false
    }

    //MARK: - NSDate Conersion
    func convertDate(date:NSDate) -> String{
        let dateFormatter = NSDateFormatter()

        var theDateFormat = NSDateFormatterStyle.ShortStyle
        let theTimeFormat = NSDateFormatterStyle.ShortStyle

        dateFormatter.dateStyle = theDateFormat
        dateFormatter.timeStyle = theTimeFormat
        let dateTimeString = dateFormatter.stringFromDate(date)
        return dateTimeString
    }


}