Không thể khởi tạo lớp có tên IBNSLayoutConstraint


81

Tôi đang sử dụng XCode6 beta và dùng thử Swift. Khi tôi đặt một số ràng buộc bố cục tự động trong bộ điều khiển chế độ xem, ứng dụng gặp sự cố với lỗi sau: Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named IBNSLayoutConstraint'


Không có nhiều mã để đặt ở đây :) Bộ điều khiển chế độ xem là một UIViewController mới được tạo thông thường với một vài cửa hàng và viewDidLoad thông thường và didReceiveMemoryWarning. Và sau đó là các ràng buộc trong Trình tạo giao diện. Tôi đoán tôi có thể thêm mã bộ điều khiển chế độ xem ở đây.
zbrox

Câu trả lời:


220

Bạn gặp phải lỗi này vì bạn đã đặt một ràng buộc cho IBOutlet bị loại bỏ trong thời gian chạy. Điều này xảy ra khi bạn đặt ràng buộc là trình giữ chỗ trong Trình tạo giao diện. Vì ràng buộc bị loại bỏ, nên khi hủy lưu trữ nó, nó sẽ xuất hiện một lỗi nói rằng nó không thể làm như vậy.

Có hai cách để sửa lỗi này.

Phương pháp 1

  1. Nhấp chuột phải vào Bảng phân cảnh của bạn> Mở dưới dạng> Mã nguồn
  2. Trong xml bảng phân cảnh đã mở, hãy tìm kiếm placeholder="YES".
  3. Bạn sẽ tìm thấy các ràng buộc được thiết lập để loại bỏ trong thời gian chạy. Xóa thuộc tính trình giữ chỗ khỏi ràng buộc, lưu và đóng.
  4. Chạy ứng dụng và sự cố của bạn sẽ được khắc phục.

Phương pháp 2

  1. Tìm ràng buộc gây ra sự cố của bạn trong Trình tạo giao diện. Bỏ chọn tùy chọn Trình giữ chỗ trong GUI. Đây phải là một trong những ràng buộc được đặt thành IBOutlet trong ViewController gây ra sự cố của bạn.

Trình chỉnh sửa thuộc tính Trình tạo giao diện hiển thị tùy chọn Trình giữ chỗ đã được chọn.

Đây là những gì nó sẽ giống:

Trình chỉnh sửa thuộc tính Trình tạo giao diện hiển thị tùy chọn Trình giữ chỗ đã bỏ chọn.

Thay thế

Giả sử bạn thực sự muốn ràng buộc là một trình giữ chỗ, thì bạn sẽ cần phải xóa bất kỳ cửa hàng tham chiếu nào. Để làm điều này, hãy chọn ràng buộc mà bạn muốn làm trình giữ chỗ. Sau đó, mở trình kiểm tra kết nối (nút xa nhất bên phải trông giống như sau: (->)) và sau đó xóa bất kỳ cửa hàng tham chiếu nào có thể tồn tại trên ràng buộc đó.


1
Điều gì xảy ra nếu bạn muốn ràng buộc là một trình giữ chỗ? developer.apple.com/library/ios/documentation/UserExperience/…
Daniel Galasko

2
@DanielGalasko Nếu bạn muốn nó là một trình giữ chỗ, thì đừng gán nó cho IBOutlet.
Sandy Chapman

@SandyChapman Điều đó có ý nghĩa! Cảm ơn Sandy rất nhiều, bạn có thể đưa điều đó vào câu trả lời của mình để tôi có thể ủng hộ không?
Daniel Galasko

1
@DanielGalasko, Chắc chắn rồi. Đó là một điểm tốt, câu trả lời của tôi đã đưa ra giả định rằng bạn muốn có ràng buộc đối với IBOutlet.
Sandy Chapman

@SandyChapman: Có cách nào để tìm ra ràng buộc nào đang gây ra điều này không? Dự án của tôi quá lớn để có thể đi qua từng dự án và kết xuất ngăn xếp không được ghim trỏ ràng buộc nào. Ngoài ra, tôi đã cố gắng tìm trình giữ chỗ = "YES" nhưng không thể tìm thấy bất kỳ tệp nào trong xml.
EmbCoder

6

Tôi đã gặp vấn đề tương tự ngay bây giờ và những điều sau đây đã hiệu quả với tôi.

Tôi đã phát hành phiên bản ứng dụng đang hoạt động của mình lên App Store, sau đó vài ngày trở lại làm việc với ứng dụng đó, khi nhấn vào một tab của tôi trong UITabBarController, nó đã gặp lỗi:

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

Tôi không có bất kỳ ràng buộc nào về bố cục trình giữ chỗ mà tôi biết hoặc các cửa hàng ràng buộc không nên được xác định.

