DTPickerPresenter 0.2.0

DTPickerPresenter 0.2.0

测试测试
语言语言 Obj-CObjective C
许可 MIT
发布上次发布2014年12月

Denys Telezhkin 维护。



构建状态       MIT 许可协议

DTPickerPresenter

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

UIDatePicker

在 iPhone 上,您可能会使用 UITextField inputView 来展示 UIDatePicker。

iPhone

@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

在 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。但让我们不要停止在这里!

UIPickerView

适用于 UIDatePicker 的相同规则也适用于 UIPickerView。在 iPhone 上使用 UITextField inputView,在 iPad 上使用 UIPopoverController。我们需要额外的数据源和代理属性。在我们开始 UI 展示之前,让我们深入了解 UIPickerViewDelegate 和 UIPickerViewDatasource 封装类。

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相同。

iPhone

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

iPad

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'

最佳实践

  • 注意保留周期!展示对象存储在UITextField或UIPopoverController实例上,所以如果您没有将其设置为弱引用而引用self,则会产生保留周期。

要求

  • iOS 6及以上版本
  • ARC