2

请注意,这是一个设计问题,而不是功能问题。我已经知道如何实现以下内容,我只是想找出设计它的最佳方法。

我有一个 iOS 应用程序,UIViewControllers整个应用程序中的一些应用程序都有UITextFields输入UIDatePicker视图。代码如下:

- (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 输入视图的不同类中。什么是最好的设计方法,以尽量减少重复代码。我曾想过拥有一个UIDatePickerableViewController包含此代码的超类,但这似乎不可扩展。例如,如果我很快就会有其他类型的输入视图可以附加到文本字段。我应该如何设计这个?

4

3 回答 3

2

您可以重构公共超类中的类之间共享的代码/方法,并继承子类,您只需在其中修改需要不同的部分。

或者,如果您从不同的角度处理问题:创建一个自定义InputWiewWithDatePicker类并将(自)配置和初始化代码移动到- init该类的方法中。这样您就不必将所有这些都粘贴到任何地方,并且只会复制一行:

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

我的第一个想法是创建一个新的 UIView 子类,其中包含日期选择器和文本字段以及您想要的布局。这可以用笔尖或代码来完成。任何你想添加这种新视图的地方,它要么是 viewDidLoad 中的单线,要么将 UIView 绘制到 nib 中并将它的类更改为你的新视图类。

于 2013-02-26T21:11:19.733 回答
1

子类化您想要的布局,然后当您分配它时,它将带有您定义的所有选项。

于 2013-02-26T22:02:22.610 回答