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让程序员经常哭泣