2012-06-06 5 views
1

У меня возникли проблемы с использованием ABPersonViewController с RubyMotion. Ошибка, которую я получаю, -Ошибка ABPersonViewController с RubyMotion

Объектив-C для сообщения setDisplayedPerson:' type v @:^v 'не прекомпилирован. Убедитесь, что вы правильно связываетесь с каркасом или библиотекой, которая определяет это сообщение.

Я подозреваю, что это связано с тем, что RubyMotion не выполняет функции типа IOS. Я думаю, что ABPersonCreate() возвращается в CFType Но displayedPerson сеттер ожидает его отлить в виде ABRecordRef (это только предположение из сообщений об ошибках)

Вот пример кода, чтобы увидеть проблему (на основе образца QuickContacts компании Apple):

#Rakefile 
$:.unshift("/Library/RubyMotion/lib") 
require 'motion/project' 

Motion::Project::App.setup do |app| 
    # Use `rake config' to see complete project settings. 
    app.name = 'contacts' 
    app.frameworks += ['AddressBook', 'AddressBookUI'] 
end 

и

# app/app_delegate.rb 
class AppDelegate 
    def application(application, didFinishLaunchingWithOptions:launchOptions) 
    window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.applicationFrame) 
    window.rootViewController = UINavigationController.alloc.init 
    window.rootViewController.wantsFullScreenLayout = true 
    window.makeKeyAndVisible 
    true 

    # This works 
    add_person('Alex', 'Rothenberg') 

    # This fails (is it a type casting problem?) 
    show_person_view_controller('Rothenberg') 
    end 

    def show_person_view_controller(name) 
    anError = nil 

    address_book = ABAddressBookCreate(); 
    people = ABAddressBookCopyPeopleWithName(address_book, name); 
    person = people.first 
    picker = ABPersonViewController.alloc.init.autorelease 

    picker.personViewDelegate = self 
    puts "Should this be an AddressBookRef? #{person.inspect}" # => #<__NSCFType:0x8c3bec0> 
    picker.displayedPerson = person 
    # The previous line fails 
    puts "We never reach this line!" 

    self.navigationController.pushViewController(picker, animated:true) 
    end 

    def add_person(first_name, last_name) 
    error = nil 
    contact = ABPersonCreate() 
    ABRecordSetValue(contact, KABPersonFirstNameProperty, first_name, error) 
    ABRecordSetValue(contact, KABPersonLastNameProperty, last_name, error) 

    address_book = ABAddressBookCreate() 
    ABAddressBookAddRecord(address_book, contact, error) 
    ABAddressBookSave(address_book, error) 
    end 
end 

Когда вы запустите его, мы можем добавить в адресную книгу в методе add_person, но он не в show_person_view_controller на линии picker.displayedPerson = person

$ rake 
    Build ./build/iPhoneSimulator-5.1-Development 
    Simulate ./build/iPhoneSimulator-5.1-Development/contacts.app 
Should this be an AddressBookRef? #<__NSCFType:0x8da2900> 
Objective-C stub for message `setDisplayedPerson:' type `[email protected]:^v' not precompiled. Make sure you properly link with the framework or library that defines this message. 

Любые предложения будут оценены

+0

Это выглядит как ошибка (там были некоторые другие CoreFoundation ошибки, связанные с рамками AddressBook фиксированной на прошлой неделе, но он все еще нуждается в небольшой работы). Я подал официальный билет поддержки. –

+0

Спасибо. Полагаю, я буду ждать обновления RubyMotion. – alexrothenberg

ответ

1

Это будет работать должным образом, как из RubyMotion 1,12 (запустить sudo motion update).

  • Исправлена ​​ошибка, при которой выполнение методов Objective-C, которые принимают CFType объекты врежется программы (напр., [ABPersonViewController setDisplayedPerson:]).
+0

Мы уверены, что это исправлено, или он снова сломался? Я просто столкнулся с той же проблемой с RubyMotion 2.6. –