Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ios中UITextField的自动布局问题_Ios_Iphone_Ios7_Ios8_Autolayout - Fatal编程技术网

ios中UITextField的自动布局问题

ios中UITextField的自动布局问题,ios,iphone,ios7,ios8,autolayout,Ios,Iphone,Ios7,Ios8,Autolayout,我在情节提要中创建了UITextField。并增加了约束条件。我想在UITextField的左侧显示搜索图标。添加搜索图标的代码如下: self.searchTextField.leftView = searchIconImage; self.searchTextField.leftViewMode = UITextFieldViewModeAlways; [self.searchTextField addTarget:self action:

我在情节提要中创建了
UITextField
。并增加了约束条件。我想在UITextField的左侧显示搜索图标。添加搜索图标的代码如下:

self.searchTextField.leftView = searchIconImage;
    self.searchTextField.leftViewMode = UITextFieldViewModeAlways;
    [self.searchTextField addTarget:self
                  action:@selector(textFieldDidChange:)
        forControlEvents:UIControlEventEditingChanged];
我的应用程序在iOS8上运行良好,在iOS7上崩溃。错误如下:

self.searchTextField.leftView = searchIconImage;
    self.searchTextField.leftViewMode = UITextFieldViewModeAlways;
    [self.searchTextField addTarget:self
                  action:@selector(textFieldDidChange:)
        forControlEvents:UIControlEventEditingChanged];
在-[UITextField layoutSublayersOfLayer:],/SourceCache/UIKit/UIKit-2935.138/UIView.m:8794中的断言失败 2014-11-05 12:54:33.377 WattUp[1722:60b]由于未捕获的异常“Ninternalinconsistenceexception”而终止应用程序,原因是:“执行后仍需要自动布局-布局子视图。”。UITextField的-layoutSubviews实现需要调用super


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

iOS 8似乎强制某个视图布局其所有子视图,然后在其上配置约束。iOS 7不会这样做,如果使用autolayout,则需要您在更改时明确告诉视图重新绘制其子视图

在我的例子中,我对
UITextField
进行了子类化,并在侧面添加了一个标签。我通过向UITextfield添加约束来配置标签的框架。我可以在课堂上调用的公共方法之一是

- (void)setLabelText:(NSString *)newText{
    self.sideLabel.text = newText;
}
当一个视图控制器包含我的子类textfield时,这导致我的应用程序崩溃。通过add
layoutifneedd
iOS7和iOS8中的一切工作正常

- (void)setLabelText:(NSString *)newText{
    self.sideLabel.text = newText;
    [self layoutIfNeeded];
}
每次更改子类中视图的一部分时,都需要调用该函数。这包括添加子视图时的设置,更改视图属性时的设置,以及任何实际操作。在更改视图的函数返回之前,在视图上调用
layoutifneedd
。这似乎适用于一些标准UI控件,包括UITextfield、UITableView和UICollectionView,尽管我确信还有其他控件。我希望这足够清楚,有助于解决您的问题


你得到的错误不是非常有用,甚至不适用于我的情况。虽然我收到了完全相同的错误,但我的视图中没有一个实现了
布局子视图
,因此都使用了
[super layoutSubviews]
方法。

我通过将UITextField子类化并重新实现两种方法来解决这个问题:

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

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

真的很有趣。苹果让程序员经常哭

见最后一句错误的话。UITextField的-layoutSubviews实现需要调用super。“您是否将UITextField子类化?@Spectravideo328是,我将UITextField子类化。”。我的应用程序在iOS8上运行良好。该问题仅在iOS7上发布。您是否如评论所述致电super?@Spectravideo328非常感谢您的回复。我在UITextField上调用loadsubview成功地解决了这个问题。它同时在iOS8和iOS7上工作。谢谢!这解决了我遇到的一个非常恼人的问题。在iOS 8上一切正常,但在iOS 7上不正常谢谢!在我的例子中,我编写了一个自定义范围滑块,得到了与原始问题中列出的相同的错误。我已经覆盖了
layoutSubViews
,以处理在调整大小期间滑块拇指的重新定位。在我的例子中,错误消息部分是正确的,因为我忘记在
layoutSubviews
中调用超类。除此之外,我还需要你的解决方案,那就是在重新定位拇指的呼叫之后添加
[self layoutifneed]