Class: Formotion::RowType::DateRow

Inherits:
StringRow show all
Includes:
MultiChoiceRow
Defined in:
lib/formotion/row_type/date_row.rb

Constant Summary

Constants inherited from StringRow

StringRow::TEXT_FIELD_TAG

Instance Attribute Summary

Attributes inherited from Base

#row, #tableView

Instance Method Summary collapse

Methods included from MultiChoiceRow

#add_callbacks, #build_cell

Methods inherited from StringRow

#add_callbacks, #build_cell, #done_editing, #keyboardType, #on_select, #row_value

Methods inherited from Base

#_on_select, #after_delete, #break_with_semaphore, #build_cell, #button?, #cellEditingStyle, #cell_style, #delete_row, #done_editing, field_buffer, #indentWhileEditing?, #initialize, #input_accessory_view, #on_delete, #on_select, #update_cell, #with_semaphore

Constructor Details

This class inherits a constructor from Formotion::RowType::Base

Instance Method Details

#after_build(cell) ⇒ Object



41
42
43
44
45
46
47
48
49
50
# File 'lib/formotion/row_type/date_row.rb', line 41

def after_build(cell)
  self.row.text_field.inputView = self.picker
  # work around an iOS7 bug: http://bit.ly/KcwKSv
  if row.picker_mode == :countdown
    self.picker.setDate(self.picker.date, animated:true)
    picker.countDownDuration = self.row.value.to_f
  end

  update
end

#date_valueObject



17
18
19
20
21
22
23
24
# File 'lib/formotion/row_type/date_row.rb', line 17

def date_value
  value = self.row.value
  if value.is_a? Numeric
    Time.at value
  else
    nil
  end
end

#formatted_valueObject



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# File 'lib/formotion/row_type/date_row.rb', line 87

def formatted_value
  if self.date_value
    return case self.row.picker_mode
      when :time
        old_date_style = formatter.dateStyle
        formatter.dateStyle = NSDateFormatterNoStyle
        formatter.timeStyle = NSDateFormatterShortStyle
        formatted = formatter.stringFromDate(self.date_value)
        formatter.dateStyle = old_date_style
        formatter.timeStyle = NSDateFormatterNoStyle
        formatted
      when :date_time
        old_date_style = formatter.dateStyle
        formatter.dateStyle = NSDateFormatterShortStyle
        formatter.timeStyle = NSDateFormatterShortStyle
        formatted = formatter.stringFromDate(self.date_value)
        formatter.dateStyle = old_date_style
        formatter.timeStyle = NSDateFormatterNoStyle
        formatted
      when :countdown
        time = self.row.value
        date = NSDate.dateWithTimeIntervalSinceReferenceDate(time)
        old_date_style = formatter.dateStyle
        old_time_zone = formatter.timeZone

        formatter.dateFormat = "HH:mm"
        formatter.timeZone = NSTimeZone.timeZoneForSecondsFromGMT(0)
        formatted = formatter.stringFromDate(date)

        formatter.dateStyle = old_date_style
        formatter.timeZone = old_time_zone
        formatter.dateFormat = nil
        formatted
      else
        formatter.stringFromDate(self.date_value)
      end
  end
  self.row.value
end

#formatterObject



26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/formotion/row_type/date_row.rb', line 26

def formatter
  @formatter ||= begin
    formatter = NSDateFormatter.new

    date_style = self.row.format
    if date_style && date_style.to_s[-5..-1] != "style"
      date_style = (date_style.to_s + "_style").to_sym
    end

    formatter.dateStyle = self.row.send(:const_int_get, "NSDateFormatter", date_style || NSDateFormatterShortStyle)
    formatter.timeStyle = NSDateFormatterNoStyle
    formatter
  end
end

#on_change(text_field) ⇒ Object

overwrite Character on_change method



10
11
# File 'lib/formotion/row_type/date_row.rb', line 10

def on_change(text_field)
end

#pickerObject



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/formotion/row_type/date_row.rb', line 52

def picker
  @picker ||= begin
    picker = UIDatePicker.alloc.initWithFrame(CGRectZero)
    picker.datePickerMode = self.picker_mode
    picker.hidden = false
    picker.date = self.date_value || Time.now
    picker.countDownDuration = self.row.value if row.picker_mode == :countdown
    picker.minuteInterval = self.row.minute_interval if self.row.minute_interval

    picker.when(UIControlEventValueChanged) do
      if self.row.picker_mode == :countdown
        self.row.value = @picker.countDownDuration
      else
        self.row.value = Time.at(@picker.date).to_i
      end
      update
    end

    picker
  end
end

#picker_modeObject



74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/formotion/row_type/date_row.rb', line 74

def picker_mode
  case self.row.picker_mode
  when :time
    UIDatePickerModeTime
  when :date_time
    UIDatePickerModeDateAndTime
  when :countdown
    UIDatePickerModeCountDownTimer
  else
    UIDatePickerModeDate
  end
end

#updateObject



13
14
15
# File 'lib/formotion/row_type/date_row.rb', line 13

def update
  self.row.text_field && self.row.text_field.text = self.formatted_value
end

#update_text_field(new_value) ⇒ Object

Used when row.value changes



128
129
130
# File 'lib/formotion/row_type/date_row.rb', line 128

def update_text_field(new_value)
  self.row.text_field.text = self.formatted_value
end