2010-03-11 29 views
18

Tôi đang cố gắng để quấn đầu của tôi xung quanh bộ điều khiển trong Cocoa Touch. Vấn đề chính là tôi muốn có nhiều hơn một bộ điều khiển "trên màn hình" cùng một lúc - tôi muốn có một cái nhìn lớn (với bộ điều khiển A) bao gồm các khung nhìn nhỏ hơn được điều khiển bởi bộ điều khiển riêng của họ (nói B). Tôi muốn có nó theo cách này bởi vì bộ phận làm cho mã trở nên sạch hơn. Điều gì là xấu là các bộ điều khiển bổ sung (loại B) không phải là "công dân hạng nhất" trên màn hình, ví dụ như họ không nhận được các truy vấn và thông báo autorotation. (Và không thể dễ dàng hiển thị bộ điều khiển phương thức, họ phải gửi thông báo presentModal… tới bộ điều khiển chính của họ.)Nhiều bộ điều khiển chế độ xem trên màn hình cùng một lúc?

Sự khác nhau giữa bộ điều khiển A và B từ quan điểm Cocoa là gì? Liệu hệ thống có giữ một số loại con trỏ tới "bộ điều khiển phía trước", một hệ thống đặc quyền mà nó gửi thông báo và những thứ như vậy không? Tại sao các bộ điều khiển khác không nhận được chúng, mặc dù lượt xem của chúng trên màn hình? Có nhiều bộ điều khiển “trên màn hình” được coi là hack không? Hoặc là nó được hỗ trợ và tôi chỉ thiếu một số điểm? Cảm ơn bạn.


Tìm hiểu thêm về sự cố Tôi đang cố giải quyết: Tôi đang viết một trình duyệt ảnh đơn giản. Ảnh được hiển thị ở chế độ toàn màn hình, người dùng có thể vuốt sang trái hoặc phải để thay đổi ảnh. Bộ điều khiển A sẽ xử lý phần cuộn và bộ điều khiển B sẽ tự chăm sóc từng ảnh.

Cách ly B có vẻ là một ý tưởng hay vì ảnh được tải từ mạng và có rất nhiều điều có thể xảy ra, giống như mạng có thể không hoạt động. Trong bộ điều khiển B, mã này khá đơn giản, vì B chỉ hoạt động với một ảnh cụ thể. Nếu tôi chuyển mã vào bộ điều khiển A, mọi thứ sẽ trở nên lộn xộn.

Điều duy nhất tôi không thích về giải pháp hiện tại là tôi phải tự làm việc xung quanh B không phải là bộ điều khiển “hạng nhất”. Tôi phải vượt qua một số cuộc gọi bằng tay thông qua A đến B và khi B muốn hiển thị một hộp thoại phương thức, nó phải gửi presentModal… đến A. Đó là xấu xí.

Trả lời

12

hiện nay có là một sự hỗ trợ hạng nhất cho kịch bản này kể từ iOS 5, nó được gọi là controller containment

7

Đầu tiên và điều này quan trọng, xem bộ điều khiển không nhận được "trên màn hình" - lượt xem làm. Bộ điều khiển "cấp cao nhất" của bạn chắc chắn có thể truyền theo các loại tin nhắn bạn mô tả cho "các bộ điều khiển phụ". Trên thực tế, đây là cách hầu hết các ứng dụng hoạt động. Hãy xem xét một ứng dụng có một thanh tab và nơi các chế độ xem sử dụng các bộ điều khiển điều hướng. Bạn thực sự có nhiều bộ điều khiển xem "đang chạy" cùng một lúc, mỗi bộ điều khiển có chế độ xem riêng cùng lúc - bộ điều khiển xem "gốc" của bạn sẽ là một cá thể (hoặc phân lớp) của UITabBarController, sau đó có một số UINavigationControllers lồng nhau, sẽ hiển thị các bộ điều khiển xem lồng nhau (như một cá thể hoặc một lớp con của UITableViewController).

Bạn có thể muốn đọc một chút về cách hoạt động của responder chains. Hãy xem xét một sự kiện cảm ứng. Nó sẽ được tạo cho chế độ xem gần nhất với đầu ngăn xếp, có thể nhận các sự kiện, cũng nằm bên dưới vòi nước. Nếu chế độ xem đó không thể xử lý nó, nó sẽ được chuyển qua chuỗi thức ăn phân cấp khung nhìn cho đến khi một cái gì đó xử lý nó (và sau đó ăn nó).

Đối với chi tiết cụ thể về câu hỏi của bạn, về tổng thể, tôi không chắc chính xác chiến lược bạn mô tả thực sự đang làm gì để mang lại lợi ích cho bạn về mặt phức tạp. Nó phụ thuộc vào cách chính xác bạn đang thực hiện mọi thứ, nhưng có các bộ điều khiển xem riêng biệt cho mỗi tiểu sử nhỏ có thể yêu cầu mã sổ kế toán nhiều hơn chỉ có một bộ điều khiển xem mà biết về tất cả các thành phần phụ của nó.

+0

Tốt câu trả lời, cảm ơn bạn.Tôi biết rằng lượt xem xuất hiện trên màn hình chứ không phải bộ điều khiển, đó là lý do tôi tiếp tục viết “trên màn hình” trong dấu ngoặc kép, có nghĩa là “có chế độ xem trên màn hình”. Tôi sẽ viết thêm về tình huống trong câu hỏi. – zoul

12

