Skip to content

Instantly share code, notes, and snippets.

@dlongmuir
Created October 27, 2012 19:54
Show Gist options
  • Save dlongmuir/3965900 to your computer and use it in GitHub Desktop.
Save dlongmuir/3965900 to your computer and use it in GitHub Desktop.
Formotion with dynamic table
class CalculatorFormController < Formotion::FormController
attr_accessor :calc
def done
puts "row done #{@form.render}"
@calc.got_answers @form.render
new_form = Formotion::Form.new(@calc.get_questions)
@form = new_form
@form.controller = self
@form.reload_data
end
end
class Kernel
# get rid of form warnings on pickers
def warn(message)
end
end
module Formotion
module RowType
class StringRow
def input_toolbar
@input_toolbar ||= begin
toolbar = UIToolbar.alloc.initWithFrame(CGRectMake(0,0,320,44))
toolbar.translucent = true
flex_button = UIBarButtonItem.alloc.initWithBarButtonSystemItem(UIBarButtonSystemItemFlexibleSpace, target: self, action: nil)
done_button = UIBarButtonItem.alloc.initWithBarButtonSystemItem(UIBarButtonSystemItemDone, target: self, action: 'row_done')
toolbar.items = [flex_button, done_button]
toolbar
end
end
def row_done
self.row && self.row.text_field.resignFirstResponder
self.tableView.delegate.controller.done
end
end
class PickerRow
def after_build(cell)
self.row.text_field.inputView = self.picker
self.row.text_field.inputAccessoryView = self.input_toolbar
end
end
class OptionsRow
def build_cell(cell)
cell.selectionStyle = UITableViewCellSelectionStyleNone
segmentedControl = UISegmentedControl.alloc.initWithItems(row.items || [])
segmentedControl.selectedSegmentIndex = row.items.index(row.value) if row.value
segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar
cell.accessoryView = cell.editingAccessoryView = segmentedControl
segmentedControl.when(UIControlEventValueChanged) do
break_with_semaphore do
row.value = row.items[segmentedControl.selectedSegmentIndex]
# reload questions
self.row.form.controller.done
end
end
observe(self.row, "value") do |old_value, new_value|
break_with_semaphore do
if row.value
segmentedControl.selectedSegmentIndex = row.items.index(row.value)
else
segmentedControl.selectedSegmentIndex = UISegmentedControlNoSegment
end
end
end
nil
end
end
class DateTimeRow < DateRow
def formatter
super
@formatter.timeStyle = NSDateFormatterShortStyle
@formatter
end
def after_build(cell)
self.row.text_field.inputView = self.picker
self.row.text_field.inputAccessoryView = self.input_toolbar
update
end
def picker
super
@picker.datePickerMode = UIDatePickerModeDateAndTime
@picker
end
end
class CountdownRow < DateRow
def formatted_value
return formatter.stringFromDate(self.picker.date) if self.row.value && self.row.value > 60
""
end
def formatter
super
@formatter.dateFormat = "HH:mm"
@formatter
end
def after_build(cell)
self.row.text_field.inputView = self.picker
self.row.text_field.inputAccessoryView = self.input_toolbar
update
end
def picker
@picker ||= begin
picker = UIDatePicker.alloc.initWithFrame(CGRectZero)
picker.datePickerMode = UIDatePickerModeCountDownTimer
picker.hidden = false
#picker.date = self.date_value || NSDate.date
picker.countDownDuration = self.row.value || 0
picker.when(UIControlEventValueChanged) do
components = NSCalendar.currentCalendar.components((NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit), fromDate: @picker.date)
inputInterval = (components.hour*60*60 + components.minute*60)
self.row.value = inputInterval
update
end
picker
end
end
end
end
end
# same as the formotion example except with the calculator form controller
@form = Formotion::Form.new(@calc.get_questions)
@view_controller = CalculatorFormController.alloc.initWithForm(@form)
@view_controller.calc = @calc
@view_controller.navigationItem.rightBarButtonItem = UIBarButtonItem.alloc.initWithBarButtonSystemItem(UIBarButtonSystemItemSave, target:self, action:'submit')
@navigation_controller = UINavigationController.alloc.initWithRootViewController(@view_controller)
presentViewController(@navigation_controller, animated: true, completion: nil)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment