ProMotion 0.7.8 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. data/.gitignore +2 -1
  2. data/.travis.yml +1 -1
  3. data/ProMotion.gemspec +2 -0
  4. data/README.md +51 -449
  5. data/Rakefile +11 -1
  6. data/app/screens/basic_screen.rb +0 -24
  7. data/lib/ProMotion/cocoatouch/{NavigationController.rb → navigation_controller.rb} +0 -0
  8. data/lib/ProMotion/cocoatouch/split_view_controller.rb +29 -0
  9. data/lib/ProMotion/cocoatouch/tab_bar_controller.rb +43 -0
  10. data/lib/ProMotion/cocoatouch/{TableViewCell.rb → table_view_cell.rb} +0 -1
  11. data/lib/ProMotion/cocoatouch/{TableViewController.rb → table_view_controller.rb} +0 -0
  12. data/lib/ProMotion/cocoatouch/{ViewController.rb → view_controller.rb} +6 -1
  13. data/lib/ProMotion/{screen_helpers → containers}/split_screen.rb +0 -2
  14. data/lib/ProMotion/containers/tabs.rb +95 -0
  15. data/lib/ProMotion/delegate/delegate.rb +2 -13
  16. data/lib/ProMotion/delegate/{delegate_helper.rb → delegate_module.rb} +29 -16
  17. data/lib/ProMotion/delegate/delegate_notifications.rb +17 -8
  18. data/lib/ProMotion/delegate/delegate_parent.rb +11 -0
  19. data/lib/ProMotion/extensions/conversions.rb +20 -0
  20. data/lib/ProMotion/{helpers/logger.rb → logger.rb} +0 -0
  21. data/lib/ProMotion/map/map_screen.rb +6 -0
  22. data/lib/ProMotion/map/map_screen_annotation.rb +56 -0
  23. data/lib/ProMotion/map/map_screen_module.rb +207 -0
  24. data/lib/ProMotion/{push_notifications → push_notification}/push_notification.rb +13 -6
  25. data/lib/ProMotion/{screens → screen}/screen.rb +1 -1
  26. data/lib/ProMotion/{screens/_screen_module.rb → screen/screen_module.rb} +76 -51
  27. data/lib/ProMotion/{screen_helpers → screen}/screen_navigation.rb +8 -12
  28. data/lib/ProMotion/{screens/_tables → table/cell}/table_view_cell_module.rb +18 -27
  29. data/lib/ProMotion/table/data/table_data.rb +98 -0
  30. data/lib/ProMotion/table/extensions/indexable.rb +9 -0
  31. data/lib/ProMotion/table/extensions/refreshable.rb +45 -0
  32. data/lib/ProMotion/table/extensions/searchable.rb +61 -0
  33. data/lib/ProMotion/table/grouped_table.rb +9 -0
  34. data/lib/ProMotion/table/grouped_table_screen.rb +6 -0
  35. data/lib/ProMotion/table/table.rb +312 -0
  36. data/lib/ProMotion/table/table_screen.rb +6 -0
  37. data/lib/ProMotion/{screens/_compatibility → thirdparty}/formotion_screen.rb +18 -5
  38. data/lib/ProMotion/version.rb +1 -1
  39. data/lib/ProMotion/view/styling.rb +137 -0
  40. data/lib/ProMotion/web/web_screen.rb +6 -0
  41. data/lib/ProMotion/web/web_screen_module.rb +155 -0
  42. data/resources/WebScreen.html +6 -0
  43. data/resources/test.jpeg +0 -0
  44. data/spec/functional/func_map_screen_spec.rb +105 -0
  45. data/spec/functional/func_screen_spec.rb +54 -7
  46. data/spec/functional/func_searchable_table_spec.rb +1 -1
  47. data/spec/functional/func_tab_bar_spec.rb +78 -0
  48. data/spec/functional/func_table_screen_spec.rb +61 -14
  49. data/spec/functional/func_web_screen_spec.rb +51 -0
  50. data/spec/helpers/map_screen.rb +51 -0
  51. data/spec/helpers/present_screen.rb +26 -0
  52. data/spec/helpers/tab_screen.rb +4 -0
  53. data/spec/helpers/table_screen.rb +12 -3
  54. data/spec/helpers/table_screen_formotion.rb +25 -0
  55. data/spec/helpers/table_screen_indexable.rb +13 -0
  56. data/spec/helpers/test_delegate.rb +28 -0
  57. data/spec/helpers/web_screen.rb +22 -0
  58. data/spec/unit/delegate_spec.rb +53 -4
  59. data/spec/unit/map_spec.rb +48 -0
  60. data/spec/unit/screen_helpers_spec.rb +24 -16
  61. data/spec/unit/screen_spec.rb +22 -18
  62. data/spec/unit/split_screen_in_tab_bar_spec.rb +2 -2
  63. data/spec/unit/split_screen_open_screen_spec.rb +15 -10
  64. data/spec/unit/split_screen_spec.rb +2 -2
  65. data/spec/unit/tab_spec.rb +41 -0
  66. data/spec/unit/tables/formotion_screen_spec.rb +16 -0
  67. data/spec/unit/tables/table_indexable_spec.rb +12 -0
  68. data/spec/unit/tables/table_module_spec.rb +24 -9
  69. data/spec/unit/tables/table_screen_spec.rb +1 -1
  70. data/spec/unit/tables/table_view_cell_spec.rb +9 -8
  71. data/spec/unit/view_helper_spec.rb +2 -2
  72. data/spec/unit/web_spec.rb +106 -0
  73. metadata +96 -35
  74. data/lib/ProMotion/cocoatouch/SplitViewController.rb +0 -23
  75. data/lib/ProMotion/helpers/console.rb +0 -29
  76. data/lib/ProMotion/helpers/measure_helper.rb +0 -20
  77. data/lib/ProMotion/helpers/system_helper.rb +0 -29
  78. data/lib/ProMotion/helpers/view_helper.rb +0 -82
  79. data/lib/ProMotion/screen_helpers/screen_elements.rb +0 -36
  80. data/lib/ProMotion/screen_helpers/screen_tabs.rb +0 -95
  81. data/lib/ProMotion/screens/_table_screen_module.rb +0 -47
  82. data/lib/ProMotion/screens/_tables/_refreshable_table.rb +0 -45
  83. data/lib/ProMotion/screens/_tables/_searchable_table.rb +0 -60
  84. data/lib/ProMotion/screens/_tables/_sectioned_table.rb +0 -5
  85. data/lib/ProMotion/screens/_tables/_table.rb +0 -169
  86. data/lib/ProMotion/screens/_tables/grouped_table.rb +0 -16
  87. data/lib/ProMotion/screens/_tables/plain_table.rb +0 -17
  88. data/lib/ProMotion/screens/_tables/table_data.rb +0 -175
  89. data/lib/ProMotion/screens/behaves_like_screen.rb +0 -10
  90. data/lib/ProMotion/screens/table_screen.rb +0 -16
  91. data/spec/unit/ios_version_spec.rb +0 -28
