2012-11-02 30 views
33

Tôi đã hỏi một vài câu hỏi về ngăn xếp tràn về phân lớp UIButton và một vài người đã thông báo với tôi rằng tôi không nên phân loại một số UIButton.Tại sao tôi không nên phân loại UIButton?

Phủ định của phân lớp là UIButton là gì? Và tôi biết nó mơ hồ, nhưng các lựa chọn thay thế khác để phân lớp là UIButton là gì?

+1

Lý do của bạn để phân lớp UIButton là gì? Chỉ định loại nút 'tùy chỉnh'. Điều gì khác là cần thiết? –

+0

Tôi đã hỏi nhiều hơn chỉ khi tôi muốn phân lớp trong tương lai, tại sao tôi không nên làm điều đó. Nhưng ngay bây giờ tôi sẽ có khoảng 20 nút trong ứng dụng của tôi có cùng một nền, phông chữ, kích thước padding xung quanh văn bản, vv Vì vậy, tôi muốn cùng một số thời gian và mã bằng cách phân lớp. – KKendall

+2

Không có lý do gì bạn không thể phân lớp UIButton. Trong thực tế, tôi làm điều đó để tôi có thể sử dụng IB để xác định giao diện của nút của tôi. Tại sao? Thiết kế linh hoạt. Nhiều người có UIButton được phân lớp. Tôi đã phân lớp UIButton. Niềm tin này rằng nó không thể là một cái gì đó mà được lặp đi lặp lại nhưng thiếu bằng chứng. –

Trả lời

35

Khung công tác Cocoa sử dụng cách tiếp cận mà mẫu Thành phần đối tượng phù hợp hơn so với phân cấp lớp truyền thống.

Nói chung, điều này có nghĩa là có khả năng là thuộc tính trên UIButton nơi bạn có thể đặt một đối tượng khác để xử lý các khía cạnh khác nhau của nút. Đây là cách ưa thích để "tùy chỉnh" cách nút của bạn hoạt động.

Một trong những lý do chính cho mẫu này là nhiều thành phần thư viện tạo nút và không biết rằng bạn muốn chúng tạo các phiên bản của lớp con của bạn.

chỉnh sửa, phương pháp nhà máy của riêng bạn

tôi nhận thấy bình luận của bạn ở trên về tiết kiệm thời gian khi bạn có nút cấu hình giống nhau trên nhiều nút trong ứng dụng của bạn. Đây là thời điểm tuyệt vời để sử dụng mẫu thiết kế Phương thức Nhà máy và trong Mục tiêu-C, bạn có thể implement it with a Category để nó có sẵn trực tiếp trên UIButton.

@interface UIButton (MyCompanyFactory) 
+(UIButton *) buttonWithMyCompanyStyles; 
@end 
@implementation UIButton 
+(UIButton *) buttonWithMyCompanyStyles { 
    UIButton *theButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    // [theButton set... 
    return theButton; 
} 
@end 
+0

mặc dù quan trọng để thiết kế, tôi không chắc chắn "thành phần ủng hộ" thực sự là một câu trả lời tốt cho câu hỏi bởi vì 'UIButton' thực sự là phong cách riêng về vấn đề này. tôi chắc chắn sẽ không downvote vì bài viết của bạn làm cho điểm tốt (trên thực tế, tôi upvoted). – justin

+0

@justin, tôi luôn ủng hộ cuộc trò chuyện tốt! Bạn có blog ở bất cứ đâu, hoặc có liên kết đến một cuộc thảo luận liên quan ở đâu đó không? –

+3

Tôi đã thêm một liên kết từ danh sách Cocoa-Dev trong câu trả lời của tôi về chủ đề này. Nếu bạn muốn tiếp cận với tôi, bạn chắc chắn sẽ được chào đón để nhắn tin cho tôi một cách riêng tư hoặc công khai thông qua twitter (xử lý là trong hồ sơ SO của tôi). Tôi không blog - SO là mã nguồn nước chính của tôi. Tôi giữ một hồ sơ thấp. – justin

15

Đó là vì UIButton là loại đặc biệt ở chỗ có rất phức tạp vài/tinh tế/hạn chế (ví dụ: thêm ghi đè để bạn có thể xác định, đặc biệt là +buttonWithType:) cần thiết để cho nó hoạt động như mong đợi. Nó nhiều hơn bình thường -initWithFrame: (và -initWithCoder:, nếu được sử dụng trong XIB). IDK tại sao các tác giả khung công tác cho phép các chi tiết đó rò rỉ ra ngoài miền của chúng tôi, nhưng đó là thứ mà chúng tôi phải xử lý ngay bây giờ. Hạn chế là việc triển khai của bạn không được phụ thuộc vào các kiểu nút hệ thống được đặt trước (tức là mở rộng); Bạn phải giả định UIButtonTypeCustom làm điểm bắt đầu cho lớp con UIButton.


On implementing a subclass of UIButton

10

Nếu bạn chỉ tìm kiếm cái gì nhẹ hơn với riêng 'subviews' của bạn, bạn nên được thay subclassing UIControl. UIButton lớp con UIControl và có thể xử lý các sự kiện, như:

[mySubclassedButtonFromUIControl addTarget:self action:@selector(_doSomething:) forControlEvents:UIControlEventTouchUpInside]; 

lớp con UIControl UIView để bạn có thể sạch layoutSubviews trên bất kỳ quan điểm chứa bởi lớp con UIControl của bạn và tránh quan điểm không cần thiết đi kèm với UIButton. Về bản chất bạn chỉ đang tạo ra 'UIButton' của riêng bạn nhưng bạn tránh phải làm việc xung quanh hành vi và chức năng mà bạn không thực sự muốn hoặc cần.

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