2009-02-11 32 views
11

Tôi có một ứng dụng iPhone có các hương vị da khác nhau, với các tài sản và âm thanh nghệ thuật khác nhau, nhưng tất cả cùng một mã.Một nib, các tài sản khác nhau. Bó?

Tôi đã thiết lập mọi thứ với nhiều mục tiêu, nhưng vấn đề tôi gặp phải là phải có một tập hợp các tệp nib UIBuilder khác, một tệp cho mỗi lượt xem trên mỗi mục tiêu, được thiết lập để trỏ tới nghệ thuật chính xác cho mục tiêu đó.

Đây là một chút bực bội, bởi vì nếu tôi thay đổi một tệp nib, tôi phải tự thực hiện các thay đổi tương tự, cùng một kết nối, v.v. trong tất cả các tệp nib khác. Tôi cũng đặt tất cả các tài sản trong với tên khác nhau cho các giao diện khác nhau là tốt, vì vậy họ không va chạm trong dự án. Vì vậy, nếu tôi có mục tiêu A và B, tôi có a_main_menu.png, b_main_menu.png ... a_FooViewController.xib, b_FooViewController.xib ... vv

Có cách nào để làm cho một tập tin nib trỏ đến tài sản có cùng tên, nhưng đang ở trong ... umm, các gói khác nhau? đó là những gì một gói dành cho? Tôi có thể tưởng tượng sửa một cái gì đó như thế này trong mã của tôi (có lẽ tìm kiếm và thay thế A cho B trong nib trước khi tải nó thậm chí có thể đủ tốt), mặc dù tôi đã không thử nó, đó là xấu xí. Đây là một chiến lược có thể quản lý cho bộ ứng dụng đầu tiên của tôi (mặc dù tối ưu), nhưng khi nội dung của tôi trở nên phức tạp hơn, thật khó để giữ cho các tệp xây dựng của tôi được đồng bộ hóa, và nó không phải là một cách rất DRY làm việc. Có cách nào tốt hơn ngoài việc bỏ rơi uibuilder và tạo quan điểm của tôi trong mã? Nó sẽ là tốt đẹp nếu điều này làm việc ở cấp xcode/builder, do đó, người xây dựng sẽ tôn trọng mục tiêu hiện tại của tôi và hiển thị nghệ thuật cho mục tiêu đó trong khi tôi đang làm việc ... nhưng tôi có thể sống mà không có điều đó, như thể Tôi có thể chọn tập hợp nghệ thuật hiện tại vào thời gian chạy và tôi chỉ có thể làm việc với một bộ trong trình tạo. Tôi cũng có thể làm điều đó với một bộ ngòi bằng cách có một mục tiêu duy nhất và tự thay thế tất cả các nghệ thuật trước khi xây dựng, nhưng điều đó cũng không tốt lắm.

Điều tốt nhất là nếu tôi có thể kết hợp hai chiến lược - như thể tôi có một mục tiêu có một cái nhìn từ một vài cái mà chỉ cần được đặt ra khác ... nhưng đó là tùy chọn.

Tôi có đặt câu hỏi đúng không?

Cảm ơn!

Trả lời

1

Giả sử mỗi ứng dụng chỉ cần một skin cùng một lúc và bạn đang tạo nhiều ứng dụng với các chủ đề khác nhau, tôi sẽ tạo một nhánh trong điều khiển nguồn và sau đó thay thế các tài sản cần thiết. Bạn giữ một nhánh master với tất cả các tài sản mặc định và sau đó bạn hợp nhất các thay đổi mã từ master vào các nhánh của bạn, giữ mọi thứ đồng bộ.

Git làm việc này cực kỳ dễ dàng.

0

Tôi nghĩ tùy chọn tốt nhất là sử dụng thứ gì đó như git.

Nếu bạn sử dụng git, bạn có thể có nhánh chính chứa mã nguồn và logic chính và có nhánh phụ có bộ dữ liệu/hình ảnh khác nhau cho từng ứng dụng cụ thể của bạn. Trong giải pháp này, XCode thậm chí sẽ không biết chuyện gì đang diễn ra.

0

Tôi nghĩ đây là những gì viewDidLoad dành cho, để tùy chỉnh thêm, tại đây bạn có thể thay đổi đường dẫn hình ảnh.