@@ -5,11 +5,13 @@ describe "ProMotion::Screen functional" do
5
5
  def controller
6
6
  rotate_device to: :portrait, button: :bottom
7
7
  @controller ||= FunctionalScreen.new(nav_bar: true)
8
- @controller.main_controller
8
+ @root_screen = @controller
9
+ @controller.navigation_controller
9
10
  end
10
11
 
11
12
  after do
12
13
  @controller = nil
14
+ @root_screen = nil
13
15
  end
14
16
 
15
17
  it "should have a navigation bar" do
@@ -17,19 +19,19 @@ describe "ProMotion::Screen functional" do
17
19
  end
18
20
 
19
21
  it "should allow setting a left nav bar button" do
20
- @controller.set_nav_bar_button :left, title: "Cool", action: :triggered_button
22
+ @root_screen.set_nav_bar_button :left, title: "Cool", action: :triggered_button
21
23
  tap("Cool")
22
- @controller.button_was_triggered.should.be.true
24
+ @root_screen.button_was_triggered.should.be.true
23
25
  end
24
26
 
25
27
  it "should allow setting a right nav bar button" do
26
- @controller.set_nav_bar_button :right, title: "Cool2", action: :triggered_button
28
+ @root_screen.set_nav_bar_button :right, title: "Cool2", action: :triggered_button
27
29
  tap("Cool2")
28
- @controller.button_was_triggered.should.be.true
30
+ @root_screen.button_was_triggered.should.be.true
29
31
  end
30
32
 
31
33
  it "should allow opening another screen in the same nav bar and have a back button that is operational" do