Nó không liên quan chặt chẽ đến câu hỏi ban đầu nhưng quan trọng.Apple tuyên bố rõ ràng trong Hướng dẫn lập trình của bộ điều khiển xem mà bộ điều khiển chế độ xem chịu trách nhiệm kiểm soát chính xác nội dung của một màn hình:

"Mỗi đối tượng bộ điều khiển chế độ xem tùy chỉnh chịu trách nhiệm quản lý chính xác giá trị của một màn hình. Sự tương ứng giữa bộ điều khiển khung nhìn và màn hình là một điều rất quan trọng trong thiết kế ứng dụng của bạn, bạn không nên sử dụng nhiều bộ điều khiển xem tùy chỉnh để quản lý các phần khác nhau của cùng một màn hình.

Lưu ý: Nếu bạn muốn chia một màn hình thành nhiều vùng và quản lý riêng từng vùng, hãy sử dụng các đối tượng điều khiển chung (các đối tượng tùy chỉnh) tăng dần từ NSObject) thay vì xem các đối tượng điều khiển để quản lý từng phần con của màn hình. Sau đó, sử dụng một đối tượng điều khiển xem đơn để quản lý các đối tượng bộ điều khiển chung. Bộ điều khiển xem tọa độ tương tác màn hình tổng thể nhưng sẽ chuyển thông điệp khi cần thiết để điều khiển chung đối tượng nó quản lý "

Tuy nhiên trong Programming Guide iPad họ cũng nói rằng có thể có cái nhìn chứa bộ điều khiển:

". Một bộ điều khiển xem chịu trách nhiệm cho một lượt xem. Hầu hết thời gian, chế độ xem của trình điều khiển chế độ xem được dự kiến ​​sẽ lấp đầy toàn bộ khoảng thời gian của cửa sổ ứng dụng. Tuy nhiên, trong một số trường hợp, một bộ điều khiển xem có thể được nhúng bên trong một bộ điều khiển khung nhìn khác (được gọi là bộ điều khiển xem bộ chứa) và được trình bày cùng với nội dung khác. Các bộ điều khiển thanh điều hướng và tab là các ví dụ về các bộ điều khiển khung nhìn. "

Tối đa kiến ​​thức hiện tại của tôi. Tôi sẽ không sử dụng các bộ điều khiển phụ trong bộ điều khiển khung nhìn mà không phải phân lớp NSObject và gửi tin nhắn từ bộ điều khiển xem chính của tôi.

Ngoài ra kiểm tra chủ đề này: MGSplitViewController discussion

+1

Vấn đề là làm thế nào để truyền một thông điệp từ đối tượng điều khiển NSObject chung cho Trình điều khiển Chế độ xem. Bạn sẽ cần một trong hai đại biểu hoặc NSNotifications đó là một nỗi đau. – mskw

5

trên thực tế bạn có thể làm cho nó hoạt động sớm hơn so với iOS 5, kể từ đó. hầu hết chúng ta là ta rgeting 4.x và 5.x cùng một lúc. Tôi đã tạo ra một giải pháp hoạt động ở cả hai, và nó hoạt động tốt, vài ứng dụng trong appstore sử dụng nó :) Đọc my article about this hoặc chỉ download and use a simple class mà tôi đã tạo cho mục đích này.

+0

Nó được coi là thực hành tồi của Apple để làm điều này trước ios5 (tức là trước khi chúng tôi có ngăn chứa của Apple). Các kỹ sư của Apple đã nói với tôi như vậy. – ader

+0

Tôi đã sử dụng giải pháp này trong hơn một năm và tôi chưa bao giờ gặp bất kỳ vấn đề nào với nó. Vấn đề là hầu hết các triển khai mà tôi đã nhìn thấy đã không chăm sóc xử lý đúng bộ nhớ và tất cả các phương pháp quan trọng, và tôi DOES xử lý nó đúng cách. Cũng giống như I love apple view controller nên được giới thiệu với việc phát hành iPad, vì đây là kịch bản phổ biến nhất cho nhiều bộ điều khiển xem. Một lần nữa đây là giải pháp được chấp thuận trong nhiều ứng dụng trong appstore. Giải pháp này cho phép sử dụng lại các bộ điều khiển xem iPhone mà không bị bất kỳ phiền phức hoặc đau đầu nào. –

4

Đây là một câu hỏi khá cũ, nhưng vì tôi đoán có những người có thể phải đối mặt với cùng một vấn đề hôm nay tôi muốn chia sẻ giải pháp của mình. Tôi đã viết ứng dụng này có màn hình này với rất nhiều thông tin, phân trang, điều khiển, v.v. Theo MVC documentation của Apple về vai trò của ViewControllers, bạn không nên thực hiện logic trong chế độ xem hoặc truy cập trực tiếp vào mô hình dữ liệu từ đó, tôi đã phải lựa chọn giữa việc có một ViewController Massive với một vài nghìn dòng mã mà cả hai đều khó duy trì và gỡ lỗi (ngay cả với các bài kiểm tra đơn vị) hoặc tìm một cách mới.

Giải pháp của tôi là sử dụng UIContainerView như dưới đây: enter image description here

Bằng cách này, bạn có thể thực hiện logic của mỗi phần trong ViewController riêng của nó, và bộ điều khiển xem mẹ sẽ chăm sóc của những hạn chế và kích thước của các quan điểm.

Lưu ý: Câu trả lời này chỉ là một hướng dẫn để hiển thị đường đi, bạn có thể tìm thấy một lời giải thích tốt và chi tiết về cách thức hoạt động và làm thế nào để thực hiện nó HERE

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