Używam XCode6 beta i wypróbowuję Swift. Kiedy umieszczam pewne ograniczenia automatycznego układu w kontrolerze widoku, aplikacja ulega awarii z następującym błędem:
Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named IBNSLayoutConstraint'
81
Odpowiedzi:
Otrzymujesz ten błąd, ponieważ ustawiłeś ograniczenie dla IBOutlet, które jest usuwane w czasie wykonywania. Dzieje się tak, gdy ustawisz ograniczenie jako symbol zastępczy w programie Interface Builder. Ponieważ ograniczenie jest usuwane, gdy przechodzi do jego przywrócenia z archiwum, generuje błąd z informacją, że nie może tego zrobić.
Istnieją dwa sposoby, aby to poprawić.
Metoda 1
placeholder="YES"
.Metoda 2
Tak to powinno wyglądać:
Alternatywny
Zakładając, że faktycznie chcesz, aby ograniczenie było symbolem zastępczym, musisz usunąć wszelkie punkty odniesienia. Aby to zrobić, wybierz ograniczenie, które ma być symbolem zastępczym. Następnie otwórz inspektora połączeń (przycisk znajdujący się najdalej po prawej stronie, który wygląda tak: (->)), a następnie usuń wszelkie odnośniki, które mogą istnieć w tym ograniczeniu.
źródło
Miałem teraz ten sam problem, a poniższe zadziałały.
Udostępniłem działającą wersję mojej aplikacji w App Store, wróciłem do pracy nad nią ponownie kilka dni później, dotykając jednej z moich kart w UITabBarController, awaria uległa awarii:
Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named IBNSLayoutConstraint'
Nie miałem żadnych ograniczeń układu zastępczego, o których wiedziałem, ani gniazd, które nie powinny być zdefiniowane.
Rozwiązaniem dla mnie było po prostu wyłączenie klas rozmiarów i zachowanie danych klas rozmiaru dla iPhone'a (aplikacja jest tylko dla iPhone'a). To musiało usunąć wszystko, co przegapiłem w klasach wielkości. Chcę klas wielkości, więc włączyłem je ponownie i aplikacja znów działała.
źródło
Niekoniecznie musi to być problem z ograniczeniami. U mnie było to spowodowane tym, że nie zaznaczyłem „Zainstalowano” dla klasy rozmiaru, która dotyczy mojego układu, patrz tutaj
źródło
Wystąpił problem z użyciem klas wielkości. Wyłączyłem tę opcję we właściwościach scenorysu i używam tylko układu automatycznego. Nie był to taki duży problem, ponieważ aplikacja jest przeznaczona tylko na iPhone'a.
źródło
W końcu przydarzyło mi się to, że wyciąłem podwidok wewnątrz Interface Builder, aby skopiować go do innego xib. To pozostawiło widok podrzędny w oryginalnym konstruktorze interfejsu XIB z wyszarzeniem. Po usunięciu widoku podrzędnego z jego pierwotnego miejsca (poprzez zaznaczenie i usunięcie). Udało mi się pozbyć błędu.
źródło
W oknie inspektora, gdy zaznaczysz plik xib, dostępna jest opcja, która nie będzie używać ograniczeń pod „Pokaż plik inspektora” w inspektorze o nazwie „Użyj autoukładu”.
źródło
Dokonałem zmiany w widoku przewijania, aby umożliwić poprawne działanie kontrolek selektora osadzonych w nim przy użyciu rozwiązania, które znalazłem w innym miejscu w Stackoverflow. Mój nowy storyboard po prostu dodał te atrybuty do widoku przewijania, co wydawało mi się w porządku.
delaysContentTouches="NO" canCancelContentTouches="NO"
Ale dodatkowo zobaczyłem w moim storyboardzie w innej scenie następujący nowy fragment:
<variation key="default"> <mask key="subviews"> <exclude reference="86H-aM-wei"/> </mask> </variation>
Nie mam pojęcia, skąd się wzięło. Na początku zignorowałem to, ponieważ wszystko wydawało się działać na mojej maszynie deweloperskiej. Ale kiedy kompilacja została zbudowana jako wersja Release i przetestowana, nastąpiła awaria. Usunięcie tego fałszywego (?) Fragmentu naprawiło awarię i nie miało wpływu na nic innego.
źródło
Miałem ten problem, gdy miałem przycisk w niestandardowym UICollectionViewCell i miałem niektóre z jego ograniczeń jako IBOutlets w tej klasie. Przeniosłem przycisk z komórki do nadrzędnego kontrolera widoku, a IBOutlets nadal były przywoływane w komórce, ale tak naprawdę nie istniały w komórce, więc wszystko wysadziłem. Wystarczyło usunąć te IBOutlety i wszystko znów działało dobrze!
źródło