32
- @controller.open BasicScreen
34
+ @root_screen.open BasicScreen
33
35
 
34
36
  wait 0.5 do
35
37
 
@@ -47,7 +49,7 @@ describe "ProMotion::Screen functional" do
47
49
  it "should allow opening and closing a modal screen" do
48
50
  @basic = BasicScreen.new(nav_bar: true)
49
51
  wait 0.1 do
50
- @controller.open_modal @basic
52
+ @root_screen.open_modal @basic
51
53
 
52
54
  wait 0.6 do
53
55
 
@@ -63,4 +65,49 @@ describe "ProMotion::Screen functional" do
63
65
  end
64
66
  end
65
67
 
68
+ it "should fire the will_present, on_present, will_dismiss, and on_dismiss_methods" do
69
+ @presented_screen = PresentScreen.new
70
+ @root_screen.open @presented_screen
71
+ wait 0.6 do
72
+ @presented_screen.will_present_fired.should == true
73
+ @presented_screen.on_present_fired.should == true
74
+
75
+ @presented_screen.will_dismiss_fired.should.not == true
76
+ @presented_screen.on_dismiss_fired.should.not == true
77
+
78
+ @presented_screen.reset
79
+
80
+ @presented_screen.close
81
+ wait 0.6 do
82
+ @presented_screen.will_dismiss_fired.should == true
83
+ @presented_screen.on_dismiss_fired.should == true
84
+
85
+ @presented_screen.will_present_fired.should.not == true
86
+ @presented_screen.on_present_fired.should.not == true
87
+
88
+ @presented_screen = nil
89
+ end
90
+ end
91
+ end
92
+
93
+ it "should pop to the root view controller" do
94
+ @root_vc = @controller.navigation_controller.visibleViewController
95
+ @controller.navigation_controller.viewControllers.count.should == 1
96
+ @controller.open BasicScreen.new
97
+ wait 0.6 do
98
+ @controller.open BasicScreen.new
99
+ wait 0.6 do
100
+ @controller.open BasicScreen.new
101
+ wait 0.6 do
102
+ @controller.navigation_controller.viewControllers.count.should == 4
103
+ @controller.close to_screen: :root
104
+ wait 0.6 do
105
+ @controller.navigation_controller.viewControllers.count.should == 1
106
+ @controller.navigation_controller.topViewController.should == @root_vc
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
112
+
66
113
  end
@@ -5,7 +5,7 @@ describe "Searchable table spec" do
5
5
  def controller
6
6
  @controller ||= TableScreenSearchable.new(nav_bar: true)
7
7
  @controller.on_load
8
- @controller.main_controller
8
+ @controller.navigation_controller
9
9
  end
10
10
 
11
11
  it "should be rotated in portrait mode" do
@@ -0,0 +1,78 @@
1
+ describe "PM::Tabs" do
2
+ tests PM::Tabs
3
+
4
+ # Override controller to properly instantiate
5
+ def controller
6
+ @app ||= TestDelegate.new
7
+
8
+ @screen1 = BasicScreen.new(nav_bar: true, title: "Screen 1")
9
+ @screen2 = BasicScreen.new(nav_bar: true, title: "Screen 2")
10
+ @screen3 = BasicScreen.new(title: "Screen 3")
11
+ @screen4 = BasicScreen.new(title: "Screen 4")
12
+
13
+ @controller ||= @app.open_tab_bar(@screen1, @screen2, @screen3, @screen4)
14
+ @tab_bar = @controller
15
+ end
16
+
17
+ it "should create a UITabBarController" do
18
+ @app.window.rootViewController.should.be.kind_of UITabBarController
19
+ end
20
+
21
+ it "should have four tabs" do
22
+ @tab_bar.viewControllers.length.should == 4
23
+ end
24
+
25
+ it "should have the right screens in the right places" do
26
+ @tab_bar.viewControllers[0].should == @screen1.navigationController
27
+ @tab_bar.viewControllers[1].should == @screen2.navigationController
28
+ @tab_bar.viewControllers[2].should == @screen3
29
+ @tab_bar.viewControllers[3].should == @screen4
30
+ end
31
+
32
+ it "should allow opening a tab by the name from any screen" do
33
+ @screen1.open_tab "Screen 2"
34
+ @tab_bar.selectedIndex.should == 1
35
+ @screen2.open_tab "Screen 3"
36
+ @tab_bar.selectedIndex.should == 2
37
+ @screen3.open_tab "Screen 4"
38
+ @tab_bar.selectedIndex.should == 3
39
+ @screen4.open_tab "Screen 1"
40
+ @tab_bar.selectedIndex.should == 0
41
+ end
42
+
43
+ it "should allow opening a tab by the index from any screen" do
44
+ @screen1.open_tab 1
45
+ @tab_bar.selectedIndex.should == 1
46
+ @screen2.open_tab 2
47
+ @tab_bar.selectedIndex.should == 2
48
+ @screen3.open_tab 3
49
+ @tab_bar.selectedIndex.should == 3
50
+ @screen4.open_tab 0
51
+ @tab_bar.selectedIndex.should == 0
52
+ end
53
+
54
+ it "should allow opening a tab from the app_delegate" do
55
+ @app.open_tab "Screen 2"
56
+ @tab_bar.selectedIndex.should == 1
57
+ @app.open_tab "Screen 3"
58
+ @tab_bar.selectedIndex.should == 2
59
+ @app.open_tab "Screen 4"
60
+ @tab_bar.selectedIndex.should == 3
61
+ @app.open_tab "Screen 1"
62
+ @tab_bar.selectedIndex.should == 0
63
+ end
64
+
65
+ it "should allow opening a tab by accessing the tab bar directly" do
66
+ @tab_bar.open_tab "Screen 2"
67
+ @tab_bar.selectedIndex.should == 1
68
+ @tab_bar.open_tab "Screen 3"
69
+ @tab_bar.selectedIndex.should == 2
70
+ @tab_bar.open_tab "Screen 4"
71
+ @tab_bar.selectedIndex.should == 3
72
+ @tab_bar.open_tab "Screen 1"
73
+ @tab_bar.selectedIndex.should == 0
74
+ end
75
+
76
+
77
+
78
+ end
@@ -6,11 +6,7 @@ describe "ProMotion::TestTableScreen functionality" do
6
6
  rotate_device to: :portrait, button: :bottom
7
7
  @controller ||= TestTableScreen.new(nav_bar: true)
8
8
  @controller.on_load
9
- @controller.main_controller
10
- end
11
-
12
- after do
13
- @controller = nil
9
+ @controller.navigation_controller
14
10
  end
15
11
 
16
12
  it "should have a navigation bar" do
@@ -38,36 +34,87 @@ describe "ProMotion::TestTableScreen functionality" do
38
34
  end
39
35
 
40
36
  it "should delete the specified row from the table view on tap" do
41
- @controller.tableView(@controller.tableView, numberOfRowsInSection:0).should == 6
37
+ @controller.tableView(@controller.tableView, numberOfRowsInSection:0).should == 7
42
38
  tap("Delete the row below")
43
- @controller.tableView(@controller.tableView, numberOfRowsInSection:0).should == 5
39
+ wait 0.3 do
40
+ @controller.tableView(@controller.tableView, numberOfRowsInSection:0).should == 6
41
+ end
44
42
  end
45
43
 
46
44
  it "should delete the specified row from the table view on tap with an animation" do
47
- @controller.tableView(@controller.tableView, numberOfRowsInSection:0).should == 6
45
+ @controller.tableView(@controller.tableView, numberOfRowsInSection:0).should == 7
48
46
  tap("Delete the row below with an animation")
49
- @controller.tableView(@controller.tableView, numberOfRowsInSection:0).should == 5
47
+ wait 0.3 do
48
+ @controller.tableView(@controller.tableView, numberOfRowsInSection:0).should == 6
49
+ end
50
+ end
51
+
52
+ # TODO: Why is it so complicated to find the delete button??
53
+ it "should use editing_style to delete the table row" do
54
+ @controller.tableView(@controller.tableView, numberOfRowsInSection:0).should == 7
55
+ @controller.cell_was_deleted.should != true
56
+ flick("Just another deletable blank row", :to => :left)
57
+
58
+ wait 0.25 do
59
+ # Tap the delete button
60
+ view('Just another deletable blank row').superview.superview.subviews.each do |subview|
61
+ if subview.class == UITableViewCellDeleteConfirmationControl
62
+ tap subview
63
+ wait 0.25 do
64
+ @controller.tableView(@controller.tableView, numberOfRowsInSection:0).should == 6
65
+ @controller.cell_was_deleted.should == true
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+
72
+ it "should not allow deleting if on_cell_delete returns `false`" do
73
+ @controller.tableView(@controller.tableView, numberOfRowsInSection:0).should == 7
74
+ @controller.cell_was_deleted.should != true
75
+ flick("A non-deletable blank row", :to => :left)
76
+
77
+ wait 0.25 do
78
+ # Tap the delete button
79
+ view('A non-deletable blank row').superview.superview.subviews.each do |subview|
80
+ if subview.class == UITableViewCellDeleteConfirmationControl
81
+ tap subview
82
+ wait 0.25 do
83
+ @controller.tableView(@controller.tableView, numberOfRowsInSection:0).should == 7
84
+ @controller.cell_was_deleted.should != false
85
+ end
86
+ end
87
+ end
88
+ end
50
89
  end
