web-dev-qa-db-ja.com

IBNSLayoutConstraintという名前のクラスをインスタンス化できませんでした

XCode6ベータ版を使用して、Swiftを試しています。 View Controllerに自動レイアウト制約を設定すると、アプリが次のエラーでクラッシュします:Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named IBNSLayoutConstraint'

69
zbrox

実行時に削除されるIBOutletに制約を設定したため、このエラーが発生しています。これは、Interface Builderで制約をプレースホルダーに設定すると発生します。制約は削除されているため、アーカイブを解除しようとすると、それができないというエラーがスローされます。

これを修正するには2つの方法があります。

方法1

  1. ストーリーボードを右クリックし、[名前を付けて開く]> [ソースコード]
  2. 開かれたストーリーボードxmlで、placeholder="YES"
  3. 実行時に削除されるように設定されている制約があります。制約からプレースホルダー属性を削除し、保存して閉じます。
  4. アプリを実行すると、問題が修正されます。

方法2

  1. Interface Builderで問題の原因となっている制約を見つけます。 GUIの[プレースホルダー]オプションをオフにします。これは、クラッシュの原因となっているViewControllerのIBOutletに設定されている制約の1つである必要があります。

Interface Builder attribute editor showing the Placeholder option checked.

これは次のようになります。

Interface Builder attribute editor showing the Placeholder option unchecked.

代替案

実際に制約をプレースホルダーにしたい場合、参照しているアウトレットを削除する必要があります。これを行うには、プレースホルダーにしたい制約を選択します。次に、接続インスペクター(右端にある(->)のようなボタン)を開き、その制約に存在する可能性のある参照アウトレットを削除します。

198
Sandy Chapman

私は今、同じ問題を抱えていて、次のことがうまくいきました。

私は自分のアプリの作業バージョンをApp Storeにリリースし、数日後にUITabBarControllerのタブをタップしてエラーでクラッシュしました:

Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named IBNSLayoutConstraint'

知っているプレースホルダーレイアウト制約や、定義されるべきではない制約アウトレットはありませんでした。

私にとっての解決策は、サイズクラスを単にオフにして、iPhoneのサイズクラスデータを保持することでした(アプリはiPhone専用です)。これは、サイズクラスで見逃していたものをすべて削除したに違いありません。サイズクラスが必要なため、それらを再び有効にすると、アプリが再び動作しました。

6
Philip Moore

これは必ずしも制約の問題とは限りません。私にとっては、レイアウトに適用されているサイズクラスの「インストール済み」をチェックしていないことが原因でした。こちらを参照してください install must be checked

4
abinop

サイズクラスの使用に問題がありました。ストーリーボードプロパティからそのオプションを無効にし、自動レイアウトのみを使用しました。アプリはiPhoneのみなので、それほど大きな問題ではありませんでした。

1
zbrox

最終的に私に起こったのは、Interface Builder内でサブビューをカットして別のxibにコピーしたことです。これにより、元のxib Interface Builderのサブビューがグレー表示されたままになりました。サブビューを元の場所から削除した後(選択して削除することにより)。エラーを取り除くことができました。

1
wilforeal

「自動レイアウトを使用」と呼ばれるインスペクタの「インスペクタを表示」の下にある制約を使用しないxibファイルを選択すると、インスペクタウィンドウにオプションがあります。

0
iPatel

Stackoverflowの別の場所で見つかったソリューションを使用して、スクロールビューに埋め込まれたピッカーコントロールが適切に機能するように、スクロールビューを変更しました。私の新しいストーリーボードは、単にこれらの属性をスクロールビューに追加しましたが、それは私には問題ないと思われました。

     delaysContentTouches="NO" canCancelContentTouches="NO"

しかし、さらに、ストーリーボードで別のシーンの次の新しいフラグメントを見ました。

                    <variation key="default">
                        <mask key="subviews">
                            <exclude reference="86H-aM-wei"/>
                        </mask>
                    </variation>

どこから来たのか分かりません。開発マシンですべてが機能しているように見えたため、最初は無視しました。しかし、ビルドがリリースとしてビルドされ、テストされると、クラッシュしました。そのスプリアス(?)フラグメントを削除すると、クラッシュが修正され、他に影響を与えることはないようです。

0
Andy Weinstein

カスタムUICollectionViewCellにボタンがあり、そのクラスのIBOutletsとしていくつかの制約があったときに、この問題が発生しました。セルから親View Controllerにボタンを移動しましたが、IBOutletsはまだセル内で参照されていましたが、実際にはセル上に存在しなかったため、すべてが爆発しました。それらのIBOutletsを削除するだけで、すべて正常に機能しました!

0
CMash