2013-06-25 41 views
10

Đôi khi tôi muốn phân lớp UIViewController cho một số tùy chỉnh ứng dụng rộng. Ví dụ. một cái gì đó mà tất cả các bộ điều khiển xem nên thực hiện trong viewDidLoad hoặc viewWillAppear hoặc như vậy.Sự khác biệt giữa UIViewController và UITableViewController

Tự nhiên tôi phân lớp UIViewController và đi từ đó và tất cả các trình điều khiển chế độ xem được kế thừa từ đó. Nhưng một số bộ điều khiển chạy bảng. Và có UITableViewController được thiết kế cho mục đích đó.

Vì vậy, tôi phân lớp UITableViewController quá và chỉ làm những điều tương tự ở đó. Điều đó dường như không phải là điều thông minh nhất trong các điều khoản OOP. Và không có nhiều thừa kế, vv

Và như UITableViewController thừa hưởng từ UIViewController ...

Bây giờ tôi tự hỏi tại sao tôi không chỉ tạo ra bộ điều khiển xem bảng của riêng tôi được thừa kế từ bộ điều khiển xem rất riêng của tôi phân lớp và thêm tất cả các công cụ bảng. Nhưng những gì là "tất cả các công cụ bảng"?

  • Có mã bộ xương mà xcode thêm vào mọi bộ điều khiển chế độ xem bảng mới. Khá tiện dụng nhưng có thể dễ dàng chuyển sang đoạn mã.
  • Có khai báo giao thức UITableViewDelegate và UITableViewDataSource. Dễ dãi. Việc thực hiện các phương thức đó phải tuân theo từng phân lớp của UITableViewController.
  • Có thể triển khai mặc định hợp lý tất cả các phương pháp bắt buộc đó trong giao thức. Chẳng hạn như trở về 0 cho numberOfSectionsInTableView: hoặc nil cho titleForHeaderInSection hoặc 44.0f cho heightForRowAtIndexPath: (. Ví dụ Xấu mặc dù có thể có thông minh hơn không thực hiện điều đó cả)

Vì vậy, mặc dù những thứ rõ ràng, được có bất kỳ điều kỳ diệu mà UITableViewController mất quan tâm?

+0

Nhờ tất cả mọi người đã trả lời. Điều này giúp ích rất nhiều cho quyết định kiến ​​trúc nhất định này. –

Trả lời

10

Tôi tin rằng tất cả các hành vi UITableViewController thêm được xác định rõ trong tài liệu lớp: https://developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewController_Class/Reference/Reference.html

Các UITableViewController lớp tạo ra một đối tượng điều khiển để quản lý một cái nhìn bảng. Nó thực hiện các hành vi sau đây:

• Nếu tệp nib được chỉ định thông qua phương thức initWithNibName: bundle: (được khai báo bởi lớp con UIViewController), UITableViewController sẽ tải chế độ xem bảng được lưu trữ trong tệp nib. Nếu không, nó sẽ tạo ra một đối tượng UITableView chưa được định cấu hình với các kích thước chính xác và mặt nạ tự động hóa. Bạn có thể truy cập khung nhìn này thông qua thuộc tính tableView.

• Nếu tệp nib chứa chế độ xem bảng được tải, nguồn dữ liệu và ủy nhiệm trở thành các đối tượng được xác định trong tệp nib (nếu có). Nếu không có tệp nib được chỉ định hoặc nếu tệp nib xác định không có nguồn dữ liệu hoặc đại biểu, UITableViewController đặt nguồn dữ liệu và đại biểu của chế độ xem bảng thành tự.

• Khi chế độ xem bảng sắp xuất hiện lần đầu tiên được tải, trình điều khiển xem bảng sẽ tải lại dữ liệu của chế độ xem bảng. Nó cũng xóa lựa chọn của nó (có hoặc không có hoạt ảnh, tùy thuộc vào yêu cầu) mỗi lần xem bảng được hiển thị. Lớp UITableViewController thực hiện điều này trong phương thức superclass viewWillAppear :. Bạn có thể tắt hành vi này bằng cách thay đổi giá trị trong thuộc tính clearsSelectionOnViewWillAppear.

• Khi chế độ xem bảng đã xuất hiện, bộ điều khiển sẽ nhấp nháy các chỉ báo cuộn của chế độ xem bảng. Lớp UITableViewController thực hiện điều này trong phương thức superclass viewDidAppear :.

