A simple two-way data binding library for RubyMotion.
Ruby
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
app
lib
resources
spec
.gemrelease
.gitignore
.travis.yml
Gemfile
Gemfile.lock
LICENSE.txt
README.md
Rakefile
motion_bindable.gemspec

README.md

Motion Bindable

Build Status Code Climate

A simple two-way data binding library for RubyMotion.

NOTICE

Version 0.3.0 introduces breaking changes and deprecations. If you're upgrading, please check the release notes.

Installation

Add this line to your application's Gemfile:

gem 'motion_bindable'

And then execute:

$ bundle

If you want to use the default strategies that come with MotionBindable add this to your app_delegate.rb:

def application(application, didFinishLaunchingWithOptions: launch_options)
  MotionBindable::Strategies.apply
  true
end

Terminology

Name Definition
Object Refers to the parent object that can have many bindings. Usually a model of some sort.
Binding The connection between an object and it's bound children. Observes and updates both sides. Represented as a Strategy
Bound Usually an input object, like a UITextField or a Proc.

Usage

Add include MotionBindable::Bindable to make an object bindable:

# Models

class Item
  include MotionBindable::Bindable
  attr_accessor :name
  attr_accessor :location

  def location
    @address ||= Address.new
  end
end

class Address
  attr_accessor :address
end

In your view controller, you can bind the object to a set of Views or any other object:

class ItemListViewController
  def viewDidLoad
    super
    @name_field = UITextField.alloc.initWithFrame [[110, 60], [100, 26]]
    @name_field.placeholder = "Name"
    view.addSubview @name_field

    @address_field = UITextField.alloc.initWithFrame [[110, 100], [100, 26]]
    @address_field.placeholder = "Address"
    view.addSubview @address_field

    @item = Item.new
  end

  def viewWillAppear(animated)
    @item.bind_attributes({
      name: @name_field,
      location: {
        address: @address_field
      }
    })
  end

  # Recommended: Clean everything up when the view leaves
  def viewWillDisappear(animated)
    @item.unbind_all
  end
end

When @name_field.text or @address_field.text changes, so will your model!

Custom Strategies

The above example uses the MotionBindable::Strategies::UITextField. which comes with MotionBindable. Take a look in lib/motion_bindable/strategies for the available defaults. You can implement your own strategies by extending MotionBindable::Strategy. Please use the existing strategies as a guideline.

Default Strategies

The following strategies come with motion-bindable and are setup when MotionBindable::Strategies.apply is called.

Name Object Candidates Direction
MotionBindable::Strategies::UITextField Any UITextField Bound <-> Attribute
MotionBindable::Strategies::Proc Any Proc Bound --> Attribute
MotionBindable::Strategies::UILabel Any UILabel Bound <-- Attribute

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request