formotion 0.0.3 → 0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. data/.gitignore +2 -1
  2. data/CHANGELOG.md +10 -0
  3. data/Gemfile +6 -0
  4. data/LIST_OF_ROW_TYPES.md +163 -0
  5. data/NEW_ROW_TYPES.md +73 -0
  6. data/README.md +11 -14
  7. data/Rakefile +6 -0
  8. data/app/app_delegate.rb +22 -0
  9. data/examples/KitchenSink/Rakefile +1 -1
  10. data/examples/KitchenSink/app/app_delegate.rb +50 -2
  11. data/examples/Login/.gitignore +5 -0
  12. data/examples/Login/Rakefile +9 -0
  13. data/examples/Login/app/app_delegate.rb +16 -0
  14. data/examples/Login/app/login_controller.rb +47 -0
  15. data/examples/Login/app/user_controller.rb +38 -0
  16. data/examples/Login/spec/main_spec.rb +9 -0
  17. data/lib/formotion.rb +7 -1
  18. data/lib/formotion/{form.rb → form/form.rb} +0 -0
  19. data/lib/formotion/{form_delegate.rb → form/form_delegate.rb} +10 -15
  20. data/lib/formotion/patch/object.rb +9 -0
  21. data/lib/formotion/patch/ui_action_sheet.rb +27 -0
  22. data/lib/formotion/patch/ui_text_view.rb +122 -0
  23. data/lib/formotion/patch/ui_text_view_placeholder.rb +65 -0
  24. data/lib/formotion/{row.rb → row/row.rb} +37 -27
  25. data/lib/formotion/row/row_cell_builder.rb +28 -0
  26. data/lib/formotion/row_type/base.rb +41 -0
  27. data/lib/formotion/row_type/check_row.rb +30 -0
  28. data/lib/formotion/row_type/date_row.rb +61 -0
  29. data/lib/formotion/row_type/email_row.rb +11 -0
  30. data/lib/formotion/row_type/image_row.rb +99 -0
  31. data/lib/formotion/row_type/number_row.rb +11 -0
  32. data/lib/formotion/row_type/options_row.rb +24 -0
  33. data/lib/formotion/row_type/phone_row.rb +11 -0
  34. data/lib/formotion/row_type/row_type.rb +21 -0
  35. data/lib/formotion/row_type/slider_row.rb +43 -0
  36. data/lib/formotion/row_type/static_row.rb +6 -0
  37. data/lib/formotion/row_type/string_row.rb +112 -0
  38. data/lib/formotion/row_type/submit_row.rb +34 -0
  39. data/lib/formotion/row_type/switch_row.rb +19 -0
  40. data/lib/formotion/row_type/text_row.rb +76 -0
  41. data/lib/formotion/{section.rb → section/section.rb} +3 -0
  42. data/lib/formotion/version.rb +1 -1
  43. data/spec/form_spec.rb +5 -4
  44. data/spec/functional/character_spec.rb +70 -0
  45. data/spec/functional/check_row_spec.rb +42 -0
  46. data/spec/functional/date_row_spec.rb +63 -0
  47. data/spec/functional/image_row_spec.rb +82 -0
  48. data/spec/functional/options_row_spec.rb +27 -0
  49. data/spec/functional/slider_row_spec.rb +27 -0
  50. data/spec/functional/submit_row_spec.rb +30 -0
  51. data/spec/functional/switch_row_spec.rb +28 -0
  52. data/spec/functional/text_row_spec.rb +60 -0
  53. data/spec/row_type/check_spec.rb +27 -0
  54. data/spec/row_type/date_spec.rb +69 -0
  55. data/spec/row_type/email_spec.rb +22 -0
  56. data/spec/row_type/image_spec.rb +43 -0
  57. data/spec/row_type/number_spec.rb +22 -0
  58. data/spec/row_type/options_spec.rb +37 -0
  59. data/spec/row_type/phone_spec.rb +22 -0
  60. data/spec/row_type/slider_spec.rb +47 -0
  61. data/spec/row_type/static_spec.rb +15 -0
  62. data/spec/row_type/string_spec.rb +52 -0
  63. data/spec/row_type/submit_spec.rb +28 -0
  64. data/spec/row_type/switch_spec.rb +27 -0
  65. data/spec/row_type/text_spec.rb +41 -0
  66. data/spec/support/ui_control_wrap_extension.rb +7 -0
  67. metadata +88 -9
  68. data/lib/formotion/row_cell_builder.rb +0 -168
  69. data/lib/formotion/row_type.rb +0 -33
