2014-08-29 2 views
7

Я подклассифицирую UITextField, чтобы добавить ярлык с левой стороны. Я использую автозапуск для компоновки ярлыка. Тем не менее, я получаю эту аварию:Autolayout в UITextField: автоматический макет еще требуется после выполнения -layoutSubviews

Вот как я делаю свой код макета:

- (void)updateConstraints { 

self.segmentLabel.translatesAutoresizingMaskIntoConstraints = NO; 

NSLayoutConstraint *constraint; 
constraint = [NSLayoutConstraint constraintWithItem:self.segmentLabel attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeHeight multiplier:1.0 constant:0.0f]; 
[self addConstraint:constraint]; 
constraint = [NSLayoutConstraint constraintWithItem:self.segmentLabel attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeLeading multiplier:1.0 constant:0.0f]; 
[self addConstraint:constraint]; 
constraint = [NSLayoutConstraint constraintWithItem:self.segmentLabel attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0f]; 
[self addConstraint:constraint]; 
constraint = [NSLayoutConstraint constraintWithItem:self.segmentLabel attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:self.segmentWidth]; 
[self addConstraint:constraint]; 

[super updateConstraints]; 

}

Когда я не делать какие-либо коррективы в текстовое поле, это работает отлично.

Однако, если я пытаюсь установить замещающий текст, я получаю это исключение:

, истекающее приложение из-за неперехваченное исключение «NSInternalInconsistencyException», причина: «Auto Layout еще требуется после выполнения -layoutSubviews. Реализация DDSegmentedTextField -layoutSubviews требует вызова super. '

Однако я не переопределяю -layoutSubviews.

С кем это столкнулось? Что я делаю не так?

Спасибо!

+0

Показать код, задающий текст заполнителя. –

+0

его просто self.tipField.placeholder = @ "placeholder"; в представленииDidLoad контроллера –

ответ

8

Так что я столкнулся с этой же ошибкой несколько дней назад. Оказывается, я пытался разбить объекты в моем подклассе UITextfield, установив на них свойства, перемещая их и т. Д., Но никогда не указывал явным образом представление о себе (т. Е. Вызывая [self layoutIfNeeded]).

iOS 8, похоже, заставляет взглянуть на макет всех его подзонов, а затем настраивает ограничения на него. iOS 7 не будет, и вам нужно явно указывать представления для перерисовки своих подзонов при изменении, если вы используете автозапуск.

В моем случае я получил подкласс UITextField и добавил ярлык сбоку. Я настроил фрейм метки, добавив ограничения в поле UIText. Одним из общих методов я мог бы назвать в моем классе был

- (void)setLabelText:(NSString *)newText{ 
    self.sideLabel.text = newText; 
} 

Это вызвало мое приложение к сбою, когда контроллер зрения появился содержащим мои подклассы TextField. Добавив layoutIfNeeded, все работает отлично в iOS7 и iOS8.

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

Это нужно вызывать каждый раз, когда вы изменяете часть вида в вашем подклассе. Это включает настройку, когда вы добавляете subviews, когда вы меняете свойства вида, что-либо действительно. Прежде чем функция, которая меняет ваше представление, вернется, позвоните по номеру layoutIfNeeded. Это похоже на несколько стандартных элементов управления пользовательского интерфейса, включая UITextfield, UITableView и UICollectionView, хотя я уверен, что есть и другие. Надеюсь, это было достаточно ясно и помогло решить вашу проблему.

Ошибка, которую вы получаете, не очень полезна и даже не применима в моем случае. Хотя я получал ту же ошибку, ни один из моих взглядов не реализовал layoutSubviews, и поэтому все они использовали метод [super layoutSubviews].

-2

У меня была такая же проблема. Это может быть вызвано неправильными ограничениями, может быть, некоторым набором в Storyboard. Попробуйте удалить некоторые из них и посмотреть, не работает ли это, чтобы выяснить, что не так.

4

Эта проблема проявляется в прошивке

При создании подкласса UIView и добавление точки зрения, мы можем поручить управление по строительству и autolayout первого в подвидах. Используйте это заявление, когда пользовательский интерфейс должен быть обновлен:

[self layoutIfNeeded];

IOS 8+ регулирует вопрос совсем там собственный внутренне.

Смежные вопросы