2009-12-21 22 views
12

Tôi hiện đang xây dựng một ứng dụng iPhone theo thẻ trong đó mỗi bộ điều khiển xem của tab là một phiên bản UINavigationController và mỗi bộ điều khiển của mỗi một phiên bản UINavigationController là một phiên bản UITableViewController. Lý tưởng nhất, tôi muốn phân lớp UINavigationController để bộ điều khiển cho mỗi tab là một phân lớp của UINavigationController (ngoài việc có tất cả chức năng chuẩn UINavigationController, rõ ràng) đóng vai trò là nguồn dữ liệu và ủy nhiệm cho mỗi lần xem bảng được liên kết với các công ty con của nó. Cố gắng để làm điều này dường như phá vỡ các chức năng cơ bản UINavigationController trong phân lớp.Tại sao Apple không cho phép phân lớp UINavigationController? Và các lựa chọn thay thế của tôi cho phân lớp là gì?

Xem như Apple nói trong tài liệu iPhone của họ rằng không nên phân loại UINavigationController và mọi thứ dường như bị hỏng khi thực hiện, tôi tự hỏi làm cách nào để mở rộng chức năng UINavigationController's mà không phân lớp và nói chung nên làm việc xung quanh các hạn chế phân lớp khi thực hiện phát triển Cocoa.

Cảm ơn!

+1

Tôi đã tò mò về điều này bản thân mình, và tôi thấy rằng tài liệu UINavigationController của Apple bây giờ nói "Lớp này thường được sử dụng như-nhưng có thể được phân lớp trong iOS 6 và sau đó." – bneely

Trả lời

10

Để tham khảo, lưu ý rằng kể từ iOS 6, UINavigationController có thể được phân loại là hợp pháp.

Lớp này thường được sử dụng nhưng có thể được phân lớp trong iOS 6 trở lên. UINavigationController Class Reference

Tất nhiên, điều đó không có nghĩa là bạn luôn nên làm như vậy. Nhưng bạn có thể.

+0

Đây phải là câu trả lời được chấp nhận! – Klaas

0

Bởi vì họ muốn tránh sự không thống nhất của giao diện người dùng gây ra mọi nền tảng khác.

21

Tại sao bạn muốn UINavigationController hoạt động như một nguồn dữ liệu cho bảng? Toàn bộ điểm của UITableViewController là bạn phân lớp nó và nó hoạt động như nguồn dữ liệu cho số UITableView mà nó cũng đặt vào và điền vào, chế độ xem gốc.

+1

Đồng ý. Trong trường hợp này Apple chỉ đơn giản là tiết kiệm cho bạn từ việc đưa ra một quyết định thiết kế khủng khiếp. Nếu bạn thực sự tin rằng bạn có một ý tưởng tốt hơn, thì bạn có thể tự do viết các điều khiển của chính bạn từ đầu. –

+0

Điều này. Không có lý do chính đáng để phân lớp UINavigationController. UINavigationController không thực sự kiểm soát bất kỳ giao diện người dùng có thể sửa đổi thực nào. Toàn bộ điểm của bộ điều khiển xem bảng là bộ điều khiển xem bảng điều khiển nội dung. Bộ điều khiển xem bảng của bạn phải thích ứng với dữ liệu từ chế độ xem mô hình của nó cho chế độ xem bảng. Ngoài ra, một bộ điều khiển đơn điều khiển một loạt các khung nhìn bảng khác nhau trên một loạt các khung nhìn bảng khác nhau giống như một thảm họa đang chờ xảy ra. Tôi khuyên bạn nên chống lại điều này không phải vì phân lớp, nhưng điều này nghe có vẻ phức tạp nhất. –

1

Như tôi đã hiểu, lớp con không được khuyến khích vì Objective C cho phép một lớp con truy cập quá nhiều vào các hoạt động bên trong của lớp cha của nó.