5

Một cách để thực hiện việc này là di chuyển tất cả tác phẩm nghệ thuật của bạn thành một gói riêng biệt và tự động tải nó vào thời gian chạy (giống như "trình cắm phương tiện").

  • Tạo dự án riêng và chọn "Mac OS X/Framework & Thư viện/gói". Gọi nó là, media.bundle.

  • Chuyển tất cả tác phẩm nghệ thuật của bạn vào dự án này.

  • Để làm cho cuộc sống trở nên dễ dàng, hãy thêm bước "Chạy tập lệnh" bổ sung vào mục tiêu sao chép kết quả được tạo từ thư mục xây dựng sang thư mục con trong dự án chính của bạn. Để làm cho nó dễ dàng hơn, hãy thêm gói phương tiện như một dự án phụ thuộc vào dự án chính của bạn để nó được xây dựng lại tự động.

Trong dự án chính của bạn, bạn sẽ cần hai phương pháp này. Bạn có thể làm cho họ phương pháp tĩnh dưới một lớp BundleUtils:

+ (NSString *) bundleDirectoryFor:(NSString *) bundleName 
{ 
NSString* basePath = [[[NSBundle mainBundle] resourcePath] 
    stringByAppendingPathComponent:[NSString 
           stringWithFormat:@"%@.bundle", bundleName]]; 
return [[NSBundle bundleWithPath:basePath] resourcePath]; 
} 

+ (NSString *) resourceInBundle:(NSString *)bundleName 
         fileName:(NSString *)fileName 
{ 
NSString *bundlePath = [BundleUtils bundleDirectoryFor:bundleName]; 
return [bundlePath stringByAppendingPathComponent:fileName]; 
} 

Bây giờ mỗi khi bạn muốn truy cập vào tác phẩm nghệ thuật trong nhóm của mình, bạn có thể lấy đường dẫn đến tập tin đúng với:

NSString* imageFile = [BundleUtils resourceInBundle:@"media.bundle" 
             fileName:@"image.jpg"]; 
UIImage* image = [UIImage imageNamed:imageFile]; 

Rõ ràng, tên "media.bundle" có thể được thay thế trong thời gian chạy cho một phiên bản khác để bạn có thể chuyển sang các gói khác dựa trên nhu cầu của ứng dụng của bạn. Đây cũng là một cách thuận tiện để hỗ trợ nội dung có thể tải xuống (ví dụ như các tiện ích bổ sung trả tiền).

Một lưu ý: điều này giả định bạn cần tải hình ảnh động tại thời gian chạy qua mã. Nhưng bạn cũng có các tệp NIB tĩnh có phương tiện được nhúng trong chúng. Bạn sẽ phải tìm ra cách để làm cho tệp NIB tĩnh sử dụng các phương thức động để giải quyết tên tệp phương tiện. Một cách là sử dụng MethodSwizzling và xem các filepath có tiền tố thuộc loại, ví dụ: "media: image.png" và chuyển hướng các tệp đó để sử dụng các phương thức BundleUtil.

Cách khác là làm bố cục của bạn với IB sau đó chuyển đổi sang mã Obj-C bằng cách sử dụng nib2objc và sau đó thay thế cơ chế gói plugin.

Hy vọng điều này sẽ hữu ích.

0

Tính năng này hoạt động với tôi:

1 dự án. 2 mục tiêu a, b. 2 thư mục hình ảnh cho a, b.

Bộ điều khiển.m và tệp nib của nó dành cho cả hai mục tiêu.

Tạo thư mục hệ thống tệp riêng biệt cho hình ảnh của mục tiêu a và b.

Nhập một thư mục hình ảnh để nhắm mục tiêu ("thêm tệp vào xy" -> "thêm vào mục tiêu a/b"), mục tiêu khác để nhắm mục tiêu b. Đảm bảo bạn sử dụng tùy chọn "tạo nhóm cho thư mục được thêm". Không chọn tùy chọn "tham chiếu thư mục".

Khi tôi tạo mục tiêu a, tôi sẽ tải ứng dụng có hình ảnh từ thư mục a; khi tôi xây dựng cho b, nó sử dụng thư mục b cho bức ảnh.

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