【问题标题】:Autolayout issue for UITextField in iosios中UITextField的自动布局问题
【发布时间】:2015-01-01 07:49:53
【问题描述】:

我在情节提要中创建了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] 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“执行 -layoutSubviews 后仍需要自动布局。 UITextField的-layoutSubviews的实现需要调用super。'

【问题讨论】:

  • 查看最后一条错误语句。 UITextField 的 -layoutSubviews 实现需要调用 super.'你继承了 UITextfield 吗?
  • @Spectravideo328 是的,我继承了 UITextField。我的应用在 iOS8 上运行良好。该问题仅在 iOS7 上。
  • 你是否像评论所说的那样称呼超级?
  • @Spectravideo328 非常感谢您的回复。我设法在我的 UITextField 上调用 loadSubViews 解决了这个问题。它适用于 iOS8 和 iOS7。

标签: ios iphone ios7 ios8 autolayout


【解决方案1】:

所以几天前我也遇到了同样的错误。事实证明,我试图在我的 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] 方法。

【讨论】:

  • 谢谢!这解决了我遇到的一个非常烦人的问题。在 iOS 8 上一切正常,但在 iOS 7 上无法正常工作
  • 谢谢!就我而言,我编写了一个自定义范围滑块,并且遇到了与原始问题中列出的相同的错误。我已经覆盖layoutSubViews 来处理调整大小期间滑块拇指的重新定位。就我而言,错误消息部分正确,因为我忘记在layoutSubviews 中调用超类。除此之外,我还需要您的解决方案,即在重新定位拇指的调用后添加 [self layoutIfNeeded]
【解决方案2】:

我通过继承 UITextField 并重新实现 2 个方法解决了这个问题:

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

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

真的很烦人。苹果让程序员经常哭泣

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    相关资源
    最近更新 更多