react-native-datepicker在ios下的解决方案

背景

react-native-datepicker(以下简称 DatePicker)是用 react-native 开发移动端 app 时常用到的时间选择控件,但是在 IOS 上会有一个问题:如果 DatePicker 在选择日期模式下,日期中年份默认选择当年,而且不能修改

解决方案一

通过将 Date mode 和 Time mode 的两个 DatePicker 控件拼接的方式从设计上拼接成 DateTime mode 的方式,如下 demo 所示(图上借阅时间部分):

image image
image image


解决方案二

原理:

  • 基于 DatePicker 控件,创建一个新的控件(以下简称 NewDatePicker)
  • 本质上依然是通过 Date mode 和 Time mode 两个 DatePicker 控件拼接的方式
  • 将拼接的过程放在 NewDatePicker 控件内部实现,不展露于外
  • 将日期+时间的选择过程在 NewDatePicker 控件内部流程化,减少不必要的交互行为

具体实现流程:

  • 界面上只放置一个输入框
  • 当用户触摸输入框的时候,激活 Date mode 的 DatePicker 控件,同时给此控件绑定 onDateChange 事件,当用户选择日期完成时,即触发此事件
  • 当触发 onDateChange 事件时,进入处理函数,函数中执行激活 Time mode 的 DatePicker 控件,同时给此控件绑定 onTimeChange 事件,当用户选择时间完成时,即触发此事件
  • 当触发 onTimeChange 事件时,进入处理函数,函数中执行将 Date mode 的 DatePicker 控件中选择的日期和 Time mode 的 DatePicker 控件中选择的时间通过字符串的方式拼接起来,并传到界面上的输入框中
  • 最后,如果用户再次触摸界面上的输入框,程序需要回传输入框中的时间数据到 NewDatePicker 控件中,过程首先需要对时间数据进行拆分,拆分成日期和时间,然后执行内部流程 2 – 3 步骤,在这两个步骤中将日期和时间分别传入激活中的 Date mode 和 Time mode 的 DatePicker 控件中,然后用户可以修改时间,时间修改后执行内部流程中第 4 步骤,从而即形成循环操作

两种方案比较:

方案一:

  • 不需要对 DatePicker 控件进行二次封装
  • 需要在界面上展示两个 DatePicker 控件,增加交互的复杂性
  • 程序中还需要额外对两个控件的结果进行拼接操作,增加代码逻辑的复杂性

方案二:

  • 需要对 DatePicker 控件进行二次封装
  • 界面交互变动很小,在一定程度上降低了界面交互复杂度
  • 日期和时间的拼接、拆分逻辑都放在 NewDatePicker 控件内部完成;在业务代码中,只需要引入此控件,并实例化即可,高内聚、低耦合,傻瓜操作,便捷准确