@@ -0,0 +1,5 @@
1
+ .repl_history
2
+ build
3
+ resources/*.nib
4
+ resources/*.momd
5
+ resources/*.storyboardc
@@ -0,0 +1,9 @@
1
+ # -*- coding: utf-8 -*-
2
+ $:.unshift("/Library/RubyMotion/lib")
3
+ require 'motion/project'
4
+ require 'formotion'
5
+
6
+ Motion::Project::App.setup do |app|
7
+ # Use `rake config' to see complete project settings.
8
+ app.name = 'Settings'
9
+ end
@@ -0,0 +1,16 @@
1
+ class AppDelegate
2
+ def application(application, didFinishLaunchingWithOptions:launchOptions)
3
+ @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
4
+
5
+ @navigation_controller = UINavigationController.alloc.initWithRootViewController(UserController.controller)
6
+ @window.rootViewController = @navigation_controller
7
+ @window.makeKeyAndVisible
8
+
9
+ @login = LoginController.alloc.init
10
+ @login_navigation = UINavigationController.alloc.initWithRootViewController(@login)
11
+
12
+ UserController.controller.presentModalViewController(@login_navigation, animated:false)
13
+
14
+ true
15
+ end
16
+ end
@@ -0,0 +1,47 @@
1
+ class LoginController < Formotion::FormController
2
+ def init
3
+ form = Formotion::Form.new({
4
+ title: "Login",
5
+ sections: [{
6
+ rows: [{
7
+ title: "User Name",
8
+ type: :string,
9
+ placeholder: "name",
10
+ key: :user
11
+ }, {
12
+ title: "Password",
13
+ type: :string,
14
+ placeholder: "password",
15
+ key: :password,
16
+ secure: true
17
+ }, {
18
+ title: "Remember?",
19
+ type: :switch,
20
+ key: :remember,
21
+ value: true
22
+ }]
23
+ }, {
24
+ rows: [{
25
+ title: "Login",
26
+ type: :submit,
27
+ }]
28
+ }]
29
+ })
30
+ form.on_submit do
31
+ self.login
32
+ end
33
+ super.initWithForm(form)
34
+ end
35
+
36
+ def viewDidLoad
37
+ super
38
+ self.navigationItem.rightBarButtonItem = UIBarButtonItem.alloc.initWithTitle("Login", style: UIBarButtonItemStyleDone, target:self, action:'login')
39
+ end
40
+
41
+ def login
42
+ [:user, :password, :remember].each { |prop|
43
+ UserController.controller.send(prop.to_s + "=", form.render[prop])
44
+ }
45
+ self.navigationController.dismissModalViewControllerAnimated(true)
46
+ end
47
+ end
@@ -0,0 +1,38 @@
1
+ class UserController < UIViewController
2
+ def self.controller
3
+ @controller ||= UserController.alloc.initWithNibName(nil, bundle: nil)
4
+ end
5
+
6
+ def viewDidLoad
7
+ super
8
+
9
+ self.view.backgroundColor = UIColor.whiteColor
10
+
11
+ @user_label = UILabel.alloc.initWithFrame(CGRectZero)
12
+ self.view.addSubview(@user_label)
13
+
14
+ @password_label = UILabel.alloc.initWithFrame(CGRectZero)
15
+ self.view.addSubview(@password_label)
16
+
17
+ @remember_label = UILabel.alloc.initWithFrame(CGRectZero)
18
+ self.view.addSubview(@remember_label)
19
+ end
20
+
21
+ def user=(user)
22
+ @user_label.text = "User: #{user}"
23
+ @user_label.sizeToFit
24
+ @user_label.center = [self.view.frame.size.width/2, self.view.frame.size.height/2 - 40]
25
+ end
26
+
27
+ def password=(password)
28
+ @password_label.text = "Password: #{password}"
29
+ @password_label.sizeToFit
30
+ @password_label.center = [@user_label.center.x, @user_label.center.y + @password_label.bounds.size.height]
31
+ end
32
+
33
+ def remember=(remember)
34
+ @remember_label.text = "Remember? #{remember}"
35
+ @remember_label.sizeToFit
36
+ @remember_label.center = [@password_label.center.x, @password_label.center.y + @remember_label.bounds.size.height]
37
+ end
38
+ end
@@ -0,0 +1,9 @@
1
+ describe "Application 'Settings'" do
2
+ before do
3
+ @app = UIApplication.sharedApplication
4
+ end
5
+
6
+ it "has one window" do
7
+ @app.windows.size.should == 1
8
+ end
9
+ end
@@ -1,8 +1,14 @@
1
1
  require "formotion/version"
2
2
  require 'bubble-wrap/core'
3
+ require 'bubble-wrap/camera'
3
4
 
4
5
  BW.require File.expand_path('../formotion/**/*.rb', __FILE__) do
