NSLayoutConstraintsの配列を作成してからアレイからすべてを一度にアクティブにするときに同じ問題が発生しました。
ビューから離れたところに戻ってきたときに戻ってくると、ビューが別のメモリー割り当てに割り当てられ、Bad Access Errorが発生することがあります。
ここで何が起こりますか。新しい制約は、ビューがロードされるたびに(配列を追加して、.viewDidLoad()
関数から、またはビューが再び表示されるたびに読み込まれる同様の関数からアクティブにすると仮定して)配列に追加されます。
アレイから離れて移動すると、アレイ自体が空にならず、古い制約もアレイに残ります。ビューに戻って制約をアクティブにしようとすると、システムは古い制約をもう一度アクティブにしようとします(制約が参照しているビューが含まれていないメモリを参照しています)。
これを修正するには、新しい制約を追加する前に、アレイ上で.RemoveAll()
を呼び出してください。これにより、古い制約がすべて削除され、システムはそれらをアクティブにしようとしません。
例を示します。
var initialConstraints = [NSLayoutConstraint]()
override func viewDidLoad() {
super.viewDidLoad()
// Empty the array once the view loads
initialConstraints.removeAll()
// Add your constraints like normal
initialConstraints.append(...)
// Activate your constraints once you've added them to the array (like normal)
NSLayoutConstraint.activate(initialConstraints)
}
これは役に立ちます。
これは基本的には問題ありません(下の関連のない警告を参照)。わたしにはできる。この 'addConstraints'はどこで呼びますか?明らかに、それは 'UIView'サブクラスになければなりませんが、正確にこれをやっているのはどこですか?要するに、[MCVE](http://stackoverflow.com/help/mcve)が必要です。私はあなたがここで提供したものに基づいて問題を再現することはできません。 – Rob
無関係で、一般的に 'options:[]'と言います。 'NSLayoutFormatOptions'は' OptionSet'で、空のセットは '[]'です。実際、 'constraints'メソッドでは' options'パラメータは省略可能で、 '[]'にデフォルト設定されていますので、 'options:[]'も省略することもできます。 – Rob