ios中UITextField的Autolayout问题

Rak*_*esh 4 iphone ios autolayout ios7 ios8

UITextField在故事板中创建.并且还增加了它的约束.我想在UITextField的左侧搜索图标.添加搜索图标的代码如下:

self.searchTextField.leftView = searchIconImage;
    self.searchTextField.leftViewMode = UITextFieldViewModeAlways;
    [self.searchTextField addTarget:self
                  action:@selector(textFieldDidChange:)
        forControlEvents:UIControlEventEditingChanged];
Run Code Online (Sandbox Code Playgroud)

我的应用程序在iOS8上工作正常,在iOS7上崩溃.错误如下:

断言失败 - [UITextField layoutSublayersOfLayer:],/ SourceCache/UIKit/UIKit-2935.138/UIView.m:8794 2014-11-05 12:54:33.377 WattUp [1722:60b]由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'执行-layoutSubviews后仍需要自动布局.UITextField的-layoutSubviews实现需要调用super.

Pat*_*icz 8

所以几天前我也遇到了同样的错误.事实证明,我试图在我的UITextfield子类中布置子视图,设置它们的属性,移动它们等,但从未明确地告诉视图自己(即调用[self layoutIfNeeded]).

iOS 8似乎迫使视图布局其所有子视图,然后在其上配置约束.iOS 7不会,并且如果您正在使用自动布局,则需要您在更改时明确告知视图重绘其子视图.

就我而言,我已经进行了子类化UITextField并在侧面添加了一个标签.我通过向UITextfield添加约束来配置标签的框架.我可以在班上打电话的一种公共方法是

- (void)setLabelText:(NSString *)newText{
    self.sideLabel.text = newText;
}
Run Code Online (Sandbox Code Playgroud)

当视图控制器出现包含我的子类文本字段时,这导致我的应用程序崩溃.通过添加layoutIfNeeded一切在iOS7和iOS8中工作正常.

- (void)setLabelText:(NSString *)newText{
    self.sideLabel.text = newText;
    [self layoutIfNeeded];
}
Run Code Online (Sandbox Code Playgroud)

每次更改子类中视图的一部分时都需要调用它.这包括添加子视图时的设置,更改视图属性时的任何设置.在更改视图返回的功能之前,请调用layoutIfNeeded您的视图.这似乎适用于一些标准的UI控件,包括UITextfield,UITableView和UICollectionView,虽然我确定还有其他的.我希望这很清楚,并帮助解决您的问题.

你得到的错误不是很有用,甚至不适用于我的情况.虽然我收到了完全相同的错误,但我的所有视图都没有实现layoutSubviews,因此都在使用该[super layoutSubviews]方法.