DTPickerPresenter 是 UIDatePicker 和 UIPickerView 的干净现代封装。它提供了在 iPhone 和 iPad 上以非常少的代码展示 UIDatePicker、 UIPickerView 和任意 UIView 的简单方式。例如,展示 UIDatePicker 只需两行代码
DTDatePickerPresenter * presenter = [DTDatePickerPresenter presenterWithChangeBlock:^(NSDate * selectedDate) {
// Probably format with locale and time zones?
}];
[self.datePickerTextField dt_setPresenter:presenter];
在 iPhone 上,您可能会使用 UITextField inputView 来展示 UIDatePicker。
@interface iPhonePickerController ()
@property (weak, nonatomic) IBOutlet UITextField * datePickerTextField;
@end
-(void)setupPicker
{
__weak typeof (self) weakSelf = self;
DTDatePickerPresenter * presenter = [DTDatePickerPresenter presenterWithChangeBlock:^(NSDate * selectedDate) {
// Probably format with locale and time zones?
}];
[self.datePickerTextField dt_setPresenter:presenter];
}
这就这么简单。您只需创建显示器并将其附加到 UITextField,显示器就会完成其余的工作。
在 iPad 上,UIDatePicker 的传统用法包括创建包含它的 UIDatePicker、UIViewController、具有 UIDatePicker 内容大小的 UIPopoverController,然后处理 UIDatePicker 的事件。让我们简化它!使用 DTPickerPresenter,您需要做的是
__weak typeof (self) weakSelf = self;
DTDatePickerPresenter * presenter = [DTDatePickerPresenter presenterWithChangeBlock:^(NSDate * selectedDate) {
//Process date
}];
self.popover = [UIPopoverController dt_popoverWithPresenter:presenter];
// present popover.
因此,只需两行代码,我们就创建了日期选择的 UIPopoverController。但让我们不要停止在这里!
适用于 UIDatePicker 的相同规则也适用于 UIPickerView。在 iPhone 上使用 UITextField inputView,在 iPad 上使用 UIPopoverController。我们需要额外的数据源和代理属性。在我们开始 UI 展示之前,让我们深入了解 UIPickerViewDelegate 和 UIPickerViewDatasource 封装类。
DTPickerPresenter 以抽象协议 DTPickerDatasourceProtocol
和具体实现 DTPickerDatasource
的形式提供了数据源封装。创建数据源对象很简单
DTPickerDataSource * datasource = [DTPickerDataSource datasourceWithItems:@[@[@"foo", @"bar"], @[@"1", @"2"]]];
此数据源将代表两个组件(轮胎)和每个两行。目前支持NSString和NSAttributedString类。如果您需要其他定制,例如组件的宽度和高度,或定制的行视图,请子类化DTPickerDatasource类。让我们继续到展示器的部分。首先,让我们创建一个更改块,每次 UIPickerView选择改变时都会调用该块。
__weak typeof (self) weakSelf = self;
DTPickerChangeBlock block = ^(NSArray * selectedComponents, NSIndexPath * selectedIndexPath) {
// Process UIPickerView changes
};
展示与之前UIDatePicker相同。
DTPickerDataSource * datasource = [DTPickerDataSource datasourceWithItems:@[@[@"foo", @"bar"], @[@"1", @"2"]]];
__weak typeof (self) weakSelf = self;
DTPickerChangeBlock block = ^(NSArray * selectedComponents, NSIndexPath * selectedIndexPath) {
// Process UIPickerView changes
};
DTPickerViewPresenter * wheelPresenter = [DTPickerViewPresenter presenterWithDatasource:datasource
changeBlock:block];
[self.wheelPickerTextField dt_setPresenter:wheelPresenter];
DTPickerDataSource * datasource = [DTPickerDataSource datasourceWithItems:@[@[@"foo", @"bar"], @[@"1", @"2"]]];
__weak typeof (self) weakSelf = self;
DTPickerChangeBlock block = ^(NSArray * selectedComponents, NSIndexPath * selectedIndexPath) {
// Process UIPickerView changes
};
DTPickerViewPresenter * wheelPresenter = [DTPickerViewPresenter presenterWithDatasource:datasource
changeBlock:block];
self.popover = [UIPopoverController dt_popoverWithPresenter:wheelPresenter];
// Present popover
pod 'DTPickerPresenter', '~> 0.2.0'