UITextField 文本在编辑前不可见

UITextField Text Invisible Until Editing

我实现了 UITextField 的子类,它具有如下填充:

methods taken from here

- (CGRect)textRectForBounds:(CGRect)bounds {
    return CGRectInset(bounds, 10, 10);
}

- (CGRect)editingRectForBounds:(CGRect)bounds {
    return CGRectInset(bounds, 10, 10);
}

结合以上各项,将 textField 设置为 viewWillAppear: 中的 firstResponder,并在字段中设置初始起始值,我 运行 进入一个问题,即文本在编辑字段之前是不可见的,然后就可以了:

发生这种情况时,我还在控制台中看到以下消息:

-[<CALayer: 0x15f000da0> display]: Ignoring bogus layer size (179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000, 20.000000), contentsScale 3.000000, backing store size (inf, 60.000000)

我认为 bounds 值可能不正常,这就是导致视觉错误和错误的原因,但是当我记录边界时,我得到了一堆似乎有效的值,如:{{0, 0}, {345, 40}}

注释掉上面的这两种方法,基本上是一个普通的 UITextField,似乎解决了这个问题。我已经尝试在每个方法中添加对 super 的调用,以防万一,但无济于事。有什么想法吗?

Update - 将对 becomeFirstResponder 的调用移动到 viewDidAppear 似乎也解决了这个问题,但是这几乎扼杀了基本上是向导的流程,因此前一个屏幕在屏幕上也有键盘,所以我想避免键盘消失并重新出现在每个屏幕上。

感谢@matt,我发现问题是因为我在 viewWillAppear 中的文本字段上调用 ​​becomeFirstResponder。虽然这对我来说多年来一直没有问题地使用普通文本字段和文本视图,但看起来这最终是出现问题的一个实例。

根据 UIResponder docs for becomeFirstResponder:

You may call this method to make a responder object such as a view the first responder. However, you should only call it on that view if it is part of a view hierarchy. If the view’s window property holds a UIWindow object, it has been installed in a view hierarchy; if it returns nil, the view is detached from any hierarchy.

这是通过在调试器中打印 [[self.textfield superview] window] 来验证的,而在 viewWillAppear 中 window 是 nil,而它不在 viewDidAppear 中。每天学点新东西。