2011-04-14 6 views
1

저는 UISegmentedControl의 사용자 지정 구현을하고 있습니다. 구성 데이터를받을 수 있고 UISegmentedControl과 비슷한 사용자 지정보기를 얻을 수있는 구성 요소를 만들고 싶습니다. 사용자 지정 구성 요소 작업 : 하위 클래스 UIView 또는 UIViewController?

나는 UIView의 하위 클래스를 시작하고이 코드로 사용자 정의 UISegmentedControl을 만들 수 있습니다

CustomSegment *segment = [[CustomSegment alloc] 
         initWithTitles:[NSArray arrayWithObjects:@"one",@"two",nil]]; 
[self.window addSubview:segment]; 

을하지만 지금은 내 수업을 개선하고 그것을 좀 더 사용자 정의 매개 변수를 추가하고 싶습니다. 예를 들어, 사용자 정의 분리 기호를 추가하고 버튼 글꼴을 정의하는 등의 작업을 할 수 있습니다. 여기 내 의구심 : UIView 하위 클래스에서 작업하는 것이 더 좋습니까, 아니면 관리 할 수있는 UIViewController를 하위 클래스로 제안 하시겠습니까? - (void)loadView-(void)viewDidLoad과 같은 메소드의 계층 구조?

간단한 UIView 하위 클래스에서 사용자 정의 init 메서드를 시작하면 바로 설정이 하위 뷰 ... UIViewController를 사용하는 동안 사용자 정의 init을 호출하고 내 하위 뷰가 빌드 된 방식을 정의 할 수 있습니다. - (void) loadView.

+0

또한 UIControl 서브 클래 싱을 고려하십시오 – Felix

답변

4

UIViewController를 사용하지 말고 그냥 UIView 클래스를 확장하고 기능을 계속 확장하십시오.

추가 한 각 하위보기 (예 : 버튼)에 포인터를 저장하여 나중에 액세스 할 수 있도록하십시오.

는 예를 들어, 단추 레이블 제목을 변경하기위한 사용자 정의 세터가 될 것이다, 사용자 정의 세터를 정의 등등

- (void) setButton1Title:(NSString*)str forState:(UIControlState)state{ 
    //You can add some control here 
    if ([str length] > 20) return; 
    [_button1 setTitle:str forState:state]; //_button1 is my reference to the button 
} 

그리고있다. 하위보기에 대한 직접 액세스를 제공하지 말고 대신 방법을 사용하십시오.

또한 "layoutSubviews"메서드를 사용하여보기가 사용자 정의보기에 표시되는 방법을 정의 할 수 있습니다.

희망이 있으면 도움이됩니다.


편집 : 귀하의 경우에는, lauoutSubviews 방법을 사용하는 이유는 표시되지 않습니다하지만 난 말하려고 있었는지를 보여주고 싶다.

예를 들어 응용 프로그램에서 "연락처"개체를 나타내는 UIView 클래스를 만들어야한다고 가정 해 보겠습니다.

@interface ContactView : UIView{ 
    UILabel* _nameLabel; 
    UILabel* _ageLabel; 
    Contact* _contact; 
} 
@property (retain) Contact* contact; 

@end 

@implementation ContactView 

@synthetize contact = _contact; 

-(id)initWithContact:(Contact*)c{ 
    self = [super init]; 
    if (self) { 
     _nameLabel = [[UILabel alloc] init]; 
     _nameLabel.frame = CGRectZero; 
     [self addSubview:_nameLabel]; 
     [_nameLabel release]; 

     _ageLabel = [[UILabel alloc] init]; 
     _ageLabel.frame = CGRectZero; 
     [self addSubview:_ageLabel]; 
     [_ageLabel release]; 

     self.contact = c; 
    } 
} 

- (void) layoutSubviews{ 
    [super layoutSubviews]; 

    _nameLabel.frame = CGRectMake(0.0f, 0.0f, 200.0f, 25.0f); 
    _ageLabel.frame = CGRectMake(0.0f, 25.0f, 200.0f, 25.0f); 

    if (self.contact){ 
     _nameLabel.text = self.contact.name; 
     _ageLabel.text = self.contact.age; 
    }else{ 
     _nameLabel.text = @"Unavailable"; 
     _ageLabel.text = @"Unavailable"; 
    } 
} 

- (void) setContact:(Contact*)c{ 
    self.contact = c; 
    [self layoutSubviews]; 
} 

@end 

체크 아웃은 "layoutSubiews는"레이블에 대한 올바른 프레임과 데이터를 설정하는 데 사용됩니다 방법 :

이 내가 할 것 인 것이다. 일반적으로보기를 재사용해야하는 사용자 지정 UITableViewCells를 만들 때 많이 사용합니다.

혼란 스러울 지 알려주세요.

+0

답변 주셔서 감사합니다. 오리엔테이션 관리를 위해 layoutSubviews와 상호 작용하는 데 사용되었습니다. drawRect와 비슷한 방식으로이 함수를 사용 하시겠습니까? 그것에 대해 더 자세히 설명해 주시겠습니까? – MatterGoal

+0

원래의 코멘트를 편집했습니다. – macnico

+0

나는 setSeedview를 직접 호출하지 말고 setNeedLayout을 호출해야한다고 확신하지만 나머지 코드는 무엇을 의미하는지 이해한다. – MatterGoal

관련 문제