Created
October 27, 2012 19:54
-
-
Save dlongmuir/3965900 to your computer and use it in GitHub Desktop.
Formotion with dynamic table
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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