2017-01-11 7 views
0

Swiftの制約でisActive = falseを設定した後で、後でそれにアクセスしようとするとnilになることがありますが、必ずしもそうではありません。ある状況では、私は2つのView Controllerを持っていて、どちらもviewWillAppearの制約でisActiveをfalseに設定しましたが、一方のビューでは後で制約が利用でき、isActive = trueを設定でき、それ以外はnilでした。いつiOSが非アクティブな制約を取り除くのですか

この現象はどうなるでしょうか?私は、代わりに1または900のいずれかに優先順位を設定することで回避することができましたが、実際に何が実際に起こっているのかという疑問が残ります。

答えて

5

isActiveはあまり良いプロパティ名ではありません。この制約は実際には無効化されていません。はビュー階層からが削除されています。

ビューに制約への唯一の強い参照があった場合、制約は割り当てが解除され、再びアクティブにすることはできません。あなたは制約がメモリに保持されるようにしたい場合、あなたは強く、それを参照する必要があることを意味し

、例えば:

@IBOutlet var myConstraint: NSLayoutConstraint! 

ない

@IBOutlet weak var myConstraint: NSLayoutConstraint? 

あなたは強い参照を保持する場合

nilに設定しない限り、参照は決して nilに設定されません。

+0

私の制約はコードと配列で設定されているので、私はこれを知りませんでした。それでも私の教訓はこれでした。上院議員。 – dfd

+0

ああ、それはそれを説明します。ありがとう@スルタン! –

関連する問題