2013-06-20 30 views
6

Có thể đây là một câu hỏi ngớ ngẩn, nhưng tôi đã gặp phải một số lần trong quá trình phát triển iOS.iOS - Khi nào cần tạo một lớp con ViewController và một lớp con UIView?

Thỉnh thoảng tôi sẽ phát triển thành phần xem mà tôi muốn sử dụng trên nhiều màn hình, vì vậy tôi sẽ quyết định phân lớp UIView và biến nó thành một thứ mà tôi có thể sử dụng ở nhiều nơi.

Sau đó, tôi bắt đầu thêm chức năng vào nó. Có lẽ nó cần phải trả lời một số NSNotification, hoặc nó được cho là để đáp ứng với các chạm của người dùng.

Tại một thời điểm nhất định, tôi bắt đầu tự hỏi mình có nên tạo lớp con UIViewController và thêm nó vào giao diện người dùng của tôi dưới dạng ViewController con không.

Có bất kỳ sự đồng thuận nào về nơi để vẽ đường kẻ giữa thêm một số hành vi vào một số UIView và khi nào để tạo đầy đủ UIViewController?

Trả lời

3

Bạn nên sử dụng bộ điều khiển bất cứ lúc nào bạn cần xử lý hoặc kiểm soát dữ liệu. Lượt xem được cho là ngu ngốc nhất có thể, không biết những gì họ đang hiển thị mà đúng hơn là ở đâu. Bạn có thể dễ dàng phân lớp và tái sử dụng ViewControllers. Một ví dụ tốt, nói rằng bạn cần phải lấy một chuỗi (hoặc văn bản) từ người dùng trong suốt ứng dụng của bạn thông qua một bộ điều khiển popover và một phương thức. Tạo một lớp con chung của UIViewController có chế độ xem với trường văn bản và nút. Sau đó, bạn có thể sử dụng chế độ xem này và bộ điều khiển của nó ở bất kỳ khả năng nào bạn cần. Sử dụng lại nó trong cửa sổ bật lên, phương thức hoặc bất kỳ nơi nào khác (và thường chuyển dữ liệu trở lại thông qua ủy quyền). Vì bạn đang xử lý dữ liệu nên bạn không nên sử dụng một lớp con duy nhất của UIView.

Từ kinh nghiệm của tôi, tôi lớp con UIViewControllers thường xuyên hơn sau đó UIViews. Đó là một chút khó khăn cho tôi để hiểu nếu bạn đang chỉ nói về Container hoặc tái sử dụng quan điểm trong quy trình làm việc ứng dụng chung. Dù bằng cách nào thì nó cũng giống nhau.

+0

Đẹp. Đó luôn là khuynh hướng của tôi. –

+0

Trường hợp nhắc tôi đăng bài này thực sự là một thứ không được sử dụng lại .. nó rất cụ thể đối với một màn hình cụ thể. Tuy nhiên, thành phần có rất nhiều hệ thống ống nước, và nó thực sự cảm thấy như nó cần tách biệt tốt hơn từ ViewController được bao gồm trong. –

+0

Vâng tôi biết những gì bạn có ý nghĩa. Phân lớp UIViewController cho một tình huống cụ thể không phải là một ý tưởng tồi, nhưng cố gắng làm cho chúng trở nên chung chung nhất có thể. Giống như trong ví dụ của tôi không đặt tên nó là 'ColorNameCollector' hoặc một cái gì đó bởi vì sau đó nó chỉ có thể được sử dụng để có được màu sắc. Thay vào đó, hãy đặt tên nó là 'StringCollector'. Bằng cách này nó là chung chung hơn và có thể được sử dụng bất cứ khi nào bạn cần để có được một chuỗi từ người sử dụng, bất kể nơi hoặc làm thế nào nó được trình bày/sử dụng. – Firo

0

