如何使用自定义inputView设计iOS程序

时间:2013-02-26 20:55:09

标签: iphone ios objective-c design-patterns

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

我有一个iOS应用,其中整个应用中的一些UIViewControllers具有UITextFieldsUIDatePicker输入视图。代码如下:

- (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超类,但这似乎并不可扩展。例如,如果我很快就会有其他类型的输入视图可以附加到文本字段。我该如何设计呢?

3 个答案:

答案 0 :(得分:2)

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

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

customControl = [[InputViewWithDatePicker alloc] init];

答案 1 :(得分:2)

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

答案 2 :(得分:1)

对您所需的布局进行子类化,然后在分配时,它将包含您定义的所有选项。