5
- ['form.rb', 'row.rb', 'section.rb'].each {|file|
6
+ file("lib/formotion/row_type/string_row.rb").depends_on 'lib/formotion/row_type/base.rb'
7
+ ['date_row', 'email_row', 'number_row', 'phone_row'].each {|file|
8
+ file("lib/formotion/row_type/#{file}.rb").depends_on 'lib/formotion/row_type/string_row.rb'
9
+ }
10
+
11
+ ['form/form.rb', 'row/row.rb', 'section/section.rb'].each {|file|
6
12
  file("lib/formotion/#{file}").depends_on 'lib/formotion/base.rb'
7
13
  }
8
14
  file("lib/formotion/form_controller.rb").depends_on 'lib/formotion/patch/ui_text_field.rb'
File without changes
@@ -52,6 +52,10 @@ module Formotion
52
52
  section = self.sections[section].title
53
53
  end
54
54
 
55
+ def tableView(tableView, titleForFooterInSection:section)
56
+ self.sections[section].footer
57
+ end
58
+
55
59
  def tableView(tableView, cellForRowAtIndexPath:indexPath)
56
60
  row = row_for_index_path(indexPath)
57
61
  reuseIdentifier = row.reuse_identifier
@@ -63,25 +67,16 @@ module Formotion
63
67
  cell
64
68
  end
65
69
 
70
+ def tableView(tableView, heightForRowAtIndexPath: indexPath)
71
+ row = row_for_index_path(indexPath)
72
+ row.rowHeight || tableView.rowHeight
73
+ end
74
+
66
75
  # UITableViewDelegate Methods
67
76
  def tableView(tableView, didSelectRowAtIndexPath:indexPath)
68
77
  tableView.deselectRowAtIndexPath(indexPath, animated:true)
69
78
  row = row_for_index_path(indexPath)
70
- if row.submit_button?
71
- self.submit
72
- elsif row.checkable?
73
- if row.section.select_one and !row.value
74
- row.section.rows.each {|other_row|
75
- other_row.value = (other_row == row)
76
- Formotion::RowCellBuilder.make_check_cell(other_row, tableView.cellForRowAtIndexPath(other_row.index_path))
77
- }
78
- elsif !row.section.select_one
79
- row.value = !row.value
80
- Formotion::RowCellBuilder.make_check_cell(row, tableView.cellForRowAtIndexPath(row.index_path))
81
- end
82
- elsif row.editable?
83
- row.text_field.becomeFirstResponder
84
- end
79
+ row.object.on_select(tableView, self)
85
80
  end
86
81
  end
87
82
  end
@@ -0,0 +1,9 @@
1
+ class Object
2
+ # Creates an alias for :method with the form
3
+ # old_#{method}
4
+ # Instance evals the block.
5
+ def swizzle(method, &block)
6
+ self.class.send(:alias_method, "old_#{method.to_s}".to_sym, method)
7
+ self.instance_eval &block
8
+ end
9
+ end
@@ -0,0 +1,27 @@
1
+ # To make accessibility labels work in UIActionSheets
2
+ # adapted from https://gist.github.com/953326
3
+
4
+ class UIActionSheet
5
+
6
+ alias_method :old_addButtonWithTitle, :addButtonWithTitle
7
+
8
+ def addButtonWithTitle(title)
9
+ button_index = old_addButtonWithTitle(title)
10
+ self.subviews.each { |subview|
11
+ if subview.respond_to? :title
12
+ controlTitle = subview.send(:title)
13
+ if (title == controlTitle)
14
+ copyAccessibilityMetadataFrom(title, toControl: subview)
15
+ return button_index
16
+ end
17
+ end
18
+ }
19
+ button_index
20
+ end
21
+
22
+ private
23
+ def copyAccessibilityMetadataFrom(title, toControl:control)
24
+ control.accessibilityLabel = title
25
+ end
26
+
27
+ end
@@ -0,0 +1,122 @@
1
+ # Methods which use blocks for UITextViewDelegate methods.
2
+ # EX
3
+ # field.should_end? do |text_field|
4
+ # if text_field.text != "secret"
5
+ # return false
6
+ # end
7
+ # true
8
+ # end
9
+ #
10
+ # Also includes an on_change method, which calls after the text
11
+ # has changed (there is no UITextViewDelegate equivalent.)
12
+ # EX
13
+ # field.on_change do |text_field|
14
+ # p text_field.text
15
+ # end
16
+
17
+ class UITextView
18
+ attr_accessor :menu_options_enabled
19
+
20
+ def canPerformAction(action, withSender:sender)
21
+ self.menu_options_enabled
22
+ end
23
+
24
+ # block takes argument textView; should return true/false
25
+ def should_begin?(&block)
26
+ add_delegate_method do
27
+ @delegate.textViewShouldBeginEditing_callback = block
28
+ end
29
+ end
30
+
31
+ # block takes argument textView
32
+ def on_begin(&block)
33
+ add_delegate_method do
34
+ @delegate.textViewDidBeginEditing_callback = block
35
+ end
36
+ end
37
+
38
+ # block takes argument textView; should return true/false
39
+ def should_end?(&block)
40
+ add_delegate_method do
41
+ @delegate.textViewShouldEndEditing_callback = block
42
+ end
43
+ end
44
+
45
+ # block takes argument textView
46
+ def on_end(&block)
47
+ add_delegate_method do
48
+ @delegate.textViewDidEndEditing_callback = block
49
+ end
50
+ end
51
+
52
+ # block takes argument textView
53
+ def on_change(&block)
54
+ add_delegate_method do
55
+ @delegate.textViewDidChange_callback = block
56
+ end
57
+ end
58
+
59
+ # block takes argument textView, range [NSRange], and string; should return true/false
60
+ def should_change?(&block)
61
+ add_delegate_method do
62
+ @delegate.shouldChangeCharactersInRange_callback = block
63
+ end
64
+ end
65
+
66
+ private
67
+ def add_delegate_method
68
+ # create strong reference to the delegate
69
+ # (.delegate= only creates a weak reference)
70
+ @delegate ||= UITextView_Delegate.new
71
+ yield
72
+ self.delegate = @delegate
73
+ end
74
+ end
75
+
76
+ class UITextView_Delegate
77
+ [:textViewShouldBeginEditing, :textViewDidBeginEditing,
78
+ :textViewShouldEndEditing, :textViewDidEndEditing,
79
+ :textViewDidChange, :shouldChangeCharactersInRange].each {|method|
80
+ attr_accessor (method.to_s + "_callback").to_sym
81
+ }
82
+
83
+ def textViewShouldBeginEditing(theTextView)
84
+ if self.textViewShouldBeginEditing_callback
85
+ return self.textViewShouldBeginEditing_callback.call(theTextView)
86
+ end
87
+ true
88
+ end
89
+
90
+ def textViewDidBeginEditing(theTextView)
91
+ if self.textViewDidBeginEditing_callback
92
+ return self.textViewDidBeginEditing_callback.call(theTextView)
93
+ end
94
+ end
95
+
96
+ def textViewShouldEndEditing(theTextView)
97
+ if self.textViewShouldEndEditing_callback
98
+ return self.textViewShouldEndEditing_callback.call(theTextView)
99
+ end
100
+ true
101
+ end
102
+
103
+ def textView(textView, shouldChangeTextInRange:range, replacementText:text)
104
+ if self.shouldChangeCharactersInRange_callback
105
+ return self.shouldChangeCharactersInRange_callback.call(textView, range, text)
106
+ end
107
+ true
108
+ end
109
+
110
+ def textViewDidEndEditing(theTextView)
111
+ if self.textViewDidEndEditing_callback
112
+ return self.textViewDidEndEditing_callback.call(theTextView)
113
+ end
114
+ end
115
+
116
+ def textViewDidChange(theTextView)
117
+ if self.textViewDidChange_callback
118
+ self.textViewDidChange_callback.call(theTextView)
119
+ end
120
+ end
121
+
122
+ end
@@ -0,0 +1,65 @@
1
+ class UITextView
2
+ attr_reader :placeholder
3
+ attr_accessor :placeholder_color
4
+
5
+ alias_method :old_initWithCoder, :initWithCoder
6
+ def initWithCoder(decoder)
7
+ old_initWithCoder(decoder)
8
+ setup
9
+ self
10
+ end
11
+
12
+ alias_method :old_initWithFrame, :initWithFrame
13
+ def initWithFrame(frame)
14
+ old_initWithFrame(frame)
15
+ setup
16
+ self
17
+ end
18
+
19
+ def setup
20
+ @foreground_observer = NSNotificationCenter.defaultCenter.observe UITextViewTextDidChangeNotification do |notification|
21
+ updateShouldDrawPlaceholder
22
+ end
23
+ end
24
+
25
+ alias_method :old_drawRect, :drawRect
26
+ def drawRect(rect)
27
+ old_drawRect(rect)
28
+
29
+ if (@shouldDrawPlaceholder)
30
+ self.placeholder_color.set
31
+ self.placeholder.drawInRect(placeholder_rect, withFont:self.font)
32
+ end
33
+ end
34
+
35
+
36
+ alias_method :old_setText, :setText
37
+ def setText(text)
38
+ old_setText(text)
39
+
40
+ updateShouldDrawPlaceholder
41
+ end
42
+
43
+ def placeholder=(placeholder)
44
+ return if @placeholder == placeholder
45
+
46
+ @placeholder = placeholder
47
+
48
+ updateShouldDrawPlaceholder
49
+ end
50
+
51
+ def placeholder_rect
52
+ CGRectMake(self.contentInset.left + 10.0, self.contentInset.top, self.frame.size.width - self.contentInset.left - self.contentInset.right - 16.0, self.frame.size.height - self.contentInset.top - self.contentInset.bottom - 16.0)
53
+ end
54
+
55
+ def placeholder_color
56
+ @placeholder_color ||= UIColor.lightGrayColor
57
+ end
58
+
59
+ def updateShouldDrawPlaceholder
60
+ prev = @shouldDrawPlaceholder;
61
+ @shouldDrawPlaceholder = self.placeholder && self.text.length == 0
62
+
63
+ self.setNeedsDisplay if (prev != @shouldDrawPlaceholder)
64
+ end
65
+ end
@@ -6,20 +6,23 @@ module Formotion
6
6
  # the user's (or configured) value for this row.
7
7
  :value,
8
8
  # set as cell.titleLabel.text
9
- :title,
9
+ :title,
10
10
  # set as cell.detailLabel.text
11
11
  :subtitle,
12
12
  # configures the type of input this is (string, phone, switch, etc)
13
13
  # either Formotion::RowType or a string/symbol representation of one
14
14
  # see row_type.rb
15
15
  :type,
16
+ # Stores possible formatting information (used by date pickers, etc)
17
+ # if :type == :date, accepts values in [:short, :medium, :long, :full]
18
+ :format,
16
19
 
17
20
  # The following apply only to text-input fields
18
21
 
19
22
  # placeholder text
20
23
  :placeholder,
21
24
  # whether or not the entry field is secure (like a password)
22
- :secure,
25
+ :secure,
23
26
  # given by a UIReturnKey___ integer, string, or symbol
24
27
  # EX :default, :google
25
28
  :return_key,
@@ -32,7 +35,20 @@ module Formotion
32
35
  # field.clearButtonMode; given by a UITextFieldViewMode__ integer, string, symbol
33
36
  # EX :never, :while_editing
34
37
  # DEFAULT is nil, which is used as :while_editing
35
- :clear_button]
38
+ :clear_button,
39
+ # row height as integer; used for heightForRowAtIndexPath
40
+ # EX 200
41
+ # DEFAULT is nil, which is used as the tableView.rowHeight
42
+ :rowHeight,
43
+ # range used for slider min and max value
44
+ # EX (1..100)
45
+ # DEFAULT is (1..10)
46
+ :range,
47
+ # Array used for control row items
48
+ # EX ['free', 'pro']
49
+ # DEFAULT is []
50
+ :items,
51
+ ]
36
52
  PROPERTIES.each {|prop|
37
53
  attr_accessor prop
38
54
  }
