【问题标题】:Property UITextField.beginningOfDocument is always nil on iOS 8, 9. Serious bug in iOS?属性 UITextField.beginningOfDocument 在 iOS 8、9 上始终为零。iOS 中的严重错误?
【发布时间】:2016-01-23 00:11:12
【问题描述】:

似乎在 iOS 8 和 9、Xcode 7 中,UItextField 的属性 beginningOfDocumentendOfDocument 始终是 nil,无论您做什么。更糟糕的是,它们在 Swift 2 中不是可选类型 (UITextPosition?),而是属于 UITextPosition 类型 - 并且仍然具有 nil 值。调试器将其称为<uninitialized> 而不是nil,但这与它的行为相同。要重现,请将以下代码放入任何UIViewController

override func viewDidAppear(animated: Bool) {
    let textField = UITextField()
    textField.text = "Hello"
    view.addSubview(textField)
    let position: UITextPosition? = textField.beginningOfDocument //beginningOfDocument is of type UITextPosition, not optional
    //following line should always succeed
    let positionUnwrapped = position! //fatal error: unexpectedly found nil while unwrapping an Optional value
}

这真的是一个(巨大的)错误还是我错过了什么?是否有解决方法,也许有一些解决问题的步骤?


编辑:请注意,这个问题回答here。那里建议的修复不适用于我的示例代码:

  1. 我的演示代码根本没有使用 Interface Builder,所以 Gazzini's answer 不起作用。此外,XCode 7 中的 Interface Builder 没有属性 selectable for UITextView,类本身也没有声明这样的属性。
  2. 我的演示代码在访问beginningOfDocument 之前将UITextField 添加到视图层次结构中,因此m1h4's answer 也不相关。

【问题讨论】:

  • 我不明白,如果不是可选的,你为什么要声明它是可选的?你在iOS8上试过吗?
  • @Andrea 我将其声明为可选只是为了演示问题。如果我没有,只是使用了这个值(应该是UITextPosition),我会得到意想不到的行为(因为它确实是nil)。在 iOS 8 上,我得到同样的错误,同样的行为。
  • 查看这里是否已经回答stackoverflow.com/questions/20426048/…

标签: ios swift uitextfield uitextinput


【解决方案1】:

是的,这是beginningOfDocument 的 Swift 声明中的一个错误。你可以向苹果here举报。

它将在成为第一响应者后返回一个有效的UITextPosition

【讨论】:

  • 所以调用becomeFirstResponder 对大多数应用程序来说效果很好。但我的是键盘扩展 - 在内部调用 becomeFirstResponder 会导致此错误:Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Received more than one main-thread continuation for the current keyboard task.' 我可以使用 UITextView 而不是这个问题 - 但有另一个问题 (see my question here)。看起来对我来说没有办法摆脱这个文本输入地狱......
  • 似乎已在 ios 11 中修复
猜你喜欢
  • 1970-01-01
  • 2014-11-24
  • 2016-04-07
  • 2016-03-03
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
  • 2016-01-25
相关资源
最近更新 更多