Giải pháp cho tôi là chỉ cần tắt các lớp kích thước và giữ lại dữ liệu lớp kích thước cho iPhone (Ứng dụng chỉ dành cho iPhone). Điều này chắc hẳn đã xóa bất cứ thứ gì tôi đã bỏ lỡ trong các lớp kích thước. Tôi muốn các lớp kích thước vì vậy tôi đã bật lại chúng và ứng dụng đã hoạt động trở lại.


Cảm ơn vì bài đăng của bạn! Tôi vừa trải qua điều tương tự, tôi không thay đổi bất kỳ điều gì trong ứng dụng của mình. Trong trường hợp của tôi, nó đã gặp sự cố khi tải 'UIPageViewController'. Tắt các lớp kích thước và cấp lại chúng đã giải quyết được lỗi.
nor0x

Cảm ơn bạn!! Trải nghiệm tương tự như nor0x. Rất lạ, nhưng rất tuyệt vời khi tìm ra giải pháp ở đây.
Andy Weinstein

4

Đây có thể không nhất thiết là một vấn đề hạn chế. Đối với tôi, nguyên nhân là do không chọn "Đã cài đặt" cho lớp kích thước đang áp dụng cho bố cục của tôi, hãy xem tại đâycài đặt phải được kiểm tra


1

Có một số vấn đề với việc sử dụng các lớp kích thước. Tôi đã tắt tùy chọn đó khỏi các thuộc tính của bảng phân cảnh và chỉ sử dụng bố cục tự động. Nó không phải là một vấn đề lớn vì ứng dụng chỉ dành cho iPhone.


Việc vô hiệu hóa "Size Classes" và chạy cũng đã sửa nó cho tôi. Sau đó tôi bật lại các lớp kích thước và nó vẫn hoạt động.
John Fowler

1

Điều cuối cùng xảy ra với tôi là tôi đã cắt một subview bên trong của Interface Builder để sao chép nó vào một xib khác. Điều này làm cho chế độ xem phụ trong trình tạo Giao diện xib ban đầu bị chuyển sang màu xám. Sau khi xóa chế độ xem phụ khỏi vị trí ban đầu (bằng cách chọn và xóa). Tôi đã có thể thoát khỏi lỗi.


0

Có một tùy chọn trong cửa sổ trình kiểm tra khi bạn chọn tệp xib sẽ không sử dụng các ràng buộc trong "Hiển thị tệp trình kiểm tra" trong trình kiểm tra được gọi là "Sử dụng tự động thanh toán".


Tôi biết về điều đó, nhưng tôi muốn sử dụng tự động thanh toán cho bảng phân cảnh đó.
zbrox


Cảm ơn. Tôi đã thử chơi với những thứ đó nhưng nó không thực sự hữu ích vì tôi cũng đang sử dụng các lớp kích thước. Nhưng tôi sẽ đọc qua điều này và xem liệu tôi có bỏ lỡ điều gì không. Cảm ơn một lần nữa.
zbrox

0

Tôi đã thực hiện thay đổi đối với chế độ xem cuộn để nó cho phép các điều khiển bộ chọn được nhúng trong đó hoạt động bình thường bằng cách sử dụng giải pháp mà tôi tìm thấy ở nơi khác trong Stackoverflow. Bảng phân cảnh mới của tôi chỉ đơn giản là thêm các thuộc tính này vào chế độ xem cuộn, điều này có vẻ ổn đối với tôi.

     delaysContentTouches="NO" canCancelContentTouches="NO"

Nhưng ngoài ra, tôi đã thấy trong bảng phân cảnh của mình ở một cảnh khác có đoạn mới sau:

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

Tôi không biết nó đến từ đâu. Lúc đầu, tôi bỏ qua nó vì mọi thứ dường như hoạt động tìm thấy trên máy phát triển của tôi. Nhưng khi bản dựng được xây dựng dưới dạng Phát hành và thử nghiệm, tôi đã gặp sự cố. Xóa đoạn giả (?) Đó đã khắc phục sự cố và dường như không ảnh hưởng đến bất kỳ điều gì khác.


0

Tôi đã gặp sự cố này khi tôi có một nút trong UICollectionViewCell tùy chỉnh và có một số ràng buộc của nó là IBOutlet trên lớp đó. Tôi đã di chuyển nút từ ô sang bộ điều khiển chế độ xem chính và các IBOutlet vẫn được tham chiếu trong ô nhưng không thực sự tồn tại trên ô nên đã làm nổ tung mọi thứ. Chỉ cần xóa các IBOutlet đó và mọi thứ hoạt động tốt trở lại!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.