2012-05-04 5 views
22

Ruby Motion только что вышел, и screencast, похоже, ничего не говорит о том, можно ли использовать Interface Builder для создания ваших интерфейсов и интеграции их в проект RubyMotion. Возможно ли это? Или у меня действительно есть код от руки, не говоря уже о том, чтобы поддерживать разные куски кода для iPhone/iPad?Могу ли я создавать приложения RubyMotion с помощью Interface Builder?

Моя репутация недостаточно высока, чтобы создать тег rubymotion, поэтому, пожалуйста, помогите, если это необходимо.

+2

попробовать это http://ianp.org/2012/ 05/07/rubymotion-and-interface-builder/ – Andrei

ответ

38

Я просто хотел бы отметить, что RubyMotion 1.3 теперь поддерживает автоматическую компиляцию из .xib файлов, которые вы положили в папку resources. Так что теперь рабочий процесс становится:

  1. Создать файл .xib не используя XCode (нет необходимости, чтобы создать проект, просто используйте File | New ... | File) и сохраните его в папку resources. Поскольку пока нет поддержки для торговых точек, будьте осторожны, чтобы установить свойство tag для каждого элемента управления, который вы хотите использовать в своем коде (вы найдете в листе свойств каждого компонента под заголовком «Вид»).
  2. RubyMotion будет заботиться о компиляции файла .xib в .nib файла, так что наслаждайтесь :)
  3. В вашем UIViewController производном классе, загрузите перо с помощью loadNibNamed:owner:options:, как показано ниже.
  4. В viewDidLoad извлеките различные компоненты с помощью viewWithTag: и добавьте обработчики событий, используя addTarget:action:forControlEvents:, как показано ниже.
  5. В качестве бонуса, в следующий раз, когда вы хотите отредактировать свой xib, просто сделайте open resources/MyView.xib, он запустит только хорошие части XCode.

    class CalculatorViewController < UIViewController 
        def loadView 
       views = NSBundle.mainBundle.loadNibNamed "Keyboard", owner:self, options:nil 
         self.view = views[0] 
        end 
    
        def viewDidLoad 
         button = view.viewWithTag 1 
         button.addTarget self, action:'buttonTapped:', forControlEvents:UIControlEventTouchUpInside 
        end 
    
        def buttonTapped(button) 
         # ... 
        end 
    end 
    
+0

Вот пример проекта с использованием этой техники: [MotionCalc] (https://github.com/nlehuen/MotionCalc) –

+0

, возможно, захочет посмотреть и на это: http://ianp.org/ 2012/05/07/rubymotion-и-интерфейс-строитель / – hutch

1

Но если вы действительно хотите использовать IB, то еще можно было бы использовать его, чтобы выложить свой пользовательский интерфейс и просто вызовите

NSBundle.mainBundle.loadNibNamed(MY_NIB_NAME, owner:self, options:nil) 

или аналогичный. Я не думаю, что RubyMotion использует любое название, чтобы вы могли использовать свои рубиновые классы в IB, явно устанавливая их.

+0

Возможно, вы могли бы сказать немного больше о том, как вы скомпилируете XIB в NIB для использования в проекте RubyMotion? что кажется сложной частью ... –

+0

Вы можете просто использовать 'ibtool'. Сложная часть - это подключение выходов и действий, поскольку вы не можете использовать функции перетаскивания XCode. –

+0

Я пробовал это, передавая опции '--compile' и' --flatten NO', но он продолжает бросать на меня «NSInternalInconsistencyException». Я загружал его с помощью 'myViewController.alloc.initWithNibName (« MyViewController », bundle: nil)' Как именно вы запускаете 'ibtool' для получения загружаемого файла nib? –

1

Возможно, вы можете построить интерфейс в IB и вызвать инструменты командной строки для компиляции XIB в NIB.

Однако вы не сможете подключать розетки или назначать действия, потому что IB не может разобрать исходные файлы Ruby для токенов и IBAction. Обычно код загрузки NIB делает эти подключения для вас после загрузки вашего NIB. Вы должны сделать это сами, в коде.

Из двух вопиющих слабых сторон в RubyMotion, для меня это самое худшее. (Другим является то, что отсутствие завершения кода сделает запись в API Cocoa действительно утомительной.)

+0

Следующая версия IDE рубинового рудника поддерживает разработку рубинового движения и автоматическое завершение API-интерфейсов Cocoa. Так что это может вам помочь – Rubinsh

1

Cappuccino имел ту же проблему. Они разработали инструмент под названием XcodeCapp: https://github.com/cappuccino/cappuccino/tree/master/Tools/XcodeCapp

Он создает «фиктивные» файлы Obj-C, которые вы можете подключить к своим точкам и действиям в IB, автоматически анализирует их в фоновом режиме и позволяет использовать IB для компоновки ваших пользовательских интерфейсов Cappuccino ,

С RubyMotion можно использовать аналогичный подход (если вы действительно хотите использовать IB).

  • Johannes
6

Да, вы можете использовать Interface Builder в RubyMotion.

.xib файлы, которые находятся в каталоге ресурсов, автоматически скомпилируются в файлы .nib и доступны для вашего проекта.

Существует даже способ поддержки торговых точек, если вы так склонны:

https://github.com/yury/ib#readme
http://ianp.org/2012/05/07/rubymotion-and-interface-builder/

Смежные вопросы