2016-03-11 17 views
6

Tôi mất nửa ngày để tìm ra điều này và tôi không thể nhìn thấy một giải pháp thẳng về phía trước.Nơi đặt tệp .xib bên trong dự án khung công tác?

Tôi đã tạo Khung hình CocoaTouch cho iOS. Tôi có một số lớp học riêng và công cộng trong đó và tất cả đều hoạt động tốt. Các vấn đề là khi tôi thêm tập tin .xib bên trong khuôn khổ.

Bên trong khuôn khổ của tôi, tôi muốn nhanh chóng tập tin .xib và lỗi Tôi nhận được là:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </Users/dino/Library/Developer/CoreSimulator/Devices/FEDECDC2-D4EA-441E-B53B-329A5B3DFB7A/data/Containers/Bundle/Application/78CEC01F-4C36-4143-A7D6-DDE6CCAC801B/MyApp.app> (loaded)' with name 'NUInAppMessageView'' 

Tôi đã nghe nói rằng file .xib không thể được chứa bên trong thư viện tĩnh nhưng tôi nghĩ rằng họ nên được có thể được sử dụng bên trong khung công tác.

Mục tiêu khung của tôi chứa "Sao chép tài nguyên gói" từ trước và tệp .xib này được thêm tự động khi tôi tạo nó trong dự án khung.

enter image description here

Tôi đã đọc trên một vài nơi mà nguồn lực nên được bổ sung trong một riêng biệt. mục tiêu nhưng không có tùy chọn "nhóm" khi tạo mục tiêu mới và tôi tin rằng đây là mẫu cũ-thư viện-ngày cũ.

Đây là mã tôi đang sử dụng để khởi tạo quan điểm của tôi (bên trong khuôn khổ):

NSBundle * frameworkBundle = [NSBundle bundleForClass:[self class]]; // fine (not nil) 

NUInAppMessageView *view = [[frameworkBundle loadNibNamed:@"NUInAppMessageView" owner:self options:nil] firstObject]; // <-- CRASH 

tôi đã cố gắng để phá vỡ này thành một nhiều cuộc gọi phương pháp và hình dung rằng Nib chính nó là nhận được tạo ra:

UINib *nib = [UINib nibWithNibName:@"NUInAppMessageView" 
           bundle:frameworkBundle]; // fine (not nil) 
NSArray *objects = [nib instantiateWithOwner:self options:nil]; // <-- CRASH 

Tôi không còn ý tưởng nữa. Tôi đã thử với dự án sạch, xóa dữ liệu có nguồn gốc nhưng họ dường như không làm công việc.

Tôi có thiếu gì đó ở đây không?

+0

Tôi không biết bạn đang làm gì sai nên tôi đã tạo một dự án mẫu mà bạn có thể tải xuống và kiểm tra. Nó được viết bằng Swift nhưng điều đó không tạo ra nhiều khác biệt, đặc biệt. vì có rất ít mã. :) https://github.com/mattneub/FrameworkWithNib – matt

+0

Sự khác biệt rõ ràng duy nhất giữa mã của bạn và của tôi là tôi đã tải nib đó từ bên trong mã chính, chứ không phải từ bên trong mã khung, nhưng đó chỉ là một tai nạn; Nó không có Gì Thay đổi. Tôi chỉ viết lại nó để tôi tải nib từ bên trong mã khuôn khổ và nó hoạt động tốt quá. – matt

+0

@matt Tôi sẽ xóa mọi thứ và tạo .xib mới. Nó có thể là Xcode sai ở đâu đó với các thiết lập được lưu trữ. Cảm ơn bạn. – vale4674

Trả lời

5

Nơi đặt các tệp Nib trong khuôn khổ trong dự án iOS?

Bối cảnh câu trả lời của tôi:
Tôi đã cố gắng để xuất khẩu một số UITableView thực hiện có liên quan và nó có UITableViewCell.xib file đóng gói với nó. Và họ biến thành .nib tệp ở cuối! ;-) Và tôi đã đề cập đến các tập tin NIB như sau:

[[NSBundle mainBundle] loadNibNamed:customCellID owner:nil options:nil]; 

Giải thích:
Nhưng đây là điều tôi đã làm sai là, tôi xây dựng một Cocoa Touch Khung tĩnh và cố gắng sử dụng nó trong vòng Ứng dụng khác. Vì vậy, tại thời gian chạy những gì sẽ trở thành MainBundle? Chắc chắn việc triển khai UITableView của tôi đang cố gắng tìm ra tệp Nib cho customCellID trong gói chính của ứng dụng.

Trả lời:
Vì vậy, tôi thay đổi đoạn mã trên thực hiện UITableView của tôi như sau:

NSString *frameworkBundleId = @"com.randika.MyFrameworkBundleIDHere"; 
    NSBundle *resourcesBundle = [NSBundle bundleWithIdentifier:frameworkBundleId]; 

    customCell = (CustomTableViewCell *)[tableView dequeueReusableCellWithIdentifier:customCellID]; 
    if (customCell == nil) { 
     NSArray *nibs = [resourcesBundle loadNibNamed:emptyCellID owner:nil options:nil]; 
     customCell = [nibs objectAtIndex:0]; 
    } 

Và khuôn khổ tôi đã xây dựng ra khỏi thực hiện UITableView tôi không cung cấp cho các lỗi trên bao giờ trở lại! :-)

Hy vọng câu trả lời này có thể hữu ích cho ai đó ở đó!

Chúc mừng! :-)

+0

cảm ơn, nó đã làm việc cho chúng tôi – meronix

+2

Bạn lấy frameworkBundleId từ đâu? – gangelo

Các vấn đề liên quan