2012-05-04 15 views
22

Ruby Motion właśnie wyszedł, a screencast nie mówi nic o tym, czy można używać Konstruktora interfejsu do budowania interfejsów i integrowania ich w projekcie RubyMotion. Czy coś takiego jest możliwe? Czy naprawdę mam kod wszystko ręcznie, nie wspominając o zachowaniu różnych fragmentów kodu dla iPhone'a/iPada?Czy mogę tworzyć aplikacje RubyMotion za pomocą narzędzia do tworzenia interfejsów?

Mój przedstawiciel nie jest wystarczająco wysoki, aby utworzyć tag rubymotion, więc proszę o pomoc, jeśli to konieczne.

+2

spróbować http://ianp.org/2012/ 05/07/rubymotion-and-interface-builder/ – Andrei

Odpowiedz

38

Chciałbym tylko zwrócić uwagę, że teraz RubyMotion 1.3 obsługuje automatycznego zestawiania .xib plików, które należy umieścić w folderze resources. Więc teraz staje workflow:

  1. Utwórz plik .xib użyciu XCode (nie trzeba stworzyć projekt, wystarczy użyć File | New ... | File) i zapisać go w folderze resources. Ponieważ nie ma jeszcze wsparcia dla gniazd, należy ustawić właściwość tag dla każdej kontrolki, której chcesz użyć w kodzie (znajdziesz ją w arkuszu właściwości każdego komponentu pod nagłówkiem "Widok").
  2. RubyMotion zajmie kompilacji plik .xib do pliku .nib, więc cieszyć :)
  3. W swojej UIViewController klasie pochodnej, załaduj stalówkę korzystając loadNibNamed:owner:options:, jak pokazano poniżej.
  4. W viewDidLoad pobierz różne komponenty za pomocą viewWithTag: i dodaj procedury obsługi zdarzeń za pomocą addTarget:action:forControlEvents:, jak pokazano poniżej.
  5. Jako bonus, następnym razem, gdy chcesz edytować swój Xib, po prostu wykonaj open resources/MyView.xib, uruchomi on tylko dobre części 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

Oto przykładowy projekt wykorzystujący tę technikę: [MotionCalc] (https://github.com/nlehuen/MotionCalc) –

+0

może również chcieć rzucić okiem na to: http://ianp.org/ 2012/05/07/rubymotion-and-interface-builder / – hutch

1

Ale jeśli naprawdę chcesz użyć IB następnie można prawdopodobnie nadal używać go rozłożyć swoje UI i zadzwoń

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

lub podobny. Nie sądzę, żeby RubyMotion manipulował imionami, więc możesz użyć swoich klas ruby ​​w IB, jawnie je ustawiając.

+0

może mógłbyś powiedzieć trochę więcej o tym, jak skompilowałbyś XIB w NIB do wykorzystania w projekcie RubyMotion? to wydaje się być trudna część ... –

+0

Możesz po prostu użyć 'ibtool'. Najtrudniejszą częścią jest połączenie gniazd i działań, ponieważ nie można korzystać z funkcji przeciągania i upuszczania w XCode. –

+0

Próbowałem to zrobić, przekazując opcje '--compile' i' --flatten NO', ale ciągle wyrzuca mi 'NSInternalInconsistencyException'. Załadowałem go za pomocą 'myViewController.alloc.initWithNibName (" MyViewController ", bundle: nil)' Jak dokładnie uruchamiasz 'ibtool', aby uzyskać ładowalny plik nib? –

1

Prawdopodobnie można zbudować interfejs w IB i wywołać narzędzia wiersza polecenia, aby skompilować XIB do NIB.

Nie można jednak podłączyć gniazd ani przypisywać akcji, ponieważ IB nie może przeanalizować plików źródłowych Ruby dla tokenów IBOutlet i IBAction. Zwykle kod ładowania NIB tworzy te połączenia po załadowaniu NIB. Będziesz musiał to zrobić sam, w kodzie.

Z dwóch rażących słabości RubyMotion, dla mnie jest to najgorsze. (Drugim jest to, że brak uzupełnienia kodu sprawi, że pisanie do API Cocoa będzie naprawdę nudne.)

+0

Następna wersja kopalni rubinów IDE obsługuje tworzenie animacji ruby ​​i automatyczne uzupełnianie interfejsów API Cocoa. To może ci pomóc – Rubinsh

1

Cappuccino miał ten sam problem. Oni opracowali narzędzie o nazwie XcodeCapp: https://github.com/cappuccino/cappuccino/tree/master/Tools/XcodeCapp

tworzy to „obojętne” pliki Obj-C, które można podłączyć placówek i działań w IB, automatycznie analizuje je w tle i umożliwia korzystanie IB do układu cappuccino UI .

Powinno być możliwe zastosowanie podobnego podejścia z RubyMotion (jeśli naprawdę chcesz używać IB).

  • Johannes
Powiązane problemy