Tôi đã sử dụng bộ điều khiển chế độ xem được nhúng để tải chế độ xem bảng có thể sử dụng lại theo thời gian. Tôi thấy rằng đôi khi nó hữu ích nhưng không phải lúc nào cũng vậy. Giao tiếp giữa hai có thể cồng kềnh, giống như nếu bạn muốn bộ điều khiển nhúng truyền thông trở lại vùng chứa. Đoàn làm cho nó dễ dàng hơn nhưng vẫn cồng kềnh. Nó cũng giới hạn bạn với iOS 6, nếu tôi nhớ đúng iOS 5 và thấp hơn không hỗ trợ các bộ điều khiển nhúng.

Nếu chỉ thêm phương pháp, bạn có thể sử dụng danh mục để lưu trữ một số phương pháp bổ sung. Tôi làm điều đó rất nhiều trên NSManagedObjects mà tôi không muốn phân lớp và nếu tôi tạo lại NSManagedObject từ datamodel, tôi không bị mất mã trong danh mục của mình. Cung cấp cho tôi thêm chức năng như trường được tính toán hoặc phương pháp chuyển đổi mà không cần phải phân lớp. Nếu bạn không cần những phương thức đó cho một cá thể cụ thể, chỉ loại trừ tham chiếu đến thể loại.

Phân lớp không bao giờ là xấu mặc dù IMO.

4

Tôi không thể cho bạn biết về sự đồng thuận, nhưng đây là quan điểm của tôi:

Subclass UIView chỉ khi ...

  • Bạn muốn làm bản vẽ
  • tùy chỉnh Bạn cần tùy chỉnh một số hành vi của một lớp con đã tồn tại UIView
  • Bạn có nhu cầu đặc biệt cho các bản xem trước bố cục. Tuy nhiên, hầu hết bố cục có thể được thực hiện bởi UIViewController.
  • lẽ để xử lý hình cảm ứng đặc biệt mà bạn không thể được thực hiện với recognizers cử chỉ

Subclass UIViewController trong tất cả các trường hợp khác. Bạn hầu như luôn luôn cần một bộ điều khiển anyway, để viết mã keo có quan hệ với nhau quan điểm và mô hình, hoặc để xử lý tương tác người dùng. Do đó, Apple đã làm cho nó dễ dàng trong UIKit để cho phép bộ điều khiển làm tất cả công việc và giữ quan điểm là "ngu ngốc" nhất có thể. Ví dụ, rất đơn giản để làm tổ điều khiển để tạo ra các cấu trúc phân cấp khung nhìn phức tạp, mà không cần phải có một lớp con xem đơn.

Chỉ báo phân lớp UIView không phải là điều đầu tiên bạn nên làm là phần có tiêu đề "Giải pháp thay thế cho phân lớp" trong UIView class reference. Chỉ báo phân lớp UIViewController là điều ưu tiên cần làm là không có phần nào trong số UIViewController class reference :-)

+0

phản hồi tuyệt vời, cảm ơn bạn! –

+0

@herzbube bạn có nghĩ rằng đó là lý do tại sao giờ đây chúng tôi có chế độ xem vùng chứa với VC trẻ em trong IB? Đây có phải là cách để chia sẻ các phần giao diện người dùng của chúng tôi giữa các cảnh (như ảnh hồ sơ + tên + trạng thái chấm) không? – allaire

+0

@allaire Nhận xét không thực sự hữu ích cho các cuộc thảo luận, cũng như chúng được dự định là như vậy. Bạn có thể bắt đầu cuộc thảo luận này trong một kênh trò chuyện để có ý kiến. Điều đó đang được nói, tôi thừa nhận rằng 1) Tôi chưa bao giờ sử dụng IB nhiều; 2) Tôi đã bị ngắt kết nối khỏi sự phát triển iOS trong vài tháng nay, vì vậy tôi không thực sự biết IB đang đưa ra điều gì cho những ngày này, và Apple nghĩ nó nên được sử dụng như thế nào. Có thể xem một hoặc hai video công nghệ? – herzbube

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