ios中UITextField的Autolayout问题
我在故事板中创建了UITextField
。 并且还增加了它的约束。 我想在UITextField的左侧搜索图标。 添加搜索图标的代码如下:
self.searchTextField.leftView = searchIconImage; self.searchTextField.leftViewMode = UITextFieldViewModeAlways; [self.searchTextField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
我的应用程序在iOS8上工作正常,在iOS7上崩溃。 错误如下:
断言失败 – [UITextField layoutSublayersOfLayer:],/ SourceCache / UIKit / UIKit-2935.138 / UIView.m:8794 2014-11-05 12:54:33.377 WattUp [1722:60b]由于未捕获的exception’NSInternalInconsistencyException’而终止应用程序,原因:’执行-layoutSubviews后仍需要自动布局。 UITextField的-layoutSubviews实现需要调用super。
所以几天前我也遇到了同样的错误。 事实certificate,我试图在我的UITextfield
子类中布局子视图,设置它们的属性,移动它们等,但从未明确地告诉视图自己放置(即调用[self layoutIfNeeded]
)。
iOS 8似乎强制要查看布局其所有子视图,然后在其上配置约束。 iOS 7不会,并且如果您正在使用自动布局,则需要您在更改时明确告知视图重绘其子视图。
在我的例子中,我已经将UITextField
子类化,并在侧面添加了一个标签。 我通过向UITextfield添加约束来配置标签的框架。 我可以在class上打电话的一种公共方法是
- (void)setLabelText:(NSString *)newText{ self.sideLabel.text = newText; }
当视图控制器出现包含我的子类文本字段时,这导致我的应用程序崩溃。 通过添加layoutIfNeeded
在iOS7和iOS8中一切正常。
- (void)setLabelText:(NSString *)newText{ self.sideLabel.text = newText; [self layoutIfNeeded]; }
每次更改子类中视图的一部分时都需要调用它。 这包括添加子视图时的设置,更改视图属性时的任何设置。 在更改视图返回的函数返回之前,请在视图上调用layoutIfNeeded
。 这似乎适用于一些标准的UI控件,包括UITextfield,UITableView和UICollectionView,虽然我确定还有其他的。 我希望这很清楚,并帮助解决你的问题。
你得到的错误并不是非常有用,甚至不适用于我的情况。 虽然我收到了完全相同的错误,但是我的所有视图都没有实现layoutSubviews
,因此都使用了[super layoutSubviews]
方法。
我通过inheritanceUITextField并重新实现2个方法解决了这个问题:
- (void)setText:(NSString *)text { [super setText:text]; [self layoutIfNeeded]; } - (void)layoutSubviews { [super layoutSubviews]; }
真是令人讨厌的事情。 Apple让程序员经常哭泣