ProMotion 0.7.3 → 0.7.4
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/ProMotion/helpers/measure_helper.rb +2 -2
- data/lib/ProMotion/helpers/view_helper.rb +9 -0
- data/lib/ProMotion/screens/_screen_module.rb +2 -2
- data/lib/ProMotion/screens/_tables/_refreshable_table.rb +15 -12
- data/lib/ProMotion/screens/_tables/_searchable_table.rb +1 -0
- data/lib/ProMotion/screens/_tables/_table.rb +3 -4
- data/lib/ProMotion/screens/_tables/table_data.rb +5 -3
- data/lib/ProMotion/screens/_tables/table_view_cell_module.rb +20 -9
- data/lib/ProMotion/version.rb +1 -1
- data/spec/functional/func_screen_spec.rb +16 -16
- data/spec/functional/func_searchable_table_spec.rb +32 -0
- data/spec/functional/func_split_screen_spec.rb +20 -20
- data/spec/functional/func_table_screen_spec.rb +21 -0
- data/spec/helpers/table_screen.rb +50 -12
- data/spec/helpers/table_screen_searchable.rb +58 -1
- data/spec/unit/tables/table_module_spec.rb +17 -18
- data/spec/unit/tables/table_screen_spec.rb +3 -4
- data/spec/unit/tables/table_view_cell_spec.rb +21 -22
- metadata +4 -2
@@ -2,7 +2,7 @@ module ProMotion
|
|
2
2
|
class MeasureHelper
|
3
3
|
class << self
|
4
4
|
def content_height(view)
|
5
|
-
|
5
|
+
PM.logger.deprecated "`MeasureHelper.content_height` is deprecated. Include the module `ScreenElements` to get access to this method (already included in Screen)."
|
6
6
|
|
7
7
|
height = 0
|
8
8
|
view.subviews.each do |subview|
|
@@ -17,4 +17,4 @@ module ProMotion
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
20
|
-
end
|
20
|
+
end
|
@@ -69,5 +69,14 @@ module ProMotion
|
|
69
69
|
height
|
70
70
|
end
|
71
71
|
|
72
|
+
def closest_parent(type)
|
73
|
+
# iterate up the view hierarchy to find the parent element of "type" containing this view
|
74
|
+
this_view = self.superview
|
75
|
+
while this_view != nil do
|
76
|
+
return this_view if this_view.is_a? type
|
77
|
+
this_view = this_view.superview
|
78
|
+
end
|
79
|
+
nil
|
80
|
+
end
|
72
81
|
end
|
73
82
|
end
|
@@ -126,7 +126,7 @@ module ProMotion
|
|
126
126
|
|
127
127
|
# [DEPRECATED]
|
128
128
|
def set_view_controller(vc)
|
129
|
-
|
129
|
+
PM.logger.deprecated "`set_view_controller` is deprecated and discontinued. Please inherit from the UIViewController you wish to use and include ProMotion::ScreenViewController instead."
|
130
130
|
self
|
131
131
|
end
|
132
132
|
|
@@ -153,7 +153,7 @@ module ProMotion
|
|
153
153
|
def on_disappear; end
|
154
154
|
|
155
155
|
def view_controller
|
156
|
-
|
156
|
+
PM.logger.deprecated "`view_controller` is deprecated, as screens are now UIViewController subclasses."
|
157
157
|
self
|
158
158
|
end
|
159
159
|
|
@@ -14,23 +14,12 @@ module ProMotion
|
|
14
14
|
end
|
15
15
|
alias :makeRefreshable :make_refreshable
|
16
16
|
|
17
|
-
######### iOS methods, headless camel case #######
|
18
|
-
|
19
|
-
# UIRefreshControl Delegates
|
20
|
-
def refreshView(refresh)
|
21
|
-
refresh.attributedTitle = NSAttributedString.alloc.initWithString(@refreshing)
|
22
|
-
if @refreshable_callback && self.respond_to?(@refreshable_callback)
|
23
|
-
self.send(@refreshable_callback)
|
24
|
-
else
|
25
|
-
PM.logger.warn "You must implement the '#{@refreshable_callback}' method in your TableScreen."
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
17
|
def start_refreshing
|
30
18
|
return unless @refresh_control
|
31
19
|
|
32
20
|
@refresh_control.beginRefreshing
|
33
21
|
end
|
22
|
+
alias :begin_refreshing :start_refreshing
|
34
23
|
|
35
24
|
def end_refreshing
|
36
25
|
return unless @refresh_control
|
@@ -38,5 +27,19 @@ module ProMotion
|
|
38
27
|
@refresh_control.attributedTitle = NSAttributedString.alloc.initWithString(sprintf(@updated_format, Time.now.strftime(@updated_time_format)))
|
39
28
|
@refresh_control.endRefreshing
|
40
29
|
end
|
30
|
+
alias :stop_refreshing :end_refreshing
|
31
|
+
|
32
|
+
######### iOS methods, headless camel case #######
|
33
|
+
|
34
|
+
# UIRefreshControl Delegates
|
35
|
+
def refreshView(refresh)
|
36
|
+
refresh.attributedTitle = NSAttributedString.alloc.initWithString(@refreshing)
|
37
|
+
if @refreshable_callback && self.respond_to?(@refreshable_callback)
|
38
|
+
self.send(@refreshable_callback)
|
39
|
+
else
|
40
|
+
PM.logger.warn "You must implement the '#{@refreshable_callback}' method in your TableScreen."
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
41
44
|
end
|
42
45
|
end
|
@@ -73,11 +73,10 @@ module ProMotion
|
|
73
73
|
index_path = table_cell.superview.indexPathForCell(table_cell)
|
74
74
|
|
75
75
|
data_cell = cell_at_section_and_index(index_path.section, index_path.row)
|
76
|
-
data_cell[:arguments] = {} unless data_cell[:arguments]
|
77
|
-
data_cell[:arguments][:value] = switch.isOn if data_cell[:arguments].is_a? Hash
|
78
|
-
data_cell[:accessory_action] ||= data_cell[:accessoryAction] # For legacy support
|
76
|
+
data_cell[:accessory][:arguments] = {} unless data_cell[:accessory][:arguments]
|
77
|
+
data_cell[:accessory][:arguments][:value] = switch.isOn if data_cell[:accessory][:arguments].is_a? Hash
|
79
78
|
|
80
|
-
trigger_action(data_cell[:
|
79
|
+
trigger_action(data_cell[:accessory][:action], data_cell[:accessory][:arguments]) if data_cell[:accessory][:action]
|
81
80
|
end
|
82
81
|
|
83
82
|
def delete_row(index_paths, animation = nil)
|
@@ -102,8 +102,10 @@ module ProMotion
|
|
102
102
|
background_color: :backgroundColor,
|
103
103
|
selection_style: :selectionStyle,
|
104
104
|
cell_class_attributes: :cellClassAttributes,
|
105
|
-
|
105
|
+
accessory: :accessoryView,
|
106
|
+
accessory: :accessory_view,
|
106
107
|
accessory_type: :accessoryType,
|
108
|
+
accessory_action: :accessoryAction,
|
107
109
|
accessory_checked: :accessoryDefault,
|
108
110
|
remote_image: :remoteImage,
|
109
111
|
subviews: :subViews
|
@@ -117,13 +119,13 @@ module ProMotion
|
|
117
119
|
|
118
120
|
mappings.each_pair do |n, old|
|
119
121
|
if data_cell[old]
|
120
|
-
|
122
|
+
PM.logger.deprecated "`:#{old}` is deprecated in TableScreens. Use `:#{n}`"
|
121
123
|
data_cell[n] = data_cell[old]
|
122
124
|
end
|
123
125
|
end
|
124
126
|
|
125
127
|
if data_cell[:styles] && data_cell[:styles][:textLabel]
|
126
|
-
|
128
|
+
PM.logger.deprecated "`:textLabel` is deprecated in TableScreens. Use `:label`"
|
127
129
|
data_cell[:styles][:label] = data_cell[:styles][:textLabel]
|
128
130
|
end
|
129
131
|
|
@@ -24,7 +24,9 @@ module ProMotion
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def set_cell_attributes
|
27
|
-
|
27
|
+
data_cell_attributes = data_cell.dup
|
28
|
+
[:image, :accessory_action].each { |k| data_cell_attributes.delete(k) }
|
29
|
+
set_attributes self, data_cell_attributes
|
28
30
|
self
|
29
31
|
end
|
30
32
|
|
@@ -41,16 +43,25 @@ module ProMotion
|
|
41
43
|
end
|
42
44
|
|
43
45
|
def set_accessory_view
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
46
|
+
# Legacy Support < 0.7.4
|
47
|
+
data_cell[:accessory] ||= data_cell[:accessory_view]
|
48
|
+
data_cell[:accessory] = {
|
49
|
+
view: data_cell[:accessory],
|
50
|
+
value: data_cell[:accessory_value],
|
51
|
+
action: data_cell[:accessory_action],
|
52
|
+
arguments: data_cell[:accessory_arguments]
|
53
|
+
} unless data_cell[:accessory].is_a? Hash
|
54
|
+
# End Legacy Support
|
55
|
+
|
56
|
+
if data_cell[:accessory][:view] == :switch
|
50
57
|
switch_view = UISwitch.alloc.initWithFrame(CGRectZero)
|
51
|
-
switch_view.
|
52
|
-
switch_view.
|
58
|
+
switch_view.setAccessibilityLabel(data_cell[:accessory][:accessibility_label]) if data_cell[:accessory][:accessibility_label]
|
59
|
+
switch_view.addTarget(self.closest_parent(UITableView), action: "accessory_toggled_switch:", forControlEvents:UIControlEventValueChanged)
|
60
|
+
switch_view.on = true if data_cell[:accessory][:value]
|
53
61
|
self.accessoryView = switch_view
|
62
|
+
elsif data_cell[:accessory][:view]
|
63
|
+
self.accessoryView = data_cell[:accessory][:view]
|
64
|
+
self.accessoryView.autoresizingMask = UIViewAutoresizingFlexibleWidth
|
54
65
|
end
|
55
66
|
|
56
67
|
self
|
data/lib/ProMotion/version.rb
CHANGED
@@ -1,66 +1,66 @@
|
|
1
1
|
describe "ProMotion::Screen functional" do
|
2
2
|
tests PM::Screen
|
3
|
-
|
3
|
+
|
4
4
|
# Override controller to properly instantiate
|
5
5
|
def controller
|
6
6
|
rotate_device to: :portrait, button: :bottom
|
7
7
|
@controller ||= FunctionalScreen.new(nav_bar: true)
|
8
8
|
@controller.main_controller
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
after do
|
12
12
|
@controller = nil
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
it "should have a navigation bar" do
|
16
16
|
view("Functional").should.be.kind_of UINavigationItemView
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
it "should allow setting a left nav bar button" do
|
20
20
|
@controller.set_nav_bar_button :left, title: "Cool", action: :triggered_button
|
21
21
|
tap("Cool")
|
22
22
|
@controller.button_was_triggered.should.be.true
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
it "should allow setting a right nav bar button" do
|
26
26
|
@controller.set_nav_bar_button :right, title: "Cool2", action: :triggered_button
|
27
27
|
tap("Cool2")
|
28
28
|
@controller.button_was_triggered.should.be.true
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
it "should allow opening another screen in the same nav bar and have a back button that is operational" do
|
32
32
|
@controller.open BasicScreen
|
33
|
-
|
33
|
+
|
34
34
|
wait 0.5 do
|
35
|
-
|
35
|
+
|
36
36
|
view("Basic").should.be.kind_of UINavigationItemView
|
37
37
|
view("Functional").should.be.kind_of UINavigationItemButtonView
|
38
|
-
|
38
|
+
|
39
39
|
tap("Functional")
|
40
40
|
wait 0.5 do
|
41
41
|
view("Functional").should.be.kind_of UINavigationItemView
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
end
|
45
45
|
end
|
46
|
-
|
46
|
+
|
47
47
|
it "should allow opening and closing a modal screen" do
|
48
48
|
@basic = BasicScreen.new(nav_bar: true)
|
49
49
|
wait 0.1 do
|
50
50
|
@controller.open_modal @basic
|
51
|
-
|
51
|
+
|
52
52
|
wait 0.6 do
|
53
|
-
|
53
|
+
|
54
54
|
view("Basic").should.be.kind_of UINavigationItemView
|
55
55
|
@basic.close
|
56
|
-
|
56
|
+
|
57
57
|
wait 0.6 do
|
58
58
|
@basic = nil
|
59
59
|
view("Functional").should.be.kind_of UINavigationItemView
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
end
|
63
63
|
end
|
64
64
|
end
|
65
|
-
|
65
|
+
|
66
66
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
describe "Searchable table spec" do
|
2
|
+
tests TableScreenSearchable
|
3
|
+
|
4
|
+
# Override controller to properly instantiate
|
5
|
+
def controller
|
6
|
+
@controller ||= TableScreenSearchable.new(nav_bar: true)
|
7
|
+
@controller.on_load
|
8
|
+
@controller.main_controller
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should be rotated in portrait mode" do
|
12
|
+
rotate_device to: :portrait, button: :bottom
|
13
|
+
true.should == true
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should show all 50 states" do
|
17
|
+
@controller.tableView(@controller.tableView, numberOfRowsInSection:0).should == 50
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should allow searching for all the 'New' states" do
|
21
|
+
@controller.searchDisplayController(@controller, shouldReloadTableForSearchString:"New")
|
22
|
+
@controller.tableView(@controller.tableView, numberOfRowsInSection:0).should == 4
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should allow ending searches" do
|
26
|
+
@controller.searchDisplayController(@controller, shouldReloadTableForSearchString:"North")
|
27
|
+
@controller.tableView(@controller.tableView, numberOfRowsInSection:0).should == 2
|
28
|
+
@controller.searchDisplayControllerWillEndSearch(@controller)
|
29
|
+
@controller.tableView(@controller.tableView, numberOfRowsInSection:0).should == 50
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
describe "Split screen functional" do
|
2
2
|
tests PM::SplitViewController
|
3
|
-
|
3
|
+
|
4
4
|
# Override controller to properly instantiate
|
5
5
|
def controller
|
6
6
|
@app ||= TestDelegate.new
|
@@ -8,59 +8,59 @@ describe "Split screen functional" do
|
|
8
8
|
@detail = DetailScreen.new(nav_bar: true)
|
9
9
|
@controller ||= @app.create_split_screen @master, @detail
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
before do
|
13
13
|
rotate_device to: :landscape, button: :right
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
after do
|
17
17
|
rotate_device to: :portrait, button: :bottom
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
it "should allow opening a detail view from the master view" do
|
21
|
-
|
21
|
+
|
22
22
|
@master.open BasicScreen.new(nav_bar: true), in_detail: true
|
23
|
-
|
23
|
+
|
24
24
|
wait 0.75 do
|
25
25
|
view("Master").should.be.kind_of UINavigationItemView
|
26
26
|
view("Basic").should.be.kind_of UINavigationItemView
|
27
27
|
views(UINavigationItemView).each { |v| v.title.should.not == "Detail" }
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
32
|
it "should allow opening another view from the master view" do
|
33
|
-
|
33
|
+
|
34
34
|
@master.open BasicScreen
|
35
|
-
|
35
|
+
|
36
36
|
wait 0.75 do
|
37
37
|
view("Basic").should.be.kind_of UINavigationItemView
|
38
38
|
view("Detail").should.be.kind_of UINavigationItemView
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
it "should allow opening a master view from the detail view" do
|
44
|
-
|
44
|
+
|
45
45
|
@detail.open BasicScreen.new(nav_bar: true), in_master: true
|
46
|
-
|
46
|
+
|
47
47
|
wait 0.75 do
|
48
48
|
view("Basic").should.be.kind_of UINavigationItemView
|
49
49
|
view("Detail").should.be.kind_of UINavigationItemView
|
50
50
|
views(UINavigationItemView).each { |v| v.title.should.not == "Master" }
|
51
51
|
end
|
52
|
-
|
52
|
+
|
53
53
|
end
|
54
|
-
|
54
|
+
|
55
55
|
it "should allow opening another view from the detail view" do
|
56
|
-
|
56
|
+
|
57
57
|
@detail.open BasicScreen
|
58
|
-
|
58
|
+
|
59
59
|
wait 0.75 do
|
60
60
|
view("Basic").should.be.kind_of UINavigationItemView
|
61
61
|
view("Master").should.be.kind_of UINavigationItemView
|
62
62
|
end
|
63
|
-
|
63
|
+
|
64
64
|
end
|
65
|
-
|
65
|
+
|
66
66
|
end
|
@@ -49,4 +49,25 @@ describe "ProMotion::TestTableScreen functionality" do
|
|
49
49
|
@controller.tableView(@controller.tableView, numberOfRowsInSection:0).should == 5
|
50
50
|
end
|
51
51
|
|
52
|
+
it "should call a method when the switch is flipped" do
|
53
|
+
@controller.scroll_to_bottom
|
54
|
+
tap "switch_1"
|
55
|
+
@controller.tap_counter.should == 1
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should call the method with arguments when the switch is flipped" do
|
59
|
+
@controller.scroll_to_bottom
|
60
|
+
tap "switch_2"
|
61
|
+
@controller.tap_counter.should == 3
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should call the method with arguments when the switch is flipped and when the cell is tapped" do
|
65
|
+
@controller.scroll_to_bottom
|
66
|
+
tap "switch_3"
|
67
|
+
@controller.tap_counter.should == 3
|
68
|
+
|
69
|
+
tap "Switch With Cell Tap, Switch Action And Parameters"
|
70
|
+
@controller.tap_counter.should == 13
|
71
|
+
end
|
72
|
+
|
52
73
|
end
|
@@ -1,20 +1,22 @@
|
|
1
1
|
class TestTableScreen < ProMotion::SectionedTableScreen
|
2
2
|
|
3
|
+
attr_accessor :tap_counter
|
4
|
+
|
3
5
|
def promotion_table_data
|
4
6
|
@promotion_table_data
|
5
7
|
end
|
6
8
|
|
7
9
|
def on_load
|
8
|
-
|
10
|
+
self.tap_counter = 0
|
9
11
|
end
|
10
12
|
|
11
13
|
def table_data
|
12
14
|
@data ||= [{
|
13
15
|
title: "Your Account",
|
14
16
|
cells: [
|
15
|
-
{ title: "Increment", action: :increment_counter_by, arguments: {
|
17
|
+
{ title: "Increment", action: :increment_counter_by, arguments: {number: 3} },
|
16
18
|
{ title: "Add New Row", action: :add_tableview_row },
|
17
|
-
{ title: "Delete the row below", action: :delete_cell, arguments: {section: 0, row:3
|
19
|
+
{ title: "Delete the row below", action: :delete_cell, arguments: {section: 0, row:3} },
|
18
20
|
{ title: "Just another blank row" },
|
19
21
|
{ title: "Delete the row below with an animation", action: :delete_cell, arguments: {animated: true, section: 0, row:5 } },
|
20
22
|
{ title: "Just another blank row" }
|
@@ -23,16 +25,44 @@ class TestTableScreen < ProMotion::SectionedTableScreen
|
|
23
25
|
title: "App Stuff",
|
24
26
|
cells: [
|
25
27
|
{ title: "Increment One", action: :increment_counter },
|
26
|
-
{ title: "Feedback", remote_image: { url: "http://placekitten.com/100/100", placeholder: "some-local-image", size: 50, radius: 15 } }
|
28
|
+
{ title: "Feedback", cell_identifier: "ImagedCell", remote_image: { url: "http://placekitten.com/100/100", placeholder: "some-local-image", size: 50, radius: 15 } }
|
27
29
|
]
|
28
30
|
}, {
|
29
31
|
title: "Image Tests",
|
30
32
|
cells: [
|
31
|
-
{ title: "Image Test 1", image: {image: UIImage.imageNamed("list.png"), radius: 10} },
|
32
|
-
{ title: "Image Test 2", image: {image: "list.png"} },
|
33
|
-
{ title: "Image Test 3", image: UIImage.imageNamed("list.png") },
|
33
|
+
{ title: "Image Test 1", cell_identifier: "ImagedCell", image: {image: UIImage.imageNamed("list.png"), radius: 10} },
|
34
|
+
{ title: "Image Test 2", cell_identifier: "ImagedCell", image: {image: "list.png"} },
|
35
|
+
{ title: "Image Test 3", cell_identifier: "ImagedCell", cell_identifier: "ImagedCell", image: UIImage.imageNamed("list.png") },
|
34
36
|
{ title: "Image Test 4", image: "list.png" },
|
35
37
|
]
|
38
|
+
}, {
|
39
|
+
title: "Cell Accessory Tests",
|
40
|
+
cells: [{
|
41
|
+
title: "Switch With Action",
|
42
|
+
accessory: {
|
43
|
+
view: :switch,
|
44
|
+
action: :increment_counter,
|
45
|
+
accessibility_label: "switch_1"
|
46
|
+
} ,
|
47
|
+
}, {
|
48
|
+
title: "Switch With Action And Parameters",
|
49
|
+
accessory: {
|
50
|
+
view: :switch,
|
51
|
+
action: :increment_counter_by,
|
52
|
+
arguments: { number: 3 },
|
53
|
+
accessibility_label: "switch_2"
|
54
|
+
} ,
|
55
|
+
}, {
|
56
|
+
title: "Switch With Cell Tap, Switch Action And Parameters",
|
57
|
+
accessory:{
|
58
|
+
view: :switch,
|
59
|
+
action: :increment_counter_by,
|
60
|
+
arguments: { number: 3 },
|
61
|
+
accessibility_label: "switch_3"
|
62
|
+
},
|
63
|
+
action: :increment_counter_by,
|
64
|
+
arguments: { number: 10 }
|
65
|
+
}]
|
36
66
|
}]
|
37
67
|
end
|
38
68
|
|
@@ -56,17 +86,25 @@ class TestTableScreen < ProMotion::SectionedTableScreen
|
|
56
86
|
end
|
57
87
|
end
|
58
88
|
|
59
|
-
def increment_counter
|
60
|
-
|
89
|
+
def increment_counter
|
90
|
+
self.tap_counter = self.tap_counter + 1
|
61
91
|
end
|
62
92
|
|
63
93
|
def increment_counter_by(args={})
|
64
|
-
|
94
|
+
self.tap_counter = self.tap_counter + args[:number]
|
65
95
|
end
|
66
96
|
|
67
|
-
def
|
68
|
-
|
97
|
+
def custom_accessory_view
|
98
|
+
set_attributes UIView.new, {
|
99
|
+
background_color: UIColor.orangeColor
|
100
|
+
}
|
69
101
|
end
|
70
102
|
|
103
|
+
def scroll_to_bottom
|
104
|
+
if table_view.contentSize.height > table_view.frame.size.height
|
105
|
+
offset = CGPointMake(0, table_view.contentSize.height - table_view.frame.size.height)
|
106
|
+
table_view.setContentOffset(offset, animated:false)
|
107
|
+
end
|
108
|
+
end
|
71
109
|
|
72
110
|
end
|
@@ -1,5 +1,62 @@
|
|
1
1
|
class TableScreenSearchable < TestTableScreen
|
2
2
|
|
3
3
|
searchable
|
4
|
+
|
5
|
+
def table_data
|
6
|
+
@search_table_data ||= [{
|
7
|
+
cells: [
|
8
|
+
{ title: "Alabama" },
|
9
|
+
{ title: "Alaska" },
|
10
|
+
{ title: "Arizona" },
|
11
|
+
{ title: "Arkansas" },
|
12
|
+
{ title: "California" },
|
13
|
+
{ title: "Colorado" },
|
14
|
+
{ title: "Connecticut" },
|
15
|
+
{ title: "Delaware" },
|
16
|
+
{ title: "Florida" },
|
17
|
+
{ title: "Georgia" },
|
18
|
+
{ title: "Hawaii" },
|
19
|
+
{ title: "Idaho" },
|
20
|
+
{ title: "Illinois" },
|
21
|
+
{ title: "Indiana" },
|
22
|
+
{ title: "Iowa" },
|
23
|
+
{ title: "Kansas" },
|
24
|
+
{ title: "Kentucky" },
|
25
|
+
{ title: "Louisiana" },
|
26
|
+
{ title: "Maine" },
|
27
|
+
{ title: "Maryland" },
|
28
|
+
{ title: "Massachusetts" },
|
29
|
+
{ title: "Michigan" },
|
30
|
+
{ title: "Minnesota" },
|
31
|
+
{ title: "Mississippi" },
|
32
|
+
{ title: "Missouri" },
|
33
|
+
{ title: "Montana" },
|
34
|
+
{ title: "Nebraska" },
|
35
|
+
{ title: "Nevada" },
|
36
|
+
{ title: "New Hampshire" },
|
37
|
+
{ title: "New Jersey" },
|
38
|
+
{ title: "New Mexico" },
|
39
|
+
{ title: "New York" },
|
40
|
+
{ title: "North Carolina" },
|
41
|
+
{ title: "North Dakota" },
|
42
|
+
{ title: "Ohio" },
|
43
|
+
{ title: "Oklahoma" },
|
44
|
+
{ title: "Oregon" },
|
45
|
+
{ title: "Pennsylvania" },
|
46
|
+
{ title: "Rhode Island" },
|
47
|
+
{ title: "South Carolina" },
|
48
|
+
{ title: "South Dakota" },
|
49
|
+
{ title: "Tennessee" },
|
50
|
+
{ title: "Texas" },
|
51
|
+
{ title: "Utah" },
|
52
|
+
{ title: "Vermont" },
|
53
|
+
{ title: "Virginia" },
|
54
|
+
{ title: "Washington" },
|
55
|
+
{ title: "West Virginia" },
|
56
|
+
{ title: "Wisconsin" },
|
57
|
+
{ title: "Wyoming" }
|
58
|
+
]
|
59
|
+
}]
|
60
|
+
end
|
4
61
|
|
5
|
-
end
|
62
|
+
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
describe "PM::Table module" do
|
2
|
-
|
2
|
+
|
3
3
|
def cell_factory(args={})
|
4
4
|
{ title: "Basic", action: :basic_cell_tapped, arguments: { id: 1 } }.merge!(args)
|
5
5
|
end
|
6
|
-
|
6
|
+
|
7
7
|
def custom_cell
|
8
8
|
cell_factory({
|
9
9
|
title: "Crazy Full Featured Cell",
|
@@ -22,7 +22,6 @@ describe "PM::Table module" do
|
|
22
22
|
backgroundColor: UIColor.whiteColor
|
23
23
|
},
|
24
24
|
accessory: :switch, # currently only :switch is supported
|
25
|
-
accessory_view: @some_accessory_view,
|
26
25
|
accessory_type: UITableViewCellAccessoryCheckmark,
|
27
26
|
accessory_checked: true, # whether it's "checked" or not
|
28
27
|
image: { image: UIImage.imageNamed("something"), radius: 15 },
|
@@ -33,7 +32,7 @@ describe "PM::Table module" do
|
|
33
32
|
subviews: [ @some_view, @some_other_view ] # arbitrary views added to the cell
|
34
33
|
})
|
35
34
|
end
|
36
|
-
|
35
|
+
|
37
36
|
before do
|
38
37
|
@subject = TestTableScreen.new
|
39
38
|
@subject.mock! :table_data do
|
@@ -47,62 +46,62 @@ describe "PM::Table module" do
|
|
47
46
|
title: "Table cell group 4", cells: [ custom_cell, cell_factory(title: "4-2"), cell_factory(title: "4-3"), cell_factory(title: "4-4") ]
|
48
47
|
}]
|
49
48
|
end
|
50
|
-
|
49
|
+
|
51
50
|
@subject.on_load
|
52
|
-
|
51
|
+
|
53
52
|
@ip = NSIndexPath.indexPathForRow(1, inSection: 2) # Cell 3-2
|
54
53
|
@custom_ip = NSIndexPath.indexPathForRow(0, inSection: 3) # Cell "Crazy Full Featured Cell"
|
55
|
-
|
54
|
+
|
56
55
|
@subject.update_table_data
|
57
56
|
end
|
58
|
-
|
57
|
+
|
59
58
|
it "should have the right number of sections" do
|
60
59
|
@subject.numberOfSectionsInTableView(@subject.table_view).should == 4
|
61
60
|
end
|
62
|
-
|
61
|
+
|
63
62
|
it "should set the section titles" do
|
64
63
|
@subject.tableView(@subject.table_view, titleForHeaderInSection:0).should == "Table cell group 1"
|
65
64
|
@subject.tableView(@subject.table_view, titleForHeaderInSection:1).should == "Table cell group 2"
|
66
65
|
@subject.tableView(@subject.table_view, titleForHeaderInSection:2).should == "Table cell group 3"
|
67
66
|
@subject.tableView(@subject.table_view, titleForHeaderInSection:3).should == "Table cell group 4"
|
68
67
|
end
|
69
|
-
|
68
|
+
|
70
69
|
it "should create the right number of cells" do
|
71
70
|
@subject.tableView(@subject.table_view, numberOfRowsInSection:0).should == 0
|
72
71
|
@subject.tableView(@subject.table_view, numberOfRowsInSection:1).should == 1
|
73
72
|
@subject.tableView(@subject.table_view, numberOfRowsInSection:2).should == 2
|
74
73
|
@subject.tableView(@subject.table_view, numberOfRowsInSection:3).should == 4
|
75
74
|
end
|
76
|
-
|
75
|
+
|
77
76
|
it "should create the jumplist" do
|
78
77
|
@subject.mock! :table_data_index, do
|
79
78
|
Array("A".."Z")
|
80
79
|
end
|
81
|
-
|
80
|
+
|
82
81
|
@subject.sectionIndexTitlesForTableView(@subject.table_view).should == Array("A".."Z")
|
83
82
|
end
|
84
|
-
|
83
|
+
|
85
84
|
it "should return the proper cell" do
|
86
85
|
cell = @subject.tableView(@subject.table_view, cellForRowAtIndexPath: @ip)
|
87
86
|
cell.should.be.kind_of(UITableViewCell)
|
88
87
|
cell.textLabel.text.should == "3-2"
|
89
88
|
end
|
90
|
-
|
89
|
+
|
91
90
|
it "should return the table's cell height if none is given" do
|
92
91
|
@subject.tableView(@subject.table_view, heightForRowAtIndexPath:@ip).should == 44.0 # Built-in default
|
93
92
|
end
|
94
|
-
|
93
|
+
|
95
94
|
it "should allow setting a custom cell height" do
|
96
95
|
@subject.tableView(@subject.table_view, heightForRowAtIndexPath:@custom_ip).should.be > 0.0
|
97
96
|
@subject.tableView(@subject.table_view, heightForRowAtIndexPath:@custom_ip).should == custom_cell[:height].to_f
|
98
97
|
end
|
99
|
-
|
98
|
+
|
100
99
|
it "should trigger the right action on select and pass in the right arguments" do
|
101
100
|
@subject.mock! :tapped_cell_1 do |args|
|
102
101
|
args[:data].should == [ "lots", "of", "data" ]
|
103
102
|
end
|
104
|
-
|
103
|
+
|
105
104
|
@subject.tableView(@subject.table_view, didSelectRowAtIndexPath:@custom_ip)
|
106
105
|
end
|
107
|
-
|
106
|
+
|
108
107
|
end
|
@@ -15,6 +15,7 @@ describe "table screens" do
|
|
15
15
|
@screen.tableView(@screen.tableView, numberOfRowsInSection:0).should == 6
|
16
16
|
@screen.tableView(@screen.tableView, numberOfRowsInSection:1).should == 2
|
17
17
|
@screen.tableView(@screen.tableView, numberOfRowsInSection:2).should == 4
|
18
|
+
@screen.tableView(@screen.tableView, numberOfRowsInSection:3).should == 3
|
18
19
|
end
|
19
20
|
|
20
21
|
it "should return a UITableViewCell" do
|
@@ -30,10 +31,8 @@ describe "table screens" do
|
|
30
31
|
end
|
31
32
|
|
32
33
|
it "should display all images properly no matter how they were initialized" do
|
33
|
-
|
34
|
-
|
35
|
-
@screen.tableView(@screen.tableView, numberOfRowsInSection:section).times do |i|
|
36
|
-
index_path = NSIndexPath.indexPathForRow(i, inSection: section)
|
34
|
+
@screen.tableView(@screen.tableView, numberOfRowsInSection:2).times do |i|
|
35
|
+
index_path = NSIndexPath.indexPathForRow(i, inSection:2)
|
37
36
|
|
38
37
|
@screen.tableView(@screen.tableView, cellForRowAtIndexPath: index_path).imageView.should.be.kind_of UIImageView
|
39
38
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
describe "PM::TableViewCellModule" do
|
2
|
-
|
2
|
+
|
3
3
|
def custom_cell
|
4
4
|
{
|
5
5
|
title: "Crazy Full Featured Cell",
|
@@ -13,13 +13,12 @@ describe "PM::TableViewCellModule" do
|
|
13
13
|
layer: { masks_to_bounds: true },
|
14
14
|
background_color: UIColor.redColor,
|
15
15
|
selection_style: UITableViewCellSelectionStyleGray,
|
16
|
-
accessory: :switch, # currently only :switch is supported
|
17
|
-
accessory_checked: true, # whether it's "checked" or not
|
16
|
+
accessory:{view: :switch, value: true}, # currently only :switch is supported
|
18
17
|
image: { image: UIImage.imageNamed("list"), radius: 15 },
|
19
18
|
subviews: [ UIView.alloc.initWithFrame(CGRectZero), UILabel.alloc.initWithFrame(CGRectZero) ] # arbitrary views added to the cell
|
20
19
|
}
|
21
20
|
end
|
22
|
-
|
21
|
+
|
23
22
|
before do
|
24
23
|
@screen = TestTableScreen.new
|
25
24
|
button = UIButton.buttonWithType(UIButtonTypeRoundedRect).tap{|b| b.titleLabel.text = "ACC" }
|
@@ -29,47 +28,47 @@ describe "PM::TableViewCellModule" do
|
|
29
28
|
{ title: "", cells: [
|
30
29
|
{title: "Test 1", accessory_type: UITableViewCellStateShowingEditControlMask },
|
31
30
|
custom_cell,
|
32
|
-
{ title: "Test2",
|
31
|
+
{ title: "Test2", accessory: button } ] }
|
33
32
|
]
|
34
33
|
end
|
35
|
-
|
34
|
+
|
36
35
|
@screen.on_load
|
37
|
-
|
36
|
+
|
38
37
|
custom_ip = NSIndexPath.indexPathForRow(1, inSection: 1) # Cell "Crazy Full Featured Cell"
|
39
|
-
|
38
|
+
|
40
39
|
@screen.update_table_data
|
41
|
-
|
40
|
+
|
42
41
|
@subject = @screen.tableView(@screen.table_view, cellForRowAtIndexPath: custom_ip)
|
43
42
|
end
|
44
|
-
|
43
|
+
|
45
44
|
it "should be a PM::TableViewCell" do
|
46
45
|
@subject.should.be.kind_of(PM::TableViewCell)
|
47
46
|
end
|
48
|
-
|
47
|
+
|
49
48
|
it "should have the right title" do
|
50
49
|
@subject.textLabel.text.should == "Crazy Full Featured Cell"
|
51
50
|
end
|
52
|
-
|
51
|
+
|
53
52
|
it "should have the right subtitle" do
|
54
53
|
@subject.detailTextLabel.text.should == "This is way too huge..."
|
55
54
|
end
|
56
|
-
|
55
|
+
|
57
56
|
it "should have the right re-use identifier" do
|
58
57
|
@subject.reuseIdentifier.should == "Cell"
|
59
58
|
end
|
60
|
-
|
59
|
+
|
61
60
|
it "should set the layer.masksToBounds" do
|
62
61
|
@subject.layer.masksToBounds.should == true
|
63
62
|
end
|
64
|
-
|
63
|
+
|
65
64
|
it "should set the background color" do
|
66
65
|
@subject.backgroundView.backgroundColor.should == UIColor.redColor
|
67
66
|
end
|
68
|
-
|
67
|
+
|
69
68
|
it "should set the selection color style" do
|
70
69
|
@subject.selectionStyle.should == UITableViewCellSelectionStyleGray
|
71
70
|
end
|
72
|
-
|
71
|
+
|
73
72
|
it "should set the accessory view to a switch" do
|
74
73
|
@subject.accessoryView.should.be.kind_of(UISwitch)
|
75
74
|
end
|
@@ -79,14 +78,14 @@ describe "PM::TableViewCellModule" do
|
|
79
78
|
subject = @screen.tableView(@screen.table_view, cellForRowAtIndexPath: ip)
|
80
79
|
subject.accessoryView.should.be.kind_of(UIRoundedRectButton)
|
81
80
|
end
|
82
|
-
|
81
|
+
|
83
82
|
it "should set the accessory type to edit" do
|
84
83
|
ip = NSIndexPath.indexPathForRow(0, inSection: 1)
|
85
84
|
subject = @screen.tableView(@screen.table_view, cellForRowAtIndexPath: ip)
|
86
85
|
subject.accessoryView.should.be.nil
|
87
86
|
subject.accessoryType.should == UITableViewCellStateShowingEditControlMask
|
88
87
|
end
|
89
|
-
|
88
|
+
|
90
89
|
it "should set an image with a radius" do
|
91
90
|
@subject.imageView.should.be.kind_of(UIImageView)
|
92
91
|
@subject.imageView.image.should == UIImage.imageNamed("list")
|
@@ -98,9 +97,9 @@ describe "PM::TableViewCellModule" do
|
|
98
97
|
@subject.subviews[2].class.should == UIView
|
99
98
|
@subject.subviews[3].class.should == UILabel
|
100
99
|
end
|
101
|
-
|
102
|
-
|
103
|
-
|
100
|
+
|
101
|
+
|
102
|
+
|
104
103
|
end
|
105
104
|
|
106
105
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ProMotion
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2013-06-
|
14
|
+
date: 2013-06-08 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: motion-stump
|
@@ -120,6 +120,7 @@ files:
|
|
120
120
|
- lib/ProMotion/version.rb
|
121
121
|
- resources/list.png
|
122
122
|
- spec/functional/func_screen_spec.rb
|
123
|
+
- spec/functional/func_searchable_table_spec.rb
|
123
124
|
- spec/functional/func_split_screen_spec.rb
|
124
125
|
- spec/functional/func_table_screen_spec.rb
|
125
126
|
- spec/helpers/basic_screen.rb
|
@@ -176,6 +177,7 @@ summary: ProMotion is a new way to organize RubyMotion apps. Instead of dealing
|
|
176
177
|
Ruby and less like Objective-C.
|
177
178
|
test_files:
|
178
179
|
- spec/functional/func_screen_spec.rb
|
180
|
+
- spec/functional/func_searchable_table_spec.rb
|
179
181
|
- spec/functional/func_split_screen_spec.rb
|
180
182
|
- spec/functional/func_table_screen_spec.rb
|
181
183
|
- spec/helpers/basic_screen.rb
|