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

Posted

技术标签:

【中文标题】在没有 UITextField 的情况下正确显示 UIDatePicker【英文标题】:Properly displaying UIDatePicker without UITextField 【发布时间】:2015-02-05 00:17:20 【问题描述】:

我试图显示一个UIDatePicker 没有一个UITextField。我知道我可以设置 UITextField 的 inputView 属性,但我不想那样做。

我有一个带有Right Detail 样式的UITableViewCell,我想在选择该行时显示一个UIDatePicker。当UIDatePicker的值发生变化时,我会更新单元格中的详细标签。

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

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

有没有更好的方法来做这件事,还是应该手动做?

    创建 UIDatePicker 设置背景颜色 计算位置 将其添加到窗口中(避免 UIScrollView 影响它)

谢谢。

【问题讨论】:

【参考方案1】:

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

无需执行任何复杂操作即可显示日期选择器。我只是将它拖到表格视图上,控制拖拽它以建立一个 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
    



【讨论】:

以上是关于在没有 UITextField 的情况下正确显示 UIDatePicker的主要内容,如果未能解决你的问题,请参考以下文章

单击已显示键盘的第二个UITextField会错误地移动内容

UITextField 无法正确显示文本

如何在没有委托的情况下处理 UITextField 值更改? [关闭]

键盘可见时,将输入附件视图添加到UITextField

iOS:在 UITableViewCell 中显示所需 UITextField 的正确方法

UITextField 突出显示所有文本