Cách thay thế được đề xuất để viết một lớp con là viết một đại biểu, trong trường hợp này là UINavigationControllerDelegate. Sau đó bạn có thể gói gọn hành vi cụ thể mà bạn muốn mở rộng vào lớp đại biểu này và liên kết nó với UINavigationController bất cứ khi nào bạn cần.

1

Nếu chế độ điều khiển sẵn có không đáp ứng nhu cầu của bạn về xử lý dữ liệu (giả định của chúng tôi, vì chúng tôi không biết tại sao bạn muốn một đối tượng là nguồn dữ liệu cho nhiều chế độ xem), bạn luôn có thể tạo dữ liệu bổ sung và/hoặc các lớp điều khiển (các lớp con của NSObject ít nhất).

Bạn có thể tồn tại dữ liệu hoặc đối tượng khác trong khi thay đổi chế độ xem theo nhiều cách khác nhau. (1) một tài sản của lớp ứng dụng ủy nhiệm của bạn. Bất kỳ đối tượng nào trong ứng dụng của bạn đều có thể lấy mẫu ứng dụng ủy nhiệm ứng dụng của bạn với

[[UIApplication sharedApplication] delegate] 

Sử dụng điều này một cách tiết kiệm vì nó thực chất tạo ra hình cầu.

(2) Bạn có thể truyền dữ liệu hoặc các đối tượng khác từ bộ điều khiển đến bộ điều khiển khi bạn đẩy các lớp con của bộ điều khiển xem hoặc đưa chúng lên trong các tab.

(3) Dữ liệu cốt lõi là một cách khác nhưng đòi hỏi nhiều Ca cao trong vành đai của bạn và bạn vẫn phải quản lý (các) bối cảnh ngữ cảnh.

10

Tôi sẽ tiếp tục và nói ý tưởng của bạn có một số công đức, nếu ở mọi cấp độ bạn thực sự sử dụng cùng một loại dữ liệu và mỗi cấp có lẽ có một đại biểu khác nhau để xử lý việc tạo tế bào.Về cơ bản không có lý do gì bạn không thể phân lớp bộ điều khiển UINavigation để thêm một lớp dữ liệu hoàn toàn trực giao, vì nó không liên quan gì đến giao diện người dùng hoặc hành vi mà UINavigationController đang quản lý (đó là những gì Apple quan tâm với). Đối với những người phản đối ý tưởng, hãy nghĩ về nó như một kho lưu trữ dữ liệu trên mỗi tab mà tất cả các trang trong một tab có thể truy cập thay vì mỗi trang trong hệ thống phải đi đến AppDelegate, hoặc có một nhóm người độc thân. Về cơ bản thì đó là một singleton, nhưng ít nhất một cái đã có và nhận được tham chiếu được truyền đi tự động. Tất cả những gì đã nói, tôi sẽ kết thúc bằng một đề xuất thiết kế thay thế - Tôi nghĩ rằng những gì bạn có thể muốn làm là xem chi tiết nhiều lớp sử dụng lại cùng một mã để tạo ra các ô và vì bạn có cùng một loại dữ liệu ở mỗi lớp. Một cách tiếp cận tốt hơn để xử lý đó là có một bộ điều khiển chế độ xem bạn cho phép tập con dữ liệu hiển thị và khi người dùng đọc xuống, nó chỉ tạo một thể hiện khác của cùng một bộ điều khiển chế độ xem với tập con dữ liệu mới. Cách tiếp cận đó tốt hơn nhiều so với ý tưởng của việc điều khiển chuyển hướng hoạt động như một bảng ủy nhiệm cho mỗi cấp độ, bởi vì bạn phải thực hiện một tấn tua đi qua lại và nó sẽ đòi hỏi nhiều công việc hơn để nhớ vị trí cuộn ở mỗi mức để khởi động. Đó là lý do tại sao bạn muốn giữ các bản tóm tắt bằng cách sử dụng nhiều phiên bản của bộ điều khiển chế độ xem, nhưng nhiều phiên bản không có nghĩa là nhiều lớp.

+0

Đã hiểu. Cảm ơn bạn đã làm sáng tỏ và đề xuất. –

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