在没有 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 值更改? [关闭]