@@ -62,6 +78,9 @@ module Formotion
62
78
  # starts editing #text_field.
63
79
  attr_accessor :on_begin_callback
64
80
 
81
+ # row type object
82
+ attr_accessor :object
83
+
65
84
  def initialize(params = {})
66
85
  super
67
86
 
@@ -74,7 +93,7 @@ module Formotion
74
93
  # these should be done with alias_method but there's currently a bug
75
94
  # in RM which messes up attr_accessors with alias_method
76
95
  # EX
77
- # row.editable?
96
+ # row.secure?
78
97
  # => true
79
98
  # row.checkable?
80
99
  # => nil
@@ -103,7 +122,7 @@ module Formotion
103
122
 
104
123
  def next_row
105
124
  # if there are more rows in this section, use that.
106
- return self.section.rows[self.index + 1] if self.index < (self.section.rows.count - 1)
125
+ return self.section.rows[self.index + 1] if self.index < (self.section.rows.count - 1)
107
126
 
108
127
  # if there are more sections, then use the first row of that section.
109
128
  return self.section.next_section.rows[0] if self.section.next_section
@@ -112,7 +131,7 @@ module Formotion
112
131
  end
113
132
 
114
133
  def previous_row
115
- return self.section.rows[self.index - 1] if self.index > 0
134
+ return self.section.rows[self.index - 1] if self.index > 0
116
135
 
