有没有一种干净的方法来使用 .inline UIDatePicker() 填充 UITextField() 内容?

问题描述 投票:0回答:1

寻找对此的一些见解。如果由于某种原因我们仍然无法以这种方式使用

.inline
样式,我想知道对于像我这样的基于
UIDatePicker()
输入填充文本字段的应用程序来说,最干净的选项是什么。

我使用

UIDatePicker()
作为
inputView
UITextField()
。这在使用
.wheels
UIDatePickerStyle()
的旧版 iOS 中效果很好。选择器将从底部向上推以代替键盘显示,就像我在其他地方使用的其他选择器一样: UIPickerView() as UITextField() inputView

但是,我收到用户请求更改为可视日历样式

.inline
日期选择器,我同意这是正确的方法。我使用此选择器允许用户在待办事项列表应用程序中定义项目和任务的截止日期。

不幸的是,选择器不会像

.wheels
样式那样将窗口的其余内容向上推。相反,它在屏幕底部显示为一个小条子。您仍然可以点击日期(在底部几乎看不见),日历选择器将正确覆盖。换句话说,选择器在基本级别上是可用的,但它已经损坏了,我无法释放它。

start: text field reads

user taps on text field: UIDatePicker() scrunched/truncated at very bottom of screen

user taps on date: picker overlay appears as expected

finish: text field reads

点击 X 清除文本字段将使显示状态按该顺序返回到“开始”。

我听说苹果建议不要使用

.inline
样式作为
inputView
,但我还没有找到对此的官方确认或充分的理由。我的应用程序中的所有其他选择器视图都以这种方式为文本字段提供输入。我不想介绍一个害群之马
UIDatePicker()
。此外,正如我的屏幕截图所示,我使用
UITextField()
的内容以叙述方式显示信息,以帮助用户了解如何管理他们的任务。

在上面的屏幕截图中,此类提供了一个自定义日期选择器,可以添加到任何

UITextField()

class ExpirationDatePickerGenerator {
  
  static var pickerStyle: UIDatePickerStyle = .inline
  
  static func instantiateExpirationDatePicker(for textField: UITextField, in view: ExpirationDatePickerDelegate) {
    let picker = UIDatePicker()
    picker.datePickerMode = .date
    let calendar = Calendar.autoupdatingCurrent
    picker.minimumDate = calendar.date(byAdding: .day, value: 1, to: Date())
    picker.addTarget(view, action: #selector(view.userDidSelectDate(_:)), for: .valueChanged)
    picker.sizeToFit()
    textField.inputView = picker
    let inputAccessory = picker.createInputAccessoryViewToolbar(inputView: textField)
    textField.inputAccessoryView = inputAccessory
  }
}

以下内容由视图控制器中的

viewDidLoad()
调用:

ExpirationDatePickerGenerator.instantiateExpirationDatePicker(for: expirationDateTextField, in: self)

我以为我在将其指定为

picker.sizeToFit()
之前调用了
textField.inputView
,但没有骰子。有没有人把它用作文本字段输入?

到目前为止的故障排除:

我尝试根据类似线程中的建议为生成器中的选择器定义自定义框架:

let pickerFrame = CGRect(x: textField.frame.minX, y: textField.frame.minY, width: textField.frame.width, height: 150)

我还在分配给

picker.sizeToFit()
之前添加了
textField.inputView

再加上大量的谷歌搜索。

ios swift uikit uidatepicker
1个回答
0
投票

在向某人大声解释这个问题时,我想我终于已经全部弄清楚了。我从未在其他线程中看到过关于此问题的实际答案,因此我将在这里尽力而为。

这种显示行为实际上是正确的,而不是错误,至少从

.inline
UIDatePicker()
样式的角度来看。

.inline
样式期望始终内联显示当前日期值,作为 UI 的一部分,除非用户当前正在编辑该值。然后它会根据
picker.datePickerMode
显示适当的选择器。

因为这种样式假设您在用户没有主动使用选择器时使用它来显示当前值,所以它不适合作为输入视图。 iOS 日历应用程序就是一个很好的例子。当您创建新事件时,

UIDatePicker()
会内嵌显示开始和结束日期/时间。在我的示例中,您可以看到该内联视图作为输入视图弹出。它显示“正确”,即按照苹果的意图。如果用户点击屏幕底部的值,选择器将打开并按预期运行。

TL;DR 因为

.inline
样式希望在用户不与
UIDatePicker()
交互时将信息显示为 UI 的一部分,因此它将显示值,而不是选择器,作为您的
textField.inputView
。虽然用户可以点击该值(一直推到屏幕底部)来打开选择器并使用它来设置新值,但
.inline
样式确实不应该用作输入查看。

我希望这可以在某个时候为某人节省一点时间!

© www.soinside.com 2019 - 2024. All rights reserved.