ProMotion is a RubyMotion gem that makes iOS development more like Ruby and less like Objective-C. It introduces a clean, Ruby-style syntax for building screens that is easy to learn and remember and abstracts a ton of boilerplate UIViewController, UINavigationController, and other iOS code into a simple, Ruby-like DSL.
- Watch Jamon Holmgren give a talk about ProMotion at RubyMotion #inspect2014 (video)
- Watch the September 2013 Motion Meetup where Gant Laborde interviews Jamon Holmgren about ProMotion
# app/app_delegate.rb
class AppDelegate < PM::Delegate
status_bar true, animation: :fade
def on_load(app, options)
open RootScreen.new(nav_bar: true)
end
end
# app/screens/root_screen.rb
class RootScreen < PM::Screen
title "Root Screen"
def on_load
set_nav_bar_button :right, title: "Help", action: :open_help_screen
end
def open_help_screen
open HelpScreen
end
end
# app/screens/help_screen.rb
class HelpScreen < PM::TableScreen
title "Table Screen"
def table_data
[{
title: "Help",
cells: [
{ title: "About this app", action: :tapped_about },
{ title: "Log out", action: :log_out }
]
}]
end
def tapped_about(args={})
open AboutScreen
end
def log_out
# Log out!
end
end
Screens | Navigation Bars | Tab Bars |
---|---|---|
Table Screens | Grouped Tables | Searchable | Refreshable |
---|---|---|---|
iPad SplitScreens | Map Screens | Web Screens |
---|---|---|
- Check out the Getting Started Guide in the wiki
- Watch the excellent MotionInMotion screencast about ProMotion (very reasonably priced subscription required)
- Follow a tutorial: Building an ESPN app using RubyMotion, ProMotion, and TDD
- Read the updated and exhaustive Wiki
Overview: In ProMotion 2.0, we removed deprecated APIs, refactored and cleaned up a ton of code, pulled PushNotification
and MapScreen
into their own gems, and simplified the API. It now builds 55% faster and is 20%+ lighter.
Follow our Migration Guide for a painless upgrade.
API changes
- Extracted
PM::MapScreen
into ProMotion-map - Extracted
PM::PushNotification
into ProMotion-push - You can't pass a UIImage or UIView into a
title
anymore. Instead, pass a string intotitle_image
(it'll fetch the image for you and create a UIImageView) or pass any arbitrary view intotitle_view
. Now,title
only takes a string title. on_create
has been renamedscreen_init
to avoid confusion with Android'sonCreate
method. It may be reintroduced in a future version of ProMotion as an alias ofonCreate
. We recommend usingon_init
instead.set_nav_bar_right_button
andset_nav_bar_left_button
have been removed. Useset_nav_bar_button :right
and:left
instead.- Added
NSString#to_url
andNSURL#to_url
helper methods to help clean up a lot of code. present_modal_view_controller
now takes two arguments: the ViewController and an argument hash. You shouldn't have been using it in the first place.open_in_tab
now properly opens screens in tabs that didn't have a nav_bar. This is probably the closest thing to a new feature in PM 2.0 that we have, even though it should have worked before.- Cell hash arbitrary values are no longer applied directly to the cell. Instead, use the style: hash to apply arbitrary attributes. Example here.
- Removed cell hash
:subviews
attribute. Instead, subclassPM::TableViewCell
and add your own subviews there. - Actually, there is one new feature. It's called
longpressable
. By addinglongpressable
at the top of yourPM::TableScreen
and then supplying along_press_action:
in your cell hash, you can implement a different action for long presses on table cells. - We no longer insert the cell hash into the arguments hash passed into your cell tap action. If you need that data, pass it in manually.
- Removed
add_element
,add_view
,remove_element
,remove_view
aliases foradd
andremove
. on_load
now fires onviewDidLoad
instead ofloadView
. Added a newload_view
hook for that method & you can set your own view in there. If you don't implementload_view
, one will be created for you (per Apple's recommendations). This change shouldn't change much in your app except that if you're settingself.view = something
, you should do it inload_view
.
Internal changes:
- Removed
motion-require
. ProMotion now relies entirely on RubyMotion's built-in dependency detector. - Removed
rake spec:unit
,rake spec:func
,rake spec:single filename
. We don't really use these for development anymore. - Moved many files around into a more logical, simpler structure.
- Removed
PM::Conversions
. The only helper we were using was theobjective_c_method_name
method, and that was only used inPM::Styling
. So we moved it there. - New module,
PM::NavBarModule
. Moved any navigation controller methods into this module, cleaning up thePM::ScreenModule
quite a bit. - Lots of code refactoring -- CodeClimate went from 2.47 to 3.35 GPA.
- Much cleaner
open
code! - Converted several slow functional tests into fast unit tests with the same coverage.
We've created a comprehensive and always updated wiki with code examples, usage examples, and API reference.
ProMotion is not only an easy DSL to get started. The community is very helpful and welcoming to new RubyMotion developers. We don't mind newbie questions.
If you need help, feel free to open an issue on GitHub. If we don't respond within a day, tweet us a link to the issue -- sometimes we get busy.
See CONTRIBUTING.md.
- Jamon Holmgren: @jamonholmgren
- Silas Matson: @silasjmatson
- Mark Rickert: @markrickert
- Ryan Linton: @ryanlntn
- Many others