2013-02-26 1 views
2

참고 : 이것은 기능 질문이 아닌 DESIGN 질문입니다. 나는 다음을 구현하는 방법을 이미 알고 있으며, 나는 그것을 설계하는 가장 좋은 방법을 찾아 내려고 노력하고있다.사용자 정의 inputViews를 사용하여 iOS 프로그램을 설계하는 방법

나는 애플 리케이션을 통해 UIViewControllers 몇 가지 UITextFieldsUIDatePicker 입력보기를 가지고 iOS 애플 리케이션을 가지고. 이 코드는 다음과 같습니다 :

- (void) viewDidLoad 
{ 
    self.dateField.inputView = [self createDatePicker]; 
} 

- (UIView *) createDatePicker 
{ 
    UIView *pickerView = [[UIView alloc] initWithFrame:CGRectMake(0, self.view.frame.size.height, self.view.frame.size.width, TOOLBAR_HEIGHT + KEYBOARD_HEIGHT)]; 

    UIDatePicker *picker = [[UIDatePicker alloc] init]; 
    [picker sizeToFit]; 
    picker.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight); 
    picker.datePickerMode = UIDatePickerModeDate; 
    [picker addTarget:self action:@selector(updateDateField:) forControlEvents:UIControlEventValueChanged]; 
    [pickerView addSubview:picker]; 


    // Create done button 
    UIToolbar* toolBar = [[UIToolbar alloc] init]; 
    toolBar.barStyle = UIBarStyleBlackTranslucent; 
    toolBar.translucent = YES; 
    toolBar.tintColor = nil; 
    [toolBar sizeToFit]; 

    UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; 
    UIBarButtonItem* doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" 
                    style:UIBarButtonItemStyleDone target:self 
                    action:@selector(doneUsingPicker)]; 

    [toolBar setItems:[NSArray arrayWithObjects:flexibleSpace, doneButton, nil]]; 
    [pickerView addSubview:toolBar]; 
    picker.frame = CGRectMake(0, toolBar.frame.size.height, self.view.frame.size.width, pickerView.frame.size.height - TOOLBAR_HEIGHT); 
    toolBar.frame = CGRectMake(0, 0, self.view.frame.size.width, TOOLBAR_HEIGHT); 
    return pickerView; 
} 

- (void) doneUsingPicker 
{ 
    [self.dateField resignFirstResponder]; 
} 


- (void) updateDateField: (UIDatePicker *) datePicker 
{ 
    self.dateField.text = [self.formatter stringFromDate:datePicker.date]; 
} 

문제는, 나는 UIDatePicker의 inputviews와 UITextFields가 다른 클래스에 응용 프로그램 전체에이 코드를 붙여 넣기하는 데 계속. 중복 코드를 최소화하기 위해이를 설계하는 가장 좋은 방법은 무엇입니까? 이 코드가 포함 된 UIDatePickerableViewController 수퍼 클래스가 있다고 생각했지만 확장 가능하지는 않습니다. 예를 들어, 곧 다른 유형의 입력보기가 텍스트 필드에 첨부 될 수 있다면 어떻게 될까요? 어떻게 설계해야합니까?

답변

2

공통 수퍼 클래스의 클래스간에 공유 된 코드/메소드를 리팩터링하고 다른 부분 만 수정할 수있는 하위 클래스를 상속 할 수 있습니다.

또는 다른 관점에서 문제에 접근하는 경우 : 사용자 정의 InputWiewWithDatePicker 클래스를 만들고 해당 클래스의 - init 메서드 내에서 (self-) 구성 및 초기화 코드를 이동하십시오. 당신이없는이 방법은 모든 곳에서 모든 붙여 넣기하고, 단 하나의 선이 중복됩니다

customControl = [[InputViewWithDatePicker alloc] init]; 
2

내 첫번째 생각은있는 날짜 선택하고 텍스트 필드를 포함하는 새 UIView의 서브 클래스를 생성하는 것입니다 당신이 원하는 레이아웃. 이것은 펜촉이나 코드로 할 수 있습니다. 이 새로운 종류의보기를 추가하려는 곳이면 viewDidLoad의 한쪽 눈금자이거나 nib에 UIView를 페인트하고 새보기 클래스로 클래스를 변경합니다.

1

원하는 레이아웃을 서브 클래스 화하면 할당 할 때 정의한 모든 옵션이 제공됩니다.

관련 문제