2012-11-02 2 views
33

UIButton의 서브 클래 싱에 관한 스택 오버 플로우에 대해 몇 가지 질문을했고, 두 사람이 UIButton을 서브 클래스 화해서는 안된다는 사실을 알려주었습니다.왜 UIButton을 서브 클래스하지 않아야합니까?

UIButton 서브 클래스 지정의 부정적인 점은 무엇입니까? 그리고 그것이 모호하다는 것을 압니다 만, UIButton을 서브 클래 싱하는 다른 대안은 무엇입니까?

+1

UIButton을 서브 클래 싱하는 이유는 무엇입니까? 'custom'버튼 유형을 지정하십시오. 그 밖의 무엇이 필요합니까? –

+0

앞으로 서브 클래스를 만들고 싶다면 더 많은 것을 물어 보았습니다. 왜 그렇게하지 말아야할까요? 하지만 지금은 배경, 글꼴, 텍스트 주위에 패딩 크기가있는 약 20 개의 버튼이 앱에 있습니다. 그래서 서브 클래 싱하여 동일한 시간과 코드를 사용하고 싶었습니다. – KKendall

+2

UIButton을 하위 클래스로 만들 수있는 이유가 없습니다. 실제로 IB를 사용하여 버튼 모양을 정의 할 수 있습니다. 왜? 디자인 유연성. 많은 사람들이 UIButton을 서브 클래 싱했습니다. UIButton 서브 클래 싱했습니다. 이것은 반복 될 수는 있지만 증명이 결여 된 것일 수 없다는이 신념입니다. –

답변

35

코코아 프레임 워크는 Object Composition 패턴이 전통적인 클래스 계층 구조보다 적절하다는 접근 방식을 취합니다.

일반적으로 이것은 단추의 다양한 측면을 처리하도록 다른 개체를 설정할 수있는 UIButton에 속성이있을 가능성이 높다는 것을 의미합니다. 이것은 단추 작동 방식을 "사용자 정의"하는 기본 방법입니다.

이 패턴의 주된 이유 중 하나는 많은 라이브러리 구성 요소가 단추를 만들고 사용자가 하위 클래스의 인스턴스를 만들지 못한다는 것입니다.

편집, 자신의 팩토리 메소드

나는 앱에 많은 버튼에서 동일한 버튼 설정이있을 때 시간을 절약에 대한 위의 의견을주의했다. 이것은 Factory Method 디자인 패턴을 사용하기에 좋은 시간이며, Objective-C에서는 implement it with a Category을 사용하여 UIButton에서 직접 사용할 수 있습니다.

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

비록 중요하지만, "UIButton"이 실제로 이런 점에서 독특하기 때문에 "호의 구성"이 정말로 좋은 대답 인 것은 아닙니다. 나는 확실히 당신의 포스트가 좋은 점을 만들기 때문에 downvote하지 않을 것이다 (사실, 나는 upvoted했다). – justin

+0

@justin, 나는 항상 좋은 대화에 찬성합니다! 어디에서나 블로그에 게시하거나 관련 토론에 대한 링크를 어딘가에 있습니까? –

+3

필자는 주제에 대한 내 대답에서 Cocoa-Dev 목록의 링크를 추가했습니다. 내게 연락하고 싶다면 트위터를 통해 개인적으로나 공개적으로 나에게 메시지를 보내는 것이 환영합니다 (내 프로필에 핸들이 있음). 나는 블로그를 쓰지 않는다 - 그래서 나의 주요 코딩 냉각기이다. 나는 낮은 프로필을 유지. – justin

15

UIButton가 예상대로 작동하려면 필요합니다 (특히, 즉 추가 재정의 사용자가 정의 할 수 +buttonWithType:) 몇 복잡성/미묘/제한이 가지 특별한 점에서입니다 때문입니다. 보통 -initWithFrame: (및 XIB에서 사용되는 경우 -initWithCoder:) 이상입니다. IDK는 프레임 워크 작성자가 이러한 세부 사항을 우리 도메인으로 유출시킬 수 있도록 허용 한 이유가 무엇인지 IDK가 알았지 만 지금은이를 처리해야합니다. 제한 사항은 구현시 미리 설정된 시스템 버튼 스타일에 의존해서는 안됩니다 (즉, 확장해야 함). UIButton 하위 클래스의 시작 지점으로 UIButtonTypeCustom을 사용해야합니다.

On implementing a subclass of UIButton

10


당신이 당신 자신의 '파단'대신 UIControl 서브 클래 싱해야 더 가벼운 무언가를 찾고 있다면. 있는 UIButton은 UIControl 서브 클래스와 같은 이벤트를 처리 할 수 ​​깨끗하게하여 UIControl 서브 클래스에 포함 된 모든 뷰 layoutSubviews하고있는 UIButton와 함께 불필요한 조회를 방지 할 수 있도록 UIView의

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

UIControl의 서브 클래스입니다. 본질적으로 당신은 당신 자신의 'UIButton'을 만들어 내고 있지만 실제로 원하지도 필요로하지 않는 행동과 기능을 다루지 않아도됩니다.

관련 문제