2016-05-11 2 views
0

У меня есть этот код для обновления ограничений для временного UITextFiledIOS: ограничения обновления программно

- (void)updateUIOnePassword { 

    NSLayoutConstraint *fullTextField = [NSLayoutConstraint constraintWithItem:self.passwordTextField attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.userIdTextField attribute:NSLayoutAttributeTrailing multiplier:1.0f constant:0.0f]; 
    NSLayoutConstraint *cutTextField = [NSLayoutConstraint constraintWithItem:self.passwordTextField attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.userIdTextField attribute:NSLayoutAttributeTrailing multiplier:1.0f constant:-60.0f]; 

    if ([self isOnepasswordAvailable]) { 
    self.onepasswordButton.alpha = 1.0f; 
    [self.view removeConstraint:fullTextField]; 
    [self.view addConstraint:cutTextField]; 
    } else { 
    self.onepasswordButton.alpha = 0.0f; 
    [self.view addConstraint:fullTextField]; 
    [self.view updateConstraints]; 
    } 

    [self.view setNeedsUpdateConstraints]; 
    [self.view layoutIfNeeded]; 
} 

когда isOnepasswordAvailable ИСТИНЫ при запуске, он отлично работает, после того, когда я удаляю OP приложение и isOnepasswordAvailable ложен хорошо работает снова, но когда я снова вхожу в isOnepasswordAvailable, когда id TRUE, ограничения больше не работают, и у меня есть предупреждение в консоли. Знаете ли вы, почему?

Благодаря

ответ

0

Хотя я всегда предпочитаю имея IBOutlet к тяготам, вы создали ограничение программно я считаю, что должна быть хорошей причиной для этого :)

Пар вопросов, которые я заметил,

1> Я проверил оба ваших ограничения, только эти ограничения меняются в их постоянных значениях. Я считаю, что вам не нужно создавать два разных ограничения и добавлять и удалять их на основе условия. Выглядит очень сложно.

вы можете иметь свойство с именем

@property (nonatomic,strong) NSLayoutConstraint *textFieldConstraint; 

и viewWillAppear

if ([self isOnepasswordAvailable]) { 
     self.textFieldConstraint = [NSLayoutConstraint constraintWithItem:self.passwordTextField attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.userIdTextField attribute:NSLayoutAttributeTrailing multiplier:1.0f constant:0.0f]; 
} 
else { 
    self.textFieldConstraint = [NSLayoutConstraint constraintWithItem:self.passwordTextField attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.userIdTextField attribute:NSLayoutAttributeTrailing multiplier:1.0f constant:-60.0f]; 
} 
[self.view addConstraint:self.textFieldConstraint]; 
[self.view layoutIfNeeded]; 

2> Обновление метода updateUIOnePassword в

- (void)updateUIOnePassword { 
    if ([self isOnepasswordAvailable]) { 
    self.onepasswordButton.alpha = 1.0f; 
    self.textFieldConstraint.constant = 0.0f; 
    } else { 
    self.onepasswordButton.alpha = 0.0f; 
    self.textFieldConstraint.constant = -0.60f; 
    } 
    [self.view layoutIfNeeded]; 
} 

Это должно сделать работу :) Есть вид приятель:

+0

Это хорошо, если я хочу обновить одни и те же ограничения, но если я хочу, чтобы изменить ограничения ? поэтому удалите его и добавьте еще один другой? – CrazyDev

+0

Я понимаю приятеля :), но в вашем вопросе два ограничения, которые вы удаляли и добавляли, имели разницу только по их постоянному значению :), поэтому специально для этого случая я предложил обновить ограничение, а не добавлять и удалять их :) –

+0

спасибо @Sandeep – CrazyDev

0
- (void)updateUIOnePassword { 

    NSLayoutConstraint *fullTextField = [NSLayoutConstraint constraintWithItem:self.passwordTextField attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.userIdTextField attribute:NSLayoutAttributeTrailing multiplier:1.0f constant:0.0f]; 
    NSLayoutConstraint *cutTextField = [NSLayoutConstraint constraintWithItem:self.passwordTextField attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.userIdTextField attribute:NSLayoutAttributeTrailing multiplier:1.0f constant:-60.0f]; 

    if ([self isOnepasswordAvailable]) { 
    self.onepasswordButton.alpha = 1.0f; 
    [self.view removeConstraint:fullTextField]; //Invalid statement 
    [self.view addConstraint:cutTextField]; 
    } else { 
    self.onepasswordButton.alpha = 0.0f; 
    [self.view addConstraint:fullTextField]; 
    [self.view updateConstraints]; 
    } 

    [self.view setNeedsUpdateConstraints]; 
    [self.view layoutIfNeeded]; 
} 

У вас есть недопустимый оператор. - updateUIOnePassword() получает вызванное fullTextField не добавлено как constrain и его просто распределение.

означает, что вы пытаетесь удалить объект, который не в массиве (массив ограничений)

Теперь мое предложение, сделать экземпляр уровня класса cutTextField и fullTextField добавить их только один раз.

, когда она не нужна

[fullTextField setActive:NO];

Когда вам нужно изменить

[fullTextField setActive:YES]; //if already set to NO 
[fullTextField setConstant:100]; 
Смежные вопросы