ios中的UITextField的Autolayout问题

问题描述:

我在storyboard中创建了UITextField。并增加了它的约束条件。我想要UITextField左侧的搜索图标。添加搜索图标的代码如下:ios中的UITextField的Autolayout问题

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月5日12:54:33.377 WattUp [1722 :60b]由于未捕获异常'NSInternalInconsistencyException'而终止应用程序,原因:'在执行-layoutSubviews之后仍然需要自动布局。 UITextField的-layoutSubviews实现需要调用super。'

+2

查看最后一条语句错误。 UITextField的-layoutSubviews实现需要调用super。'你有没有继承UITextfield? – Spectravideo328 2014-11-05 07:43:35

+0

@ Spectravideo328是的,我的子类UITextField。我的应用在iOS8上运行良好。该问题仅在iOS7上。 – Rakesh 2014-11-05 08:13:46

+0

你说的超级评论说吗? – Spectravideo328 2014-11-05 08:42:25

所以我几天前也遇到过这个相同的错误。事实证明,我试图在我的UITextfield子类中设置子视图,在它们上设置属性,移动它们等,但从未明确告诉视图放置(即调用[self layoutIfNeeded])。

iOS 8似乎强制一个视图来布置所有子视图,然后配置它的约束。如果您使用自动布局,iOS 7将不会,并且需要您明确告诉视图以在您更改时重绘其子视图。

就我而言,我已将子类别UITextField添加到旁边并添加了标签。我通过向UITextfield添加约束来配置标签的框架。其中一个公共方法,我可以在我的课呼叫

- (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]方法。

+0

谢谢!这解决了我遇到的一个非常烦人的问题。一切工作正常在iOS 8上,但没有在iOS 7上工作 – Endama 2014-12-09 22:21:52

+0

谢谢!在我的情况下,我写了一个自定义范围滑块,并得到了与原始问题中列出的相同的错误。我重写了'layoutSubViews'来处理调整大小期间重新定位滑块大拇指。在我的情况下,错误信息是部分正确的,因为我忘记调用'layoutSubviews'中的超类。除此之外,我需要您的解决方案,即在重新定位拇指的调用之后添加'[self layoutIfNeeded]'。 – 2015-01-07 21:25:49

我解决了这个通过继承的UITextField和重新实现2种方法:

- (void)setText:(NSString *)text 
{ 
    [super setText:text]; 
    [self layoutIfNeeded]; 
} 

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 
} 

真的annoing的事情。苹果让程序员频频哭泣