2

これはデザインの問題であり、機能の問題ではないことに注意してください。以下を実装する方法はすでに知っています。それを設計するための最良の方法を見つけようとしています。

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];
}

問題は、UITextFields と UIDatePicker inputviews を持つさまざまなクラスのアプリ全体にこのコードを貼り付けなければならないことです。重複コードを最小限に抑えるためにこれを設計する最良の方法は何でしょうか。このコードを含むスーパークラスを持つことを考えましたUIDatePickerableViewControllerが、これは拡張可能ではないようです。たとえば、テキスト フィールドにアタッチできる他の種類の入力ビューがすぐにあるとしたらどうでしょう。これをどのように設計すればよいですか?

4

3 に答える 3

2

共通のスーパークラスのクラス間で共有されるコード/メソッドをリファクタリングし、異なる必要がある部分のみを変更するサブクラスを継承できます。

または、別の観点から問題に取り組む場合: カスタムInputWiewWithDatePickerクラスを作成し、(自己) 構成と初期化コード- initをそのクラスのメソッド内に移動します。この方法では、これをどこにでも貼り付ける必要はなく、1 行だけが複製されます。

customControl = [[InputViewWithDatePicker alloc] init];
于 2013-02-26T21:00:08.627 に答える
2

My first thought would be to create a new UIView subclass that contains a date picker and text field with the layout you desire. This can be done with a nib or in code. Anyplace you want to add this new kind of view, it's either a one-liner in viewDidLoad, or paint a UIView into a nib and change it's class to your new view class.

于 2013-02-26T21:11:19.733 に答える
1

必要なレイアウトをサブクラス化し、それを割り当てると、定義したすべてのオプションが付属します。

于 2013-02-26T22:02:22.610 に答える