2012-05-04 39 views
22

Ruby Motion vừa mới xuất hiện và màn hình dường như không nói gì về việc bạn có thể sử dụng Interface Builder để xây dựng giao diện của bạn và tích hợp chúng trong dự án RubyMotion của bạn hay không. Là một điều như vậy có thể? Hay tôi thực sự có mã tất cả mọi thứ bằng tay, chưa kể đến việc duy trì các phần mã khác nhau cho iPhone/iPad?Tôi có thể xây dựng các ứng dụng RubyMotion với Bộ dựng giao diện không?

Đại diện của tôi không đủ cao để tạo thẻ rubymotion, vì vậy hãy trợ giúp nếu thích hợp.

+2

thử này http://ianp.org/2012/ 05/07/rubymotion-and-giao diện-builder/ – Andrei

Trả lời

38

Tôi chỉ muốn chỉ ra rằng RubyMotion 1.3 bây giờ hỗ trợ biên soạn tự động .xib tập tin mà bạn đưa vào thư mục resources. Vì vậy, bây giờ là công việc trở thành:

  1. Tạo tập tin .xib bạn sử dụng XCode (không cần phải tạo ra một dự án, chỉ cần sử dụng File | New ... | File) và lưu nó vào thư mục resources. Vì chưa có hỗ trợ cho các cửa hàng, hãy cẩn thận để đặt thuộc tính tag cho mỗi điều khiển bạn muốn sử dụng trong mã của mình (bạn sẽ tìm thấy trong bảng thuộc tính của từng thành phần trong tiêu đề "Chế độ xem").
  2. RubyMotion sẽ chăm sóc biên dịch tập tin .xib của bạn vào một tập tin .nib, vì vậy thưởng thức :)
  3. Trong UIViewController lớp được thừa kế của bạn, tải các ngòi sử dụng loadNibNamed:owner:options:, như hình dưới đây.
  4. Trong viewDidLoad, tìm nạp các thành phần khác nhau của bạn bằng cách sử dụng viewWithTag: và thêm trình xử lý sự kiện bằng cách sử dụng addTarget:action:forControlEvents:, như hiển thị bên dưới.
  5. Là phần thưởng, lần tới bạn muốn chỉnh sửa xib của mình, chỉ cần thực hiện open resources/MyView.xib, nó sẽ chỉ khởi chạy các phần tốt của 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

Đây là một dự án mẫu sử dụng kỹ thuật này: [MotionCalc] (https://github.com/nlehuen/MotionCalc) –

+0

có thể muốn xem xét điều này: http://ianp.org/ 2012/05/07/rubymotion-and-giao diện-builder / – hutch

1

Nhưng nếu bạn thực sự muốn sử dụng IB sau đó bạn vẫn có thể có thể sử dụng nó để bố trí giao diện người dùng của bạn và chỉ cần gọi

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

hoặc tương đương. Tôi không nghĩ rằng RubyMotion làm bất kỳ tên mangling để bạn có thể sử dụng các lớp ruby ​​của bạn trong IB bằng cách thiết lập rõ ràng chúng.

+0

có thể bạn có thể nói thêm một chút về cách bạn muốn biên dịch một XIB thành một NIB để sử dụng trong một dự án RubyMotion? mà có vẻ là một phần khó khăn ... –

+0

Bạn chỉ có thể sử dụng 'ibtool'. Phần khó khăn là kết nối các cửa hàng và hành động vì bạn không thể sử dụng các tính năng kéo và thả của XCode. –

+0

Tôi đã thử làm điều đó, chuyển các tùy chọn '--compile' và' --flatten NO', nhưng nó vẫn tiếp tục ném một 'NSInternalInconsistencyException' vào tôi. Tôi đã tải nó với 'myViewController.alloc.initWithNibName (" MyViewController ", bundle: nil)' Làm thế nào chính xác để bạn chạy 'ibtool' để có được một tệp nib có thể tải được? –

1

Bạn có thể xây dựng giao diện bằng IB và gọi các công cụ dòng lệnh để biên dịch XIB thành NIB.

Tuy nhiên, bạn sẽ không thể kết nối các cửa hàng hoặc gán các hành động vì IB không thể phân tích cú pháp các tệp nguồn Ruby cho các mã thông báo IBOutletIBAction. Thông thường, mã tải NIB làm cho các kết nối đó cho bạn sau khi tải NIB của bạn. Bạn sẽ phải tự làm điều đó, bằng mã.

Trong số hai điểm yếu rõ ràng trong RubyMotion, với tôi đây là điều tồi tệ nhất. (Khác là thiếu mã hoàn thành sẽ làm cho văn bản cho các API Cocoa thực sự tẻ nhạt.)

+0

Phiên bản tiếp theo của IDE ruby ​​IDE hỗ trợ phát triển chuyển động ruby ​​và tự động hoàn thành các API Cocoa. Vì vậy, điều này có thể giúp bạn – Rubinsh

1

Cappuccino có cùng một vấn đề. Họ đã phát triển một công cụ có tên là XcodeCapp: https://github.com/cappuccino/cappuccino/tree/master/Tools/XcodeCapp

Nó tạo ra các tệp "giả" Obj-C mà bạn có thể kết nối các cửa hàng và hành động của mình vào IB, tự động phân tích chúng trong nền và cho phép bạn sử dụng IB để bố trí giao diện người dùng Cappuccino của bạn .

Có thể thực hiện một cách tiếp cận tương tự với RubyMotion (nếu bạn thực sự muốn sử dụng IB).

  • Johannes
Các vấn đề liên quan