2012-02-09 28 views
6

Một trong những nguyên tắc chính của MVC là số lượt xem không bao giờ dữ liệu của riêng mình. Nguyên tắc này được lặp đi lặp lại nhiều lần trong phiên WWDC 116. Nhưng tại sao UIImageView (xem) sở hữu UIImage (một mô hình)? Nó không vi phạm các nguyên tắc trên?Tại sao UIImageView sở hữu UIImage. Liệu nó vi phạm nguyên tắc MVC?

Hoặc tôi có hiểu nhầm bất cứ điều gì ở đây không? Có lẽ chỉ vì UIImageView có thuộc tính image không có nghĩa là nó sở hữu UIImage?

Trả lời

7

Từ riêng thường được sử dụng chỉ để cho biết rằng một đối tượng đã giữ lại một đối tượng khác. Rõ ràng, một khung nhìn hiển thị một hình ảnh nên giữ lại hình ảnh đó miễn là nó cần nó. Nhưng khái niệm "quyền sở hữu" này rất hạn chế và không có nghĩa là chế độ xem phải chịu trách nhiệm lưu trữ, thay đổi hoặc quản lý hình ảnh khác.

+0

Vì vậy, nó có nghĩa là UIImageView sẽ không bao giờ trực tiếp thay đổi UIImage, để lại công việc đó cho một UIController phải không? Có ý nghĩa, thanks =) –

+0

Nhưng tại sao UIImageView cần giữ lại hình ảnh? Nó chỉ cần hình ảnh mà thời điểm nó vẽ chính nó để màn hình phải không? –

+2

UIImageView cần tham chiếu đến hình ảnh vì nó có thể cần vẽ lại chính nó và dữ liệu cần làm đó là hình ảnh. Nếu nó không giữ lại hình ảnh, sau đó hình ảnh có thể dễ dàng được deallocated bất cứ lúc nào, và xem sẽ được trái với một con trỏ không hợp lệ (và có thể sụp đổ). Nó giữ lại hình ảnh mà nó đang sử dụng cho đến khi ai đó bảo nó sử dụng một số hình ảnh khác thay thế. – Caleb

4

Câu hỏi hay. Theo tôi, UIImageView không "sở hữu" UIImage, nhưng rõ ràng nó cần phải có một tham chiếu đến nó. UIImageView không khởi tạo hình ảnh.

Đối số tương tự có thể được thực hiện cho một nhãn UILabel (dạng xem) có thuộc tính văn bản (mô hình).

+0

Tại sao cần phải có tham chiếu đến UIImage? Thông thường sẽ có một bộ điều khiển đứng giữa khung nhìn và mô hình. Khi mô hình thay đổi, nó sẽ thông báo cho bộ điều khiển, sau đó bộ điều khiển sẽ cho biết chế độ xem sẽ hiển thị lại. Nhưng ở đây, UIImageView tự động tái xuất hiện khi thuộc tính hình ảnh của nó bị thay đổi. Có, nó thực sự âm thanh ngu ngốc khi bạn phải tách một UILabel và tài sản văn bản của nó, nhưng đây không phải là lời giảng MVC lý tưởng phải không? –

+0

Trong một mô hình MVC thuần túy, bộ điều khiển sẽ "sở hữu" và chứa tham chiếu đến cả chế độ xem và mô hình. Chế độ xem sẽ có tham chiếu đến mô hình và biết cách hiển thị chính nó. Bộ điều khiển vẫn chịu trách nhiệm cho biết chế độ xem kiểu mẫu nào để sử dụng. – picciano

+0

Đồng ý. Nhưng quan điểm không cần một mô hình trong danh sách ivar của nó (hoặc danh sách tài sản). Nó có thể chỉ có một phương thức như '- (void) renderWithModel: (Model *) m;' - mà sẽ được gọi bởi bộ điều khiển khi mô hình được thay đổi đúng không? Tôi hoàn toàn hiểu nếu UIKit làm cho UIImageView có một thuộc tính hình ảnh cho lý do hiệu suất (tại sao cần một bộ điều khiển cho điều tầm thường), nhưng sau đó nó bằng cách nào đó vi phạm lý tưởng MVC tôi có trong tâm trí của tôi. –

1

Về mặt kỹ thuật, UIImageView không sở hữu hình ảnh, nó giữ tham chiếu đến hình ảnh sao chép của hình ảnh để có thể hiển thị hiệu quả. UIImage chỉ xảy ra là không thay đổi, do đó, một bản sao cũng giống như bản gốc.

UILabel hoạt động giống hệt nhau, nhưng tuyên bố rõ ràng thuộc tính textcopy.

+0

Cảm ơn bạn đã mang đến điểm có thể thay đổi/không thay đổi được :) –

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