RubyMotion Tutorial for Beginners: Part 1
In this RubyMotion Tutorial for beginners, you’ll learn how to make a simple Pomodoro app for the iPhone. By Gavin Morrice.
Sign up/Sign in
With a free Kodeco account you can download source code, track your progress, bookmark, personalise your learner profile and more!
Create accountAlready a member of Kodeco? Sign in
Sign up/Sign in
With a free Kodeco account you can download source code, track your progress, bookmark, personalise your learner profile and more!
Create accountAlready a member of Kodeco? Sign in
Contents
RubyMotion Tutorial for Beginners: Part 1
25 mins
- Getting Started
- Differentiating RubyMotion vs. Ruby
- Introducing Pomotion
- Gemfile
- Rakefile
- Overriding Configuration Options
- The “app” Directory
- The “build” Directory
- The “resources” Directory
- The “spec” Directory
- Hello World Example
- Adding a Main View Controller
- Pixate Freestyle
- Adding Views Programmatically
- Getting the Timer to Count Down
- Importing C Code into Your Project
- Where To Go From Here?
Importing C Code into Your Project
The category below extends NSDate with an extra method, secsIn25Mins
:
+ (int) secsIn25Mins {
return TARGET_IPHONE_SIMULATOR ? 10 : 1500;
}
The above method simply defines an extra class method on NSDate that returns the number of seconds in 25 minutes (25 x 60 = 1500 seconds). Since you won't want to wait a full 25 minutes every time you want to test the app during development, the method will return 10 seconds when the app runs in the simulator:
It would be a shame to have to port this code to RubyMotion, just so that you can use it in this app. This particular example is only a few lines, but other libraries or extensions could potentially be several thousand lines. Fortunately, RubyMotion lets you import Objective-C code directly into your app!
Create a new directory within the vendor directory and name it NSDate+SecsIn25Mins:
mkdir vendor/NSDate+SecsIn25Mins/
Then create two files named NSDate+SecsIn25Mins.h and NSDate+SecsIn25Mins.m:
touch vendor/NSDate+SecsIn25Mins/NSDate+SecsIn25Mins.h
touch vendor/NSDate+SecsIn25Mins/NSDate+SecsIn25Mins.m
Open NSDate+SecsIn25Mins.h and add the following code:
#import <Foundation/Foundation.h>
@interface NSDate (SecsIn25Mins)
+ (int) secsIn25Mins;
@end
Now, paste the following code into NSDate+SecsIn25Mins.m:
#import "NSDate+SecsIn25Mins.h"
@implementation NSDate (SecsIn25Mins)
+ (int) secsIn25Mins {
return TARGET_IPHONE_SIMULATOR ? 10 : 1500;
}
@end
Finally, add the following line to the bottom of Rakefile, just before the closing "end":
app.vendor_project('vendor/NSDate+SecsIn25Mins', :static)
Run rake
to build your app and launch it in the Simulator; RubyMotion automatically includes the code you added in the vendor directory.
To see your Obj-C methods at work, run the following command in Terminal (sill in rake, with the simulator active):
NSDate.secsIn25Mins
You should see the following result returned in Terminal:
# => 10
Just as you defined in NSDate+SecsIn25Mins
, this returns 10
since you're running in the Simulator.
Note: If you run the command Time.secsIn25Mins
, you'll get a return value of 10
as well, even though Time
is a Ruby class and not part of the iOS API. What's going on?
RubyMotion cleverly merged the class hierarchies of both Ruby and iOS, so the Time
class inherits from NSDate
; this means the methods from both classes are available to Time
objects.
Note: If you run the command Time.secsIn25Mins
, you'll get a return value of 10
as well, even though Time
is a Ruby class and not part of the iOS API. What's going on?
RubyMotion cleverly merged the class hierarchies of both Ruby and iOS, so the Time
class inherits from NSDate
; this means the methods from both classes are available to Time
objects.
Where To Go From Here?
Here is the sample project up until this point in this RubyMotion tutorial series.
Stay tuned for the next part of the series, where you'll make the timer count down and fully wrap up this app.
In the meantime, if you have any questions or comments, please join the forum discussion below!