Mặc dù Interface Builder nhận thức được a MyClass
, tôi vẫn gặp lỗi khi khởi động ứng dụng.
Điều này xảy ra khi MyClass
là một phần của thư viện và không xảy ra nếu tôi biên dịch lớp trực tiếp trong mục tiêu ứng dụng.
Mặc dù Interface Builder nhận thức được a MyClass
, tôi vẫn gặp lỗi khi khởi động ứng dụng.
Điều này xảy ra khi MyClass
là một phần của thư viện và không xảy ra nếu tôi biên dịch lớp trực tiếp trong mục tiêu ứng dụng.
Câu trả lời:
Mặc dù có lỗi " Lớp MyClass không xác định trong tệp Trình tạo giao diện. " Được in khi chạy, nhưng vấn đề này không liên quan gì đến Trình tạo giao diện, mà là với trình liên kết, không liên kết một lớp vì không có mã nào sử dụng trực tiếp.
Khi dữ liệu .nib (được biên dịch từ .xib) được tải khi chạy, MyClass
được tham chiếu bằng chuỗi, nhưng trình liên kết không phân tích chức năng mã, chỉ tồn tại mã, vì vậy nó không biết điều đó. Vì không có tệp nguồn nào khác tham chiếu lớp đó, trình liên kết tối ưu hóa nó khỏi sự tồn tại khi thực hiện. Vì vậy, khi mã của Apple cố gắng tải một lớp như vậy, nó không thể tìm thấy mã được liên kết với nó và in cảnh báo.
Theo mặc định, các mục tiêu Objective-C sẽ có các -all_load -ObjC
cờ được đặt theo mặc định, sẽ giữ tất cả các biểu tượng. Nhưng tôi đã bắt đầu với một mục tiêu C ++ và không có điều đó. Tuy nhiên, tôi đã tìm ra một cách xung quanh điều này, giúp cho trình liên kết tích cực.
Bản hack mà tôi đang sử dụng ban đầu là thêm một thói quen tĩnh như sau:
+(void)_keepAtLinkTime;
không có gì, nhưng tôi sẽ gọi một lần, chẳng hạn như:
int main( int argc, char** argv )
{
[MyClass _keepAtLinkTime];
// Your code.
}
Điều này sẽ buộc trình liên kết giữ toàn bộ lớp và lỗi sẽ biến mất.
Như jlstrecker đã chỉ ra trong các bình luận, chúng tôi không thực sự cần thêm một _keepAtLinkTime
phương thức. Chỉ cần gọi một cái hiện có, chẳng hạn như:
[MyClass class];
thực hiện các mẹo (miễn là bạn xuất phát từ một NSObject
).
Tất nhiên, bạn có thể gọi đây là bất kỳ vị trí nào trong mã của bạn. Tôi đoán nó thậm chí có thể là mã không thể truy cập. Ý tưởng là đánh lừa người liên kết nghĩ rằng nó MyClass
được sử dụng ở đâu đó để nó không quá tích cực trong việc tối ưu hóa nó.
Định nghĩa nhanh về quan điểm. Hãy chắc chắn để ghi đè init(coder aDecoder: NSCoder)
. Định nghĩa Objective-C của bộ điều khiển xem. Và, một ngòi trong cây lê.
Thêm Tên Mô-đun vào thanh tra chi tiết Nib nơi bạn chọn lớp.
MyClass
. Chỉ cần gọi một phương thức mà nó kế thừa từ NSObject
, như +class
.
MyClass.m
trong phần Thành viên mục tiêu của Trình kiểm tra tệp.
Tôi đã sửa lỗi này theo dòng những gì Laura đề xuất nhưng tôi không cần tạo lại các tập tin.
Sử dụng XCode 4, trong Trình điều hướng dự án , chọn tệp .m chứa lớp mà nó đang phàn nàn về
Đi đến Xem-> Tiện ích-> Hiển thị Trình kiểm tra tệp
(phần này sẽ hiển thị Trình kiểm tra tệp ở bên phải, với thông tin .m-file đó)
Mở phần Thành viên mục tiêu và đảm bảo rằng mục tiêu của bạn được chọn cho tệp .m này
Khi tôi thêm tệp .m của mình vào dự án của mình, nó đã không thêm nó vào mục tiêu mặc định của tôi vì một số lý do và điều đó khiến tôi gặp phải lỗi mà bạn đã đề cập.
Điều này thực sự không liên quan gì đến Trình tạo giao diện, điều đang xảy ra ở đây là các biểu tượng không được tải từ thư viện tĩnh của bạn bằng Xcode. Để giải quyết vấn đề này, bạn cần thêm các -all_load -ObjC
cờ vào Other Linker Flags
khóa Cài đặt bản dựng Dự án (và có thể là Mục tiêu).
Vì Objective-C chỉ tạo một ký hiệu cho mỗi lớp, chúng ta phải buộc trình liên kết tải các thành viên của lớp bằng cách sử dụng cờ -ObjC và chúng ta cũng phải buộc bao gồm tất cả các đối tượng của mình từ thư viện tĩnh bằng cách thêm -all_load
cờ liên kết. Nếu bạn bỏ qua các cờ này sớm hay muộn, bạn sẽ gặp phải lỗi unrecognized selector
hoặc gặp các ngoại lệ khác, chẳng hạn như các cờ bạn đã quan sát ở đây.
-ObjC
một mình cờ đã sửa nó trong trường hợp của tôi.
-ObjC
là đủ tốt để khắc phục vấn đề.
Tôi đã gặp vấn đề này ngày hôm nay khi sử dụng Swift.
Tôi đổi một lớp Model.h + Model.m
thành a Model.swift
. Đối tượng này đã được sử dụng trong Trình tạo giao diện với class = Model
.
Ngay khi tôi thay thế đối tượng, lớp không thể tải được nữa.
Điều tôi phải làm là thay đổi tham chiếu lớp trong IB từ:
Class = Model
Module =
đến
Class = Model
Module = <TARGETNAME>
Bạn sẽ tìm thấy <TARGETNAME>
trong cài đặt xây dựng. Đó cũng là tên xuất hiện trong Swift-Header được tạo của bạn:#import "TARGETNAME-Swift.h"
Module
cái tên đã ở ngay đó. Đó là tên của ứng dụng của tôi.
Chuyển đến "ProjectName", nhấp vào nó và sau đó chuyển đến tab "Xây dựng giai đoạn", sau đó nhấp vào "nguồn biên dịch", sau đó nhấp vào nút "+", một cửa sổ sẽ xuất hiện, chọn "MyClass. m "tập tin và sau đó nhấp vào" thêm ",
Xây dựng dự án và chạy nó, vấn đề chắc chắn sẽ được giải quyết
Đó là sự cố bộ đệm Xcode4, chỉ cần xóa tất cả các thư mục trong / Users / your_user / Library / Application Support / iPhone Simulator / 4.3 / Application /
Ngoài ra nếu bạn có cùng một vấn đề kiểm tra trên iPhone, hãy xóa ứng dụng cũ trước khi chạy nó ...
Chúc may mắn. Pascual
Đôi khi IBuilder bỏ lỡ customModule="AppName" customModuleProvider="target"
Để khắc phục, hãy mở bảng phân cảnh dưới dạng mã nguồn và thay thế dòng này:
<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass"
sceneMemberID="viewController">
đến đây:
<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass"
customModule="AppName" customModuleProvider="target" sceneMemberID="viewController">
customModule="MyFrameworkName"
. Lớn +10
Trường hợp của tôi - Cố gắng sử dụng Class từ khung nhanh chóng trong dự án mục tiêu c của tôi, tôi đã gặp lỗi này. Giải pháp là thêm Mô-đun (khung nhanh) của lớp trong Trình tạo giao diện / Bảng phân cảnh như dưới đây. Không có gì khác
Chuyển đến Xây dựng giai đoạn-> Biên dịch nguồn và thêm tệp .m mới của bạn.
Trong trường hợp của tôi, nó đã hiển thị một lỗi cho một lớp thậm chí không tồn tại! Tôi nghi ngờ đó là một cái gì đó đã bị hỏng trong tập tin bảng phân cảnh. Nếu bạn không nhận ra tệp lớp trong lỗi, hãy thử điều này:
1) mở dự án của bạn trong cao siêu hoặc một biên tập viên tốt khác. Tìm kiếm các lớp được tham khảo. 2) loại bỏ toàn bộ bit nói
customClass="UnrecognizedClassName"
3) lưu nó. 4) quay trở lại xcode và dọn dẹp dự án, và thử chạy nó ngay bây giờ.
đã làm cho tôi.
customClass="MyCla"
). Thay vì xóa bài tập lớp tùy chỉnh, tôi nên thận trọng khi chỉ đưa vào lớp tôi định sử dụng ở vị trí đầu tiên :)
Tôi chỉ muốn thêm câu trả lời này vì hầu hết các câu trả lời ở đây đều cho rằng lớp thực sự tồn tại .. chỉ là trình liên kết / trình biên dịch quá ngu ngốc để xem nó .. vì vậy các câu trả lời xoay quanh việc cảnh báo cho trình liên kết về sự tồn tại của lớp hoặc tạo một hack để 'buộc' tồn tại nó ..
vấn đề của tôi xảy ra khi thông báo này thực sự đang nói về một lớp không tồn tại .. vì vậy một ví dụ sẽ là tôi quay trở lại một bản sửa đổi git cũ không có kiến thức về một lớp nào đó .. tuy nhiên trình biên dịch phàn nàn rằng lớp đã nói không ' t tồn tại ..
giải pháp?
bạn nên đi sau đó
Cách tốt nhất để xóa lỗi là: 1) Chọn Tệp lớp (.m) 2) Trong " Thành viên mục tiêu ", "kiểm tra" mục nhập tên dự án
Tôi đã sửa lỗi này bằng cách sao chép văn bản từ class.h và .m của tôi, xóa các tệp lớp đó khỏi dự án và tạo các tệp class.h và .m mới có cùng tên bằng cách sử dụng "Thêm tệp". Sau đó, tôi dán mã trở lại vào các tệp mới và mọi thứ đều hoạt động tốt. Bằng cách nào đó các tệp không được liên kết chính xác khi chúng được tạo. Tôi không cần sử dụng bất kỳ cờ liên kết nào sau đó.
Tôi đã sửa lỗi này, tôi đã quên thêm đoạn mã sau vào tệp .m của mình:
@implementation MyTableViewCell
@end
Vì vậy, nó đã được gây ra bởi vì tôi đã tạo một trình giữ chỗ @interface cho ô bảng của mình, có kết nối với một phần tử trong tệp .xib, nhưng có một lỗi trong Trình tạo giao diện trong đó nếu không có @im THỰCation được chỉ định cho một lớp, nó không thể tìm thấy nó.
Tôi đã trải qua tất cả các bước từ các diễn đàn khác để xem .xib là nguồn và xem MyTableViewCell mặc dù tôi đã nhận xét nó ra khỏi mã của mình. Tôi đã thử đặt lại trình giả lập. Tôi thậm chí đã thử chia tất cả các lớp của mình thành các tệp riêng biệt có tên giống như các giao diện, nhưng không có gì hoạt động cho đến khi này.
Theo kinh nghiệm của tôi, không có vấn đề gì nếu tên của các tệp .h / .m khác với tên của @interface. Tôi có một số tệp chứa nhiều hơn một @interface và chúng hoạt động tốt.
PPS Tôi có một lời giải thích chi tiết hơn về lý do tại sao UITableViewCell và UICollectionViewCell gây ra lỗi này tại https://stackoverflow.com/a/22797318/539149 cùng với cách tiết lộ nó tại thời điểm biên dịch bằng cách sử dụng registerClass: forCellWithReuseIdent :.
Điều này xảy ra vì .xib đã có một liên kết cũ đến Đại biểu ứng dụng cũ không còn tồn tại nữa. Tôi đã sửa nó như vậy:
Tôi đã thử điều này và các câu trả lời khác được liệt kê trên trang web này, không có câu trả lời nào cho tôi. Nhận xét này (từ http://www.iphencedevsdk.com/forum/iphone-sdk-development/43330-unknown- class-interface-build-file.html ) đã giúp:
Sau khi tìm kiếm và tìm kiếm và tìm kiếm, cuối cùng tôi đã phát hiện ra tên của lớp bị xóa này ẩn trong một tệp. Tôi đã phải mở các tệp xây dựng giao diện bằng mã X, bằng cách nhấp chuột phải vào chúng và chọn 'xem là mã nguồn'. Sau đó tìm kiếm nó đã đưa ra
<object class="NSMutableArray" key="dict.values"> <bool key="EncodedWithXMLCoder">YES</bool> <string>com.apple.InterfaceBuilder.IBCocoaTouchP lu gin</string> <string>*this was the class name*</string>
Chỉ đơn giản là xóa dòng cuối cùng không sửa nó một cách đáng tiếc, phàn nàn rằng có số lượng mục sai trong tệp. Bạn cần loại bỏ dòng tương ứng trong phần của dòng trên nó, trong đó đề cập đến CustomClass
.
Trong trường hợp của tôi, tôi có XCode6, tệp .m lớp được chỉ định kết thúc ở vị trí sai trong giai đoạn xây dựng - Đáng lẽ nó phải nằm dưới Nguồn biên dịch , nhưng cuối cùng lại nằm trong
Không chỉ trong cài đặt dự án, mà trong cài đặt Target, bạn cũng phải thêm cờ -all_load -ObjC ..
Core-Plot: Lớp CPLayerhostingView không xác định trong tệp Trình tạo giao diện
Vấn đề này dường như không bị lỗi thời.
Tôi gặp vấn đề tương tự với Xcode 8 và đã giải quyết nó tương tự như smilebot :
Mở tệp bảng phân cảnh của bạn dưới dạng "Mã nguồn" trong Xcode:
Tìm kiếm lớp đang được tham chiếu & xóa toàn bộ bit có nội dung
customClass = "UnrecognizedClassName"
Tôi đã có 'favourites lớp không xác địnhButton trong tệp Trình tạo giao diện' và theo dõi nó đến một cảnh trong truyện trong đó nút được đề cập có một lớp tùy chỉnh "favouritesButton" trong trường Lớp ở đầu Trình kiểm tra danh tính. Tôi có nghĩa là đặt giá trị đó trong trường tiếp theo: Nhãn danh tính.
Thay đổi điều này thành "UIButton" đã giải quyết vấn đề.
Tôi gặp phải điều này trong Swift.
Di chuyển tệp .xib vào thư mục Base.lproj của dự án đã thoát khỏi lỗi này.
Tôi đã gặp lỗi này ngay hôm nay khi chuyển đổi ứng dụng aaLuminate của mình sang Universal theo Xcode 4. Ứng dụng này dựa trên mẫu tiện ích và ban đầu được xây dựng theo Xcode 3.
Để tiết kiệm thời gian, tôi đã sao chép Chế độ xem chính của iPhone và Flipside sang tên thích hợp trên ứng dụng Universal. Tôi gặp phải lỗi "Không xác định lớp x trong tệp Trình tạo giao diện". Trong trường hợp của tôi, nó không là gì trong các tệp hoặc mục tiêu XIB.
Tôi cũng đã sao chép tệp aaLuminate-Info.plist vì những lý do khác - cái này có một khóa cũ "Tên cơ sở tệp nib chính" được đặt thành MainWindow.
Ngay sau khi tôi xóa khóa này, nó đã khắc phục vấn đề!
Trong trường hợp của tôi, tôi đã gặp lỗi này vì tôi đã cố lưu một số công việc bằng cách tạo một dự án mới và sau đó xóa một số tệp nguồn và sao chép qua các tệp nguồn cùng tên khỏi dự án làm việc. Tôi cũng đã sao chép tệp MainStoryBoard đang tìm kiếm RootViewControll của mình. Tuy nhiên, khi tôi đã xóa RootViewControll gốc và sau đó được thêm vào RootViewControll từ sản phẩm trước đó, rõ ràng thao tác Thêm tệp không thể "kiểm tra" hộp đích như được đề xuất ở trên. Bằng cách chỉ đơn thuần là xóa tất cả các tệp ".m" của newley và đảm bảo rằng hộp thành viên đích đã được chọn, tất cả đều ổn. Tôi nghĩ những gì đã xảy ra là tệp bảng phân cảnh đang tìm kiếm một lớp đã bị "loại trừ" khỏi liên kết vì tư cách thành viên mục tiêu không được kiểm tra. Đảm bảo rằng các tệp cần thiết cho mục tiêu được chỉ định trong tư cách thành viên mục tiêu trong trình kiểm tra tệp đã thực hiện thủ thuật. Cảm ơn Pat! (xem ở trên)
Trong trường hợp của tôi, đó là vì tôi đã khai báo một lớp con của một lớp con của một ô UITableView trong tệp .h (khai báo của cả hai lớp con đều trong cùng một tệp .h), nhưng đã quên thực hiện một triển khai trống của lớp con thứ hai đó trong tập tin .m.
đừng quên thực hiện bất kỳ lớp con nào của lớp con bạn khai báo trong tệp .h! Nghe có vẻ đơn giản, nhưng dễ quên vì Xcode sẽ làm điều này cho bạn nếu bạn đang làm việc với một lớp trên mỗi tệp .h / .m.
Tôi đã có "RateView lớp không xác định trong Trình tạo giao diện" trong đó RateView là một lớp con của UIView. Tôi đã thả một UIView vào cảnh Storyboard của mình và thay đổi trường lớp Tùy chỉnh thành RateView. Tuy nhiên, lỗi này đã xuất hiện.
Để gỡ lỗi, tôi đã thay đổi tên lớp của mình thành RateView2 và thay đổi tất cả các tham chiếu cho phù hợp ngoại trừ trường lớp Tùy chỉnh của UIView. Thông báo lỗi vẫn xuất hiện như trước với RateView là lớp bị thiếu. Điều này xác nhận rằng thông báo lỗi có liên quan đến giá trị của trường lớp Tùy chỉnh. Tôi đã thay đổi giá trị này thành RateView2 và thông báo lỗi đã thay đổi thành "ClassView2 không xác định trong Trình tạo giao diện". Tiến độ của các loại.
Cuối cùng, tôi đã tự kiểm tra các tệp mã nguồn trong Trình kiểm tra tệp. Ở đó tôi phát hiện ra rằng tệp mã nguồn (mà tôi đã sao chép từ một hướng dẫn) không được liên kết với Target của tôi. Nói cách khác, nó không có Tư cách thành viên mục tiêu. Tôi đã chọn hộp làm cho tệp mã nguồn của lớp trở thành thành viên của ứng dụng đích và thông báo lỗi biến mất.
Trong trường hợp của tôi, tôi đã xóa một lớp có tên là "viewContoder" không nhận ra nó đã được chọn với trình kiểm tra danh tính của bảng phân cảnh (bên dưới 'Lớp tùy chỉnh' ở trên cùng).
Bạn chỉ cần chọn đúng lớp cho trình điều khiển xem trong trường Lớp tùy chỉnh của trình kiểm tra danh tính của bạn hoặc thêm một lớp mới vào dự án của bạn và chọn lớp đó làm Lớp tùy chỉnh của bạn.
Đã làm cho tôi!
Tôi đã thêm tệp Theo Giai đoạn Xây dựng trong Mục tiêu và vấn đề đã được giải quyết. Để biết các bước để thêm tệp, hãy xem câu trả lời của tôi tại:
Điều này khiến tôi phát điên một chút và không có gợi ý nào ở trên giúp tôi thoát khỏi lỗi này. May mắn thay, tôi chỉ có một đối tượng IB sử dụng lớp nên tôi chỉ xóa nó và thêm nó trở lại với cùng một lớp được chỉ định. Lỗi đã biến mất ...