117
136
  # if there are more sections, then use the first row of that section.
118
137
  return self.section.previous_section.rows[-1] if self.section.previous_section
@@ -120,41 +139,30 @@ module Formotion
120
139
  nil
121
140
  end
122
141
 
123
- def editable?
124
- Formotion::RowType::TEXT_FIELD_TYPES.member? self.type
125
- end
126
-
127
142
  def submit_button?
128
- self.type == Formotion::RowType::SUBMIT
129
- end
130
-
131
- def switchable?
132
- self.type == Formotion::RowType::SWITCH
133
- end
134
-
135
- def checkable?
136
- self.type == Formotion::RowType::CHECK
143
+ object.submit_button?
137
144
  end
138
145
 
139
146
  #########################
140
147
  # setter overrides
141
148
  def type=(type)
142
- @type = Formotion::RowType.for(type)
149
+ @object = Formotion::RowType.for(type).new(self)
150
+ @type = type
143
151
  end
144
152
 
145
153
  def return_key=(value)
146
154
  @return_key = const_int_get("UIReturnKey", value)
147
155
  end
148
156
 
149
- def auto_correction=(value)
157
+ def auto_correction=(value)
150
158
  @auto_correction = const_int_get("UITextAutocorrectionType", value)
151
159
  end
152
160
 
153
- def auto_capitalization=(value)
161
+ def auto_capitalization=(value)
154
162
  @auto_capitalization = const_int_get("UITextAutocapitalizationType", value)
155
163
  end
156
164
 
157
- def clear_button=(value)
165
+ def clear_button=(value)
158
166
  @clear_button = const_int_get("UITextFieldViewMode", value)
159
167
  end
160
168
 
@@ -176,6 +184,7 @@ module Formotion
176
184
  def make_cell
177
185
  cell, text_field = Formotion::RowCellBuilder.make_cell(self)
178
186
  @text_field = text_field
187
+ self.object.after_build(cell)
179
188
  cell
180
189
  end
181
190
 
@@ -197,14 +206,15 @@ module Formotion
197
206
  # directly in your code, they don't get added
198
207
  # to Kernel and const_int_get crashes.
199
208
  def load_constants_hack
200
- [UITextAutocapitalizationTypeNone, UITextAutocapitalizationTypeWords,
209
+ [UITextAutocapitalizationTypeNone, UITextAutocapitalizationTypeWords,
201
210
  UITextAutocapitalizationTypeSentences,UITextAutocapitalizationTypeAllCharacters,
202
211
  UITextAutocorrectionTypeNo, UITextAutocorrectionTypeYes, UITextAutocorrectionTypeDefault,
203
- UIReturnKeyDefault, UIReturnKeyGo, UIReturnKeyGoogle, UIReturnKeyJoin,
212
+ UIReturnKeyDefault, UIReturnKeyGo, UIReturnKeyGoogle, UIReturnKeyJoin,
204
213
  UIReturnKeyNext, UIReturnKeyRoute, UIReturnKeySearch, UIReturnKeySend,
205
- UIReturnKeyYahoo, UIReturnKeyDone, UIReturnKeyEmergencyCall,
214
+ UIReturnKeyYahoo, UIReturnKeyDone, UIReturnKeyEmergencyCall,
206
215
  UITextFieldViewModeNever, UITextFieldViewModeAlways, UITextFieldViewModeWhileEditing,
207
- UITextFieldViewModeUnlessEditing
216
+ UITextFieldViewModeUnlessEditing, NSDateFormatterShortStyle, NSDateFormatterMediumStyle,
217
+ NSDateFormatterLongStyle, NSDateFormatterFullStyle
208
218
  ]
209
219
  end
210
220
  end