2009-11-01 18 views
18

Tôi đã tạo một thư viện tĩnh trong Xcode, mà tôi có thể sử dụng thành công trong các dự án khác. Tuy nhiên, với các tài nguyên như plists, tôi thấy tôi phải bao gồm bất kỳ plists tham chiếu trong thư viện của tôi trong dự án chính, nơi dự án được sử dụng.NSBundle, plist và các tài nguyên khác trong Thư viện tĩnh Obj-c

Trong dự án thư viện tĩnh của tôi, tôi có plist của tôi được bao gồm trong giai đoạn "Sao chép gói tài nguyên" của mục tiêu. Trong mã của tôi, đây là những gì tôi đang làm:

NSBundle *mainBundle = [NSBundle mainBundle]; 
NSString *filePath = [mainBundle pathForResource:@"MyClassParams" ofType:@"plist"]; 

NSMutableDictionary* params = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath]; 

Nếu tôi sử dụng mainBundle và MyClassParams.plist được bao gồm trong dự án chính, tất cả là tốt. Nếu MyClassParams.plist được bao gồm trong dự án thư viện, nó không hoạt động.

Trên giả định rằng [NSBundle mainBundle] đã được tham khảo các phương pháp tĩnh sai lầm khi sử dụng, tôi thay thế nó bằng:

NSBundle *mainBundle = [NSBundle bundleForClass:[MyClass class]]; 

này đã không làm việc một trong hai.

Vì vậy, có thể bao gồm một plist hoặc bất kỳ tài nguyên khác với một thư viện tĩnh - hoặc tôi phải bao gồm bất cứ điều gì tôi cần trong dự án nơi lib được sử dụng?

+0

Bắt đầu một tiền thưởng với câu hỏi - câu trả lời được chấp nhận vẫn chính xác như iOS 4.2? –

Trả lời

17

Thư viện tĩnh không có trong nhóm, khi chúng được liên kết vào một ứng dụng, chúng là một phần của gói ứng dụng đó. Trên iPhone, tất cả các mã bạn viết sẽ có hiệu lực trong mainBundle vì bạn không thể bao gồm các khung công tác nhúng.

Vì vậy, có, bạn cần sao chép tất cả các tài nguyên vào dự án mà bạn đang liên kết khung tĩnh vào.

+0

Cảm ơn bạn đã trả lời. – Vickram

12

Tôi biết bạn không thể đưa tệp tài nguyên vào thư viện tĩnh (đó là những gì mà khung làm). tôi sử dụng một giải pháp trong các dự án của tôi:

Bên trong tĩnh thư viện dự án "YYY":

  • tôi thêm một "Loadable Bundle" mục tiêu cho dự án thư viện tĩnh của tôi (Add Target, Cocoa, Loadable Bundle)
  • tôi thêm mục tiêu này như một sự phụ thuộc của thư viện mục tiêu tĩnh

Bên trong dự án chính:

  • Liên kết các libYYY.a
  • Thêm bó YYY.bundle để các tập tin nguồn sao chép

Bằng cách này, các file tài nguyên được sử dụng trong thư viện tĩnh không được quản lý trong dự án chính.Nói rằng tôi có một bức tranh foo.png trong thư viện tĩnh, tôi sử dụng

[UIImage imageNamed:@"YYY.bundle/foo.png"] 

Sau đó bạn có thể nhận được plist của bạn như thế này:

NSBundle *staticLibBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"YYY" ofType:@"bundle"]]; 
NSString *filePath = [staticLibBundle pathForResource:@"MyClassParams" ofType:@"plist"]; 

NSMutableDictionary *params = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath]; 

Dưới đây, hai ảnh chụp màn hình:

  • left: dự án thư viện tĩnh với mục tiêu gói có thể tải
  • phải: hiển thị nhị phân thư viện tĩnh được thêm vào "Liên kết nhị phân với thư viện" và gói tài nguyên được thêm vào "Sao chép tài nguyên gói".

Static library project Main project

+0

hi jilouc. Tôi đang mắc kẹt với bước cuối cùng. .những gì được sao chép tập tin tài nguyên? . plz giải thích – thndrkiss

+1

@thndrkiss Chỉ cần kéo và thả tệp bó vào bạn Tài nguyên (như bạn sẽ làm cho bất kỳ tệp tài nguyên nào khác) và thêm nó vào mục tiêu dự án của bạn. Tôi đã thêm ảnh chụp màn hình. – Jilouc

+0

cảm ơn bạn thân. .nó đã làm việc ! . . – thndrkiss

2

Tôi đi theo tất cả mọi thứ @Jilouc đề nghị, tuy nhiên, tôi có thể nhận được bó nhưng thất bại trong việc có được các file bên trong nó. Tôi đã thử cả hai cách (@"yyy.bundle/image" hoặc staticlib pathforresource...)

Sau đó, tôi đã sử dụng phương pháp bên dưới và hoạt động!

NSBundle *staticBundle = [NSBundle bundleWithPath:[[[NSBundle mainBundle]resourcePath] stringByAppendingPathComponent:@"yy.bundle"]]; 

NSString *filePath = [[jsBundle resourcePath]stringByAppendingPathComponent:fileName]; 

NSString* content = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:NULL]; 
Các vấn đề liên quan