• Nó thực hiện phương thức superclass setEditing: animated: để nếu người dùng chạm vào nút Edit | Done trong thanh điều hướng, bộ điều khiển sẽ chuyển sang chế độ chỉnh sửa của bảng.

Tất cả những hành vi này sẽ dễ dàng triển khai lại nếu chúng áp dụng cho bộ điều khiển và chế độ xem bảng cụ thể của bạn. Nói chung tôi đã thấy thích hợp hơn khi tự mình thực hiện các hành vi này để cho phép phân cấp thừa kế thay thế như bạn đã lưu ý và bởi vì tôi thường xem xét đặt cả hai chế độ xem delagatedatasource của chế độ xem bảng làm bộ điều khiển chế độ xem. . Đó là những mối quan tâm độc lập thường có thể và cần được xử lý bởi một số lớp khác (ví dụ: nguồn dữ liệu chuyên dụng cho một lớp mô hình cụ thể) thay vì làm đầy bộ điều khiển chế độ xem.

+0

Cảm ơn bạn. Âm thanh có thể thực hiện được và giống như đầu tư tốt cho các dự án futuere. Bạn có biết bất kỳ exaple mã tốt nào có thể thay thế UITableView không? –

+0

@Jonah Làm thế nào để bạn thực hiện thủ công ba viên đạn cuối cùng trong UIViewController (nghĩa là lựa chọn rõ ràng mỗi lần xem bảng được hiển thị, nhấp nháy các chỉ số cuộn của chế độ xem bảng khi xem bảng đã xuất hiện và triển khai phương thức siêu lớp setEditing: animated: o toggle the chỉnh sửa chế độ của bảng)? Hiện tại các ô của tôi vẫn được đánh dấu khi tôi quay lại chế độ xem bảng, các thanh cuộn không nhấp nháy và nhấn nút Chỉnh sửa hoàn toàn không có gì (thậm chí không thay đổi văn bản của nút thành Xong). Bạn có thể vui lòng chỉnh sửa câu trả lời của bạn bằng các liên kết hoặc giải thích về cách thực hiện những điều này không? – golddove

+0

@golddove Tôi miễn cưỡng cung cấp các giải pháp bỏ qua sự hiểu biết vấn đề ở bàn tay vì vậy tôi không chắc chắn rằng các ví dụ mã sẽ hữu ích ở đây.Nếu tôi không chắc chắn cách thực hiện các chỉ số cuộn nhấp nháy, tôi có thể bắt đầu bằng cách xem tài liệu lớp cho 'UITableView', không cung cấp bất kỳ giải pháp tức thời nào nhưng tôi thấy nó là lớp con của' UIScrollView' tổng quát hơn. 'UIScrollView' có phương thức' flashScrollIndicators'. Gọi phương thức đó bên trong 'viewDidAppear' của trình điều khiển sẽ tái tạo lại hành vi được nhìn thấy trong' UITableViewController'. – Jonah

0

Dường như UITableViewController sẽ xử lý rất nhiều vấn đề về quản lý mà bạn thực sự có thể làm cho chính mình nếu bạn muốn. Kiểm tra the documentation - nó sẽ tự động tạo một UITableView cho bạn, tải lại nó, vv

+0

"UITableView sẽ xử lý rất nhiều vấn đề về quản lý" - tôi cho rằng bạn đã có nghĩa là UITableViewController? Bên cạnh đó, tác giả đã chỉ ra rằng anh ta có nghĩa là 'bên cạnh những thứ hiển nhiên' mà bạn đang viết. – Vive

3

Vì vậy, mặc dù những thứ rõ ràng, được có bất kỳ điều kỳ diệu mà UITableViewController chăm sóc?

Không phải là tôi biết. Theo như tôi biết, UITableViewController chủ yếu là một lớp tiện lợi có thể được thay thế bằng lớp con của riêng bạn để thêm một vài dòng mã.

Apple's class documentation khá nhiều nói rằng tất cả những gì UITableViewController làm (và tôi không lặp lại ở đây vì nó có thể thay đổi trong tương lai). Đôi khi, thông tin bổ sung có thể được thu thập từ tệp tiêu đề của một lớp, nhưng trong trường hợp của UITableViewController.h, các bình luận mã nguồn chỉ lặp lại những gì đã có trong tài liệu lớp học.

Cuối cùng, bạn phải tự quyết định những gì bạn muốn sao chép trong lớp con của riêng bạn. Có lẽ dự án của bạn không cần xử lý .nib? Hoặc không thể chỉnh sửa chế độ xem bảng nào của bạn? Vì vậy, chỉ cần không mã ...

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