2016-05-11 4 views
0

私はUITextFiledのiOS:アップデートの制約をプログラム

- (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が先頭でTRUEのとき、私はOPのアプリとisOnepasswordAvailableを削除するだけでなく、再びFALSE作品になった後、それは、正常に動作しますしかし、私がisOnepasswordAvailableに再度入力するとき、idがTRUEになると、制約はもううまく機能せず、私はconsolleにいくつかの警告を出します。 あなたはその理由を知っていますか?私は常に制約をIBOutletを持つことを好むものの

おかげで

答えて

0

、あなたは私が気づいた問題のこと:)

カップル、

のための正当な理由がなければならないと信じて、プログラムで制約が作成されました

1>両方の制約をチェックしましたが、その制約が変わるのは定数値だけです。私はあなたが2つの異なる制約を作成し、条件に基づいてそれらを追加して削除する必要はないと信じています。非常に複雑に見えます。

あなたは

@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で指定されたプロパティを持つことができます>これは、仕事をする必要があります

- (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]; 
} 

の方法updateUIOnePasswordを更新:)見てくださいバディ:)

+0

私は同じ制約を更新したい場合、これは良いですが、私は制約を変更する場合に変更する必要がある場合は、あなたがそれ

[fullTextField setActive:NO];

必要はありません。 ?それを削除し、別の別のものを追加しますか? – CrazyDev

+0

私はバディを理解しています:)しかし、あなたの質問では、削除して追加していた2つの制約は定数値にしか違いがありませんでした:)この場合、制約を追加したり削除したりするのをやめてください: –

+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は制約として追加されておらず、その割り当てにすぎません。今、私の提案は、あなたが配列に存在しないオブジェクト(制約のアレイ)

を削除しようとしているという意味

は、cutTextFieldfullTextFieldのクラスレベルのインスタンスは一度だけそれらを追加してください。

あなたは

[fullTextField setActive:YES]; //if already set to NO 
[fullTextField setConstant:100]; 
関連する問題