分享一个封装适配器,简化 UIPickerView 的 80% 使用场景

2015-06-03 23:21:27 +08:00
 banxi1988

NumberPickerAdapter 使用简介

很大情况下,简单的对一些API进行封装就可以简化 80% 的使用场景.
为什么说 80% ? 应该有一个法则中 28法则.

NumberPickerAdapter的用法

非常简单,使用如下:
以一个月份选择 View 为例

// 1)声明月份选择适配器
 let monthPickerAdapter = NumberPickerAdapter(range: 1...12)  

 // 2) 创建UIPickerView
   let monthPicker = UIPickerView(frame: CGRectZero)

// 3) 设置数据源及委托
   monthPicker.dataSource = monthPickerAdapter
   monthPicker.delegate = monthPickerAdapter

// 4) 使用闭包 (Block) 响应月份选择变更事件
 monthPickerAdapter.selectNumberBlock = { (month) in
      self.updateDayPickerWithMonth(month)
 }

基本的使用就是这么简单.
基本的简化逻辑就是,将 DataSource 和 Delegate整合在一起了
事实上,对于 iOS 8上的 AlertController 也是这样的逻辑,
简单的事件处理,提供一个Block 就解决了,不用再搞一个 Delegate.

不用Delegate的,另一个好处是,代码都在一块. 这样维护,或者阅读起来比较方便吧.

对于外观的定制,也提供发如下几个常用的定制属性,示例如下:

adapter.selectedTitleColor = AppColors.colorPrimary
 adapter.titleColor = UIColor(white: 0.509, alpha: 1.0)
 adapter.titleFont = UIFont.systemFontOfSize(17)

方便获得 UIPickerView 当前值的Cateogry

UIPickerView 添加了一个 Category.
以便在使用 NumberPickerAdapter 时,方便的获得所选的数字

monthPicker.selectedNumber

对应代码:

var selectedNumber:Int{
        if let adapter = dataSource as? NumberPickerAdapter{
            return adapter.numberAtRow(selectedRowInComponent(0))
        }
        return 0
    }

有时很重要的一点是,方便设置值

由于 UIPickerView 实际设置当前值是通过,对应行来实现的.
如果你的数字是不连续的.就可能会有用户设置的值不规则

这个时候,可以试试 NumberPickerAdapter 提供的
func bestRowOfNumber(number:Int) -> Int
来根据某一个值,查找最匹配的行

显示值的转换

针对数字的显示, 有时你想数字显示为 "09" ,有前导0
var numberFormat = "%d"
默认情况下,只是将数字转换成字符串.
如果需要设置显示为 "09" 可以,使用标准的格式化手段
adapter.numberFormat = "%02d"

这样,这方面的要求也解决了.

当然,如果你有更复杂的格式化需求, 可以使用一个Block来实现.

源代码

如下:
https://gist.github.com/banxi1988/c73fe61860ef63bd61ee.js

2304 次点击
所在节点    iDev
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/195943

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX