2015-10-14 20 views
5

Tôi có màn hình chính của ứng dụng của tôi làm nguyên mẫu sau: enter image description here Xem xét màn hình chính này, tôi phải phát triển ứng dụng theo cách sao cho mọi tính năng trong số này phải có khả năng cắm vào thời gian xây dựng. Ví dụ,Ứng dụng iOS mô-đun hóa tại thời điểm xây dựng

Nếu tôi đặt một macro như

#define FEATURE_1 0 

sau đó, màn hình chủ sẽ chỉ có 3 gạch cho ba tính năng còn lại. Ngoài ra, các tệp có liên quan đến tính năng-1 sẽ không được biên dịch trong kết quả .ipa.

Khi tôi phát triển bốn mô-đun này, tôi đã giữ tất cả các lớp độc lập với nhau. Nhưng vấn đề là tôi có một bảng phân cảnh duy nhất chứa toàn bộ giao diện người dùng. Bây giờ, tôi phải tách giao diện người dùng và tài nguyên theo cách mà nếu bất kỳ tính năng nào bị tắt, không có tệp nào liên quan đến tính năng đó sẽ được biên dịch.

Những gì tôi đã thử: Tôi đọc ở đâu đó làm cho mỗi tính năng như một thư viện tĩnh sẽ hoàn thành công việc của tôi, tuy nhiên, tôi không thể tìm ra cách bao gồm/loại trừ một thư viện tĩnh tại thời gian xây dựng. Ngoài ra, nó không giải quyết được vấn đề của tôi trong việc tách các khung nhìn trong bảng phân cảnh.

Cụ thể, những câu hỏi tôi có bao gồm:

1) Làm thế nào tôi có thể sao chép các tập tin cụ thể để dự án của tôi và bỏ qua các file cụ thể phụ thuộc vào vĩ mô như một định nghĩa ở trên? Nếu có thể, hãy hướng dẫn tôi một cách tốt để làm điều đó.

2) Làm cách nào để tách các chế độ xem trên bảng phân cảnh? Có thể xác định nhiều bảng phân cảnh và bao gồm các bảng phân cảnh được yêu cầu vào thời gian xây dựng? Vui lòng hướng dẫn.

+0

Chỉ cần không sử dụng Bảng phân cảnh. Nó không phải là vấn đề lớn khi làm việc với N23's –

+0

Nếu quan điểm của bạn đơn giản như bạn vẽ nó -> bạn có thể làm điều đó theo chương trình – ColdSteel

+0

Tại sao bạn làm điều này? –

Trả lời

1

gì tôi đã kết thúc thực hiện:

Cân nhắc tôi có hai tính năng: 1 và 2.

Vì vậy, yêu cầu của tôi sẽ làm cho ba loại xây dựng:

  1. Một xây dựng chỉ với tính năng 1.
  2. Một xây dựng với tính năng chỉ 2.
  3. Một xây dựng trong đó có cả hai tính năng 1 & 2.

Vì vậy, tôi chia tệp dự án thành các nhóm Xcode là:

  1. CommonModule - Nhóm này bao gồm các tệp cần thiết cho cả hai tính năng.
  2. ModuleOne: Nhóm này bao gồm các tệp cần thiết bởi tính năng một.
  3. ModuleTwo: Nhóm này bao gồm các tệp cần thiết theo tính năng hai.

Cấu trúc thư mục Tôi đi theo cho mỗi module là:

my folder structure

Nó là tốt hơn để giữ cấu trúc thư mục của dự án trên đĩa tương tự như cấu trúc nhóm các dự án đó. Nó làm giảm sự nhầm lẫn và thêm tất cả các tệp trong một thư mục cụ thể vào một nhóm cụ thể có thể là.

Bây giờ tôi đã xác định ba mục tiêu tương ứng với ba loại bản dựng mà tôi đã liệt kê ở trên.

  1. TargetOne: Tệp trong các nhóm CommonModuleModuleOne thuộc về mục tiêu này.
  2. TargetTwo: Tệp trong các nhóm CommonModuleModuleTwo thuộc về mục tiêu này.
  3. TargetAll: Tệp trong các nhóm CommonModule, ModuleOneModuleTwo thuộc về mục tiêu này.

Bây giờ trong CommonModule, tôi có một tập tin BuildConfig.h trong đó có các macro như:

#define IncludeModuleOne 1 
#define IncludeModuleTwo 1 

Vì vậy, trong khi xây dựng, chọn mục tiêu phù hợp và chuyển đổi công tắc trên một cách thích hợp để có được đúng xây dựng.

Bây giờ trong InitialViewController.m, tôi đã kiểm tra giá trị chuyển đổi và tùy thuộc vào giá trị, tôi đã hiển thị/ẩn các tùy chọn trình đơn cho tính năng cụ thể đó.

Bằng cách này, để tổng hợp, tôi chỉ bao gồm các tập tin yêu cầu trong xây dựng với việc sử dụng nhiều mục tiêu + macro cấu hình cùng

tôi sẽ sớm chia sẻ một liên kết đến Dự án mẫu của tôi trên GitHub. Tôi hy vọng nó sẽ giúp một người có yêu cầu tương tự. Cảm ơn!

1

Trả lời cho 2. Sử dụng Hoặc UICollectionView, hoặc sử dụng 4 điểm trong XIB của bạn và sử dụng phương pháp này

-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{ 

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self){ 
//  NSArray *nibArray = [[NSBundle mainBundle] loadNibNamed:@"--name of xibs--" owner:nil options:nil]; 
//  self = [nibArray objectAtIndex:0]; 
    } 
    return self; 
} 

trong nibArray, quan điểm sẽ được lưu trữ

4

trả lời trong vòng 1: Bạn không thể sử dụng chỉ các macro.

Tạo một số mục tiêu cho các cấu hình khác nhau của bạn, xác định macro bạn cần trên mỗi mục tiêu và chuyển đổi tệp bao gồm hộp kiểm để chỉ bao gồm các tệp cần thiết trong khi tạo.

+0

Tôi có thể viết một kịch bản để chuyển đổi các tập tin được bao gồm/loại trừ trong quá trình xây dựng ...? Nếu có, bạn có thể hướng dẫn tôi về một ví dụ không? –

+0

Thành thật mà nói, tôi không biết. Tôi đoán có ... Nhưng nó khá phức tạp. Đây là liên kết đến tài liệu hệ thống xây dựng xCode: https://developer.apple.com/legacy/library/documentation/DeveloperTools/Conceptual/XcodeBuildSystem/Xcode_Build_System.pdf – Moose

+0

Bạn có chắc là bạn có cách tiếp cận chính xác không. Chỉ cần tự hỏi ... Nếu bạn cần một loại hệ thống plug-in, tại sao bạn không tạo các thư viện trình cắm thêm mà bạn đưa vào lúc xây dựng, thay vì xử lý các macro và các giai đoạn xây dựng có điều kiện phức tạp? – Moose

2

Mặc dù bạn có thể sử dụng hệ thống xây dựng, trong trường hợp của bạn có vẻ như dễ dàng hơn để bạn quấn mã bị ảnh hưởng trong

#if FEATURE_1 
... 
#endif 

Đối giấu quan điểm bạn có thể sử dụng mã trong dòng

#if !FEATURE_1 
    feature1View.hidden = YES; 
#endif 

tùy thuộc vào chính xác những gì bạn đang cố gắng đạt được.

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