2012-01-12 29 views
7

nềnSử dụng nhiều tệp nib với một bộ điều khiển chế độ xem đơn?

Tôi đang sử dụng giao diện người xây dựng để tạo ra các giao diện người dùng cho một ứng dụng tôi đang làm việc trên. Ứng dụng này có một màn hình hiển thị một loạt các nút. Nhấp vào nút sẽ hiển thị chế độ xem được liên kết phủ lên các nút. Nhấp vào nút khác sẽ ẩn chế độ xem lớp phủ trước đó và hiển thị một chế độ xem khác.

Quá quản lý giao diện người dùng dễ dàng hơn trong IB Tôi đã quyết định tạo nhiều tệp nib cho mỗi chế độ xem phụ sẽ xuất hiện khi nhấp vào nút có liên quan. Sau đó, tôi tải tệp nib của chế độ xem phụ trong phương thức viewDidLoad của trình điều khiển chế độ xem bằng cách sử dụng lớp UINib.

Ý tưởng đằng sau điều này là để tránh việc có nhiều chế độ xem xếp chồng lên nhau trong một tệp nib đơn lẻ vì điều này sẽ khó thao tác trong IB. Tôi có thể đã tạo ra tất cả các khung nhìn trong mã nhưng điều này đòi hỏi rất nhiều mã tẻ nhạt khi bố trí của mỗi khung nhìn con là khá phức tạp (với nhiều khung nhìn con).

Mã mẫu tải chế độ xem phụ từ tệp nib.

- (void)viewDidLoad 
{ 
    UINib *aSubViewNib = [UINib nibWithNibName:@"aSubView" bundle:nil]; 
    NSArray *bundleObjects = [aSubViewNib instantiateWithOwner:self options:nil]; 

    // get root view from bundle array 
    UIView *aSubView = [bundleObjects objectAtIndex:0]; 
    [self.view addSubview:aSubView]; 
... 

Đoạn mã trên được lặp lại cho các chế độ xem khác.

Để tóm tắt tôi có một ứng dụng iPhone màn hình duy nhất có chế độ xem lớp được hiển thị/ẩn bằng cách nhấp vào nút. Điều này đạt được với một bộ điều khiển xem đơn với một tệp nib liên quan và một loạt các tệp nib bổ sung cho các khung nhìn con được tải trong phương thức viewDidLoad của trình điều khiển xem.

Câu hỏi!

Xin lỗi vì đã giới thiệu dài nhưng tôi muốn rất rõ ràng tôi đang làm gì.

  • Phương pháp tiếp cận của tôi có tệ hay không?
  • Có bất kỳ vấn đề tiềm năng nào để thực hiện theo cách này không?
  • Những người khác đã làm gì khi cần giao diện động và vẫn muốn giữ mọi thứ trong Trình tạo giao diện?

Ghi chú

Trước khi có ai hỏi tại sao tôi không chỉ hiển thị các quan điểm phụ trên một màn hình mới và sử dụng thanh điều hướng, hãy để tôi nói rằng tôi có lý do rất tốt và tôi hiểu iOS Hướng dẫn giao diện người dùng. Trường hợp sử dụng ở trên không chính xác là trường hợp sử dụng của tôi, nhưng đó là trường hợp mô tả rõ ràng vấn đề mà không bị sa lầy trong ứng dụng phát triển của tôi. Ngoài ra tôi biết tôi có thể viết tất cả các khung nhìn con dưới dạng mã nhưng mỗi khung nhìn phụ có bố cục phức tạp của các khung nhìn con và nó sẽ có nhiều mã và làm rối tung xung quanh để thử và làm cho chúng trông đúng.

Cảm ơn bạn trước.

Trả lời

1

Không nhất thiết phải có mối quan hệ 1-1 giữa các bộ điều khiển chế độ xem và chế độ xem. Hầu hết các chế độ xem đều chứa nhiều bản xem phụ, là các chế độ xem, vì vậy điều này có nghĩa là không có ý nghĩa.

Tuy nhiên, tùy thuộc vào độ phức tạp của các chế độ xem (bao gồm nội dung của chúng), bạn có thể muốn các trình điều khiển chế độ xem riêng biệt ... hay không.

Ví dụ, nếu bạn có hai sbuviews là mỗi tableViews, bạn có thể muốn có một bộ điều khiển xem cho mỗi tableView. Điều này là do mỗi tableView đang xem xét các phương thức đại biểu giống nhau, và nếu chúng nằm trong cùng một viewController, thì các phương thức ủy nhiệm phải phân biệt giữa các tableViews. Các phương thức đại biểu có chữ ký cho phép điều này, nhưng, theo kinh nghiệm của tôi, nó thực sự có thể tạo ra một thiết kế mã lộn xộn khó theo dõi và khó quản lý. Mặt khác, bạn có thể có hai bảng được quản lý bởi cùng một viewController, trong đó một bảng được lấp đầy với dữ liệu có ý nghĩa và một bảng khác chỉ đơn giản là một trình giữ chỗ (như khi nguồn dữ liệu trống). Người ta có thể được nhìn thấy trong khi người kia thì không. Tại sao làm cho cuộc sống của bạn phức tạp bằng cách tạo ra hai bộ điều khiển xem khi cả hai được điều khiển bởi cùng một nguồn dữ liệu (mô hình)?

Trong suy nghĩ của tôi, nó đi xuống đến mức độ khó để theo dõi và quản lý mã. Nếu sự phức tạp của việc sử dụng một bộ điều khiển xem đơn trở nên nặng nề, hãy xem xét sử dụng nhiều bộ điều khiển xem hơn.

CẬP NHẬT

Bằng cách này, tôi có một ví dụ mà tôi hiện đang làm việc với điều đó có thể minh họa một tình huống tương tự. Trong InAppSettingsKit, có rất nhiều nhà phát triển sử dụng, có một số tệp xib cho các phần của khung nhìn chính. You can look at the structure here on github. Có một bộ điều khiển xem chính và một số tệp xib. (Cũng có những gì tôi gọi là bộ điều khiển xem "trợ giúp" và trình điều khiển chế độ xem email.) Trong ví dụ này, các tệp xib có thể được sử dụng nhiều lần để chỉ định bố cục của các ô xem bảng. Tuy nhiên, không có bộ điều khiển xem cho mỗi tệp xib. (Các tài liệu cho InAppSettingsKit là thưa thớt, vì vậy những điều này có thể không được rõ ràng chỉ bằng cách xem nhanh nó.)

+0

Vì vậy, đối với trường hợp sử dụng của tôi, lý do duy nhất tôi chia các quan điểm thành các tệp nib riêng biệt là giúp quản lý các khung nhìn đó dễ dàng hơn trong IB, bạn có nghĩ cách tiếp cận của tôi là an toàn để sử dụng hay không? – Camsoft

+0

Không có quy tắc hoặc hướng dẫn về những gì bạn đang làm. Bạn đang tốt trong vấn đề đó. – Jim

+0

Tôi đã thêm một ví dụ về một thành phần phần mềm thực mà nhiều nhà phát triển sử dụng. Xem câu trả lời của tôi ở trên để biết thêm chi tiết. – Jim

1

Mỗi Chế độ xem phải có UIViewController tương ứng. Sử dụng một ViewController để "Control" nhiều hơn một khung nhìn phá vỡ mô hình MVC. "Điều khiển" nhiều "khung nhìn" từ một bộ điều khiển sẽ làm cho nó khó khăn hơn nhiều để thay đổi một thứ mà không làm hỏng cái gì khác.Các lựa chọn bạn thực hiện về cách trình bày nội dung cho người dùng cuối sẽ khác nhau đối với từng cá nhân. Vì vậy, nếu bạn nói một NavigationController sẽ không hoạt động trong trường hợp của bạn, có thể một chế độ xem Modal là câu trả lời hoặc, bạn có thể chỉ cần khởi tạo UIViewControllers tùy chỉnh của bạn và thêm chúng vào chế độ xem của bạn ([addSubview:]), nếu đó là con đường bạn muốn, nhưng như tôi đã nói, nó sẽ có lợi cho bạn để làm cho một "điều khiển" cho mỗi đối tượng xem cùng với xib tương ứng. Nếu bạn cần thông tin được gửi lại, hãy sử dụng một đại biểu hoặc sử dụng Thông báo để gửi thư trở lại chế độ xem gốc. Tôi đã học được một cách khó khăn mà không theo mô hình MVC, sẽ khiến bạn sống khổ sở. Hãy thử và giữ mã của bạn càng tách càng tốt. Và đọc lên trên mẫu thiết kế MVC, bạn sẽ không hối tiếc.

+0

Tất cả các quan điểm phụ có liên quan đến màn hình duy nhất và do đó một bộ điều khiển cái nhìn duy nhất.Tôi có thể dễ dàng chỉ cần thêm tất cả các quan điểm phụ trong cùng một tập tin nib nhưng như tôi đã nói nó đã nhận được lộn xộn và khó để bố trí như xem là chồng chéo. Ý tưởng của tôi là chia nhỏ một số chế độ xem thành các tệp nib riêng biệt và sau đó tải chúng trở lại chế độ xem chính bằng phương thức viewDidLoad của trình điều khiển chế độ xem. – Camsoft

+0

Mỗi Chế độ xem phải có UIViewController tương ứng. Sử dụng một ViewController để "Control" nhiều hơn một khung nhìn phá vỡ mô hình MVC. nếu điều này là đúng như thế nào có thể phổ quát xem bộ điều khiển hoạt động ?, nó có 2 ngòi. – Juan

+0

Tôi đã nghĩ gần như cùng một điều @Hubert. Dường như có một số vấn đề liên quan đến điều này. Nếu quyết định đang được thực hiện vào thời gian chạy, và trên một nút bấm, điều này có nghĩa là xib sẽ được tải trong nền, infact tất cả chúng, và một sẽ được chọn? Ngoài ra, autolayout có thể giải quyết vấn đề một cách dễ dàng. –

0

thực sự có thể làm điều này.

Mở tệp .xib, chọn Chủ sở hữu tệp (trong trình giữ chỗ) -> "trình kiểm tra danh tính" -> đổi tên lớp thành tên lớp điều khiển -> nhấn điều khiển và kéo phần giữ chỗ của chủ sở hữu tệp vào Xem đối tượng, chọn " xem "trong hộp thoại. Bây giờ bạn có thể tùy chỉnh chế độ xem của mình.

p.s. bạn có thể sử dụng các cửa hàng giống như xib đầu tiên, bạn chỉ cần kéo chúng vào xib (+ control sure) mới.

đây là một hướng dẫn giải thích: http://irawd.wordpress.com/2013/09/05/how-to-link-a-xib-file-to-a-class-and-use-2-xib-files-for-iphone4-and-iphone5/

+0

đăng liên kết trong SO có thể tốt nhưng liên kết có xu hướng bị lạc ... vui lòng đăng các yếu tố quan trọng trong câu trả lời của bạn vào phần nội dung câu trả lời. – NirMH

+0

@NirMH đã chỉnh sửa. cảm ơn cho phản hồi, câu trả lời đầu tiên của tôi trên SO – user3206558

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