51
90
 
52
91
  it "should call a method when the switch is flipped" do
53
92
  @controller.scroll_to_bottom
54
93
  tap "switch_1"
55
- @controller.tap_counter.should == 1
94
+ wait 0.3 do
95
+ @controller.tap_counter.should == 1
96
+ end
56
97
  end
57
98
 
58
99
  it "should call the method with arguments when the switch is flipped and when the cell is tapped" do
59
100
  @controller.scroll_to_bottom
60
101
  tap "switch_3"
61
- @controller.tap_counter.should == 3
102
+ wait 0.3 do
103
+ @controller.tap_counter.should == 3
62
104
 
63
- tap "Switch With Cell Tap, Switch Action And Parameters"
64
- @controller.tap_counter.should == 13
105
+ tap "Switch With Cell Tap, Switch Action And Parameters"
106
+ wait 0.3 do
107
+ @controller.tap_counter.should == 13
108
+ end
109
+ end
65
110
  end
66
111
 
67
112
  it "should call the method with arguments when the switch is flipped" do
68
113
  @controller.scroll_to_bottom
69
114
  tap "switch_2"
70
- @controller.tap_counter.should == 3
115
+ wait 0.3 do
116
+ @controller.tap_counter.should == 3
117
+ end
71
118
  end
72
119
 
73
120
  end
@@ -0,0 +1,51 @@
1
+ describe "ProMotion::TestWebScreen functionality" do
2
+ extend WebStub::SpecHelpers
3
+
4
+ before { disable_network_access! }
5
+ after { enable_network_access! }
6
+
7
+ tests PM::TestWebScreen
8
+
9
+ # Override controller to properly instantiate
10
+ def controller
11
+ rotate_device to: :portrait, button: :bottom
12
+ @webscreen ||= TestWebScreen.new(nav_bar: true)
13
+ @webscreen.navigation_controller
14
+ end
15
+
16
+ after do
17
+ @webscreen = nil
18
+ end
19
+
20
+ it "should have the proper html content" do
21
+ file_name = "WebScreen.html"
22
+
23
+ @webscreen.set_content(file_name)
24
+
25
+ @loaded_file = File.read(File.join(NSBundle.mainBundle.resourcePath, file_name))
26
+ wait_for_change @webscreen, 'load_finished' do
27
+ @webscreen.html.delete("\n").should == @loaded_file.delete("\n")
28
+ end
29
+ end
30
+
31
+ it "should allow you to navigate to a website" do
32
+ stub_request(:get, "https://www.google.com/").
33
+ to_return(body: %q{Google! <form action="/search">%}, content_type: "text/html")
34
+
35
+ @webscreen.open_url(NSURL.URLWithString("https://www.google.com/"))
36
+ wait_for_change @webscreen, 'load_finished' do
37
+ @webscreen.html.include?('<form action="/search"').should == true
38
+ end
39
+ end
40
+
41
+ it "should manipulate the webscreen contents with javascript" do
42
+ @webscreen.set_content('<h1 id="cool">Something Cool</h1>')
43
+
44
+ wait_for_change @webscreen, 'load_finished' do
45
+ @webscreen.evaluate('document.getElementById("cool").innerHTML = "Changed"')
46
+ @webscreen.html.should =~ /<h1 id="cool">Changed<\/h1>/
47
+ end
48
+
49
+ end
50
+
51
+ end
@@ -0,0 +1,51 @@
1
+ class TestMapScreen < PM::MapScreen
2
+
3
+ attr_accessor :infinite_loop_points
4
+
5
+ start_position latitude: 35.090648651123, longitude: -82.965972900391, radius: 4
6
+ title "Gorges State Park, NC"
7
+
8
+ def get_title
9
+ self.title
10
+ end
11
+
12
+ def promotion_annotation_data
13
+ @promotion_annotation_data
14
+ end
15
+
16
+ def annotation_data
17
+ # Partial set of data from "GPS Map of Gorges State Park": http://www.hikewnc.info/maps/gorges-state-park/gps-map
18
+ @data ||= [{
19
+ longitude: -82.965972900391,
20
+ latitude: 35.090648651123,
21
+ title: "Rainbow Falls",
22
+ subtitle: "Nantahala National Forest",
23
+ },{
24
+ longitude: -82.966093558105,
25
+ latitude: 35.092520895652,
26
+ title: "Turtleback Falls",
27
+ subtitle: "Nantahala National Forest",
28
+ },{
29
+ longitude: -82.95916,
30
+ latitude: 35.07496,
31
+ title: "Windy Falls"
32
+ },{
33
+ longitude: -82.943031505056,
34
+ latitude: 35.102516828489,
35
+ title: "Upper Bearwallow Falls",
36
+ subtitle: "Gorges State Park",
37
+ },{
38
+ longitude: -82.956244328014,
39
+ latitude: 35.085548421623,
40
+ title: "Stairway Falls",
41
+ subtitle: "Gorges State Park",
42
+ }]
43
+ end
44
+
45
+ def lookup_infinite_loop
46
+ look_up_address address: "1 Infinite Loop" do |points, error|
47
+ self.infinite_loop_points = points
48
+ end
49
+ end
50
+
51
+ end
@@ -0,0 +1,26 @@
1
+ class PresentScreen < PM::Screen
2
+ attr_accessor :will_present_fired, :on_present_fired, :will_dismiss_fired, :on_dismiss_fired
3
+
4
+ def will_present
5
+ self.will_present_fired = true
6
+ end
7
+
8
+ def on_present
9
+ self.on_present_fired = true
10
+ end
11
+
12
+ def will_dismiss
13
+ self.will_dismiss_fired = true
14
+ end
15
+
16
+ def on_dismiss
17
+ self.on_dismiss_fired = true
18
+ end
19
+
20
+ def reset
21
+ self.will_present_fired = false
22
+ self.on_present_fired = false
23
+ self.will_dismiss_fired = false
24
+ self.on_dismiss_fired = false
25
+ end
26
+ end
@@ -0,0 +1,4 @@
1
+ class TabScreen < PM::Screen
2
+ title "Tab"
3
+ tab_bar_item title: "Tab Item", icon: "list"
4
+ end
@@ -1,6 +1,6 @@
1
- class TestTableScreen < ProMotion::SectionedTableScreen
1
+ class TestTableScreen < ProMotion::TableScreen
2
2
 
3
- attr_accessor :tap_counter
3
+ attr_accessor :tap_counter, :cell_was_deleted
4
4
 
5
5
  def promotion_table_data
6
6
  @promotion_table_data
@@ -17,7 +17,8 @@ class TestTableScreen < ProMotion::SectionedTableScreen
17
17
  { title: "Increment", action: :increment_counter_by, arguments: {number: 3} },
18
18
  { title: "Add New Row", action: :add_tableview_row },
19
19
  { title: "Delete the row below", action: :delete_cell, arguments: {section: 0, row:3} },
20
- { title: "Just another blank row" },
20
+ { title: "Just another deletable blank row", editing_style: :delete },
21
+ { title: "A non-deletable blank row", editing_style: :delete },
21
22
  { title: "Delete the row below with an animation", action: :delete_cell, arguments: {animated: true, section: 0, row:5 } },
22
23
  { title: "Just another blank row" }
23
24
  ]
@@ -86,6 +87,14 @@ class TestTableScreen < ProMotion::SectionedTableScreen
86
87
  end
87
88
  end
88
89
 
90
+ def on_cell_deleted(cell)
91
+ if cell[:title] == "A non-deletable blank row"
92
+ false
93
+ else
94
+ self.cell_was_deleted = true
95
+ end
96
+ end
97
+
89
98
  def increment_counter
90
99
  self.tap_counter = self.tap_counter + 1
91
100
  end