У меня возникли проблемы с использованием 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.
Любые предложения будут оценены
Это выглядит как ошибка (там были некоторые другие CoreFoundation ошибки, связанные с рамками AddressBook фиксированной на прошлой неделе, но он все еще нуждается в небольшой работы). Я подал официальный билет поддержки. –
Спасибо. Полагаю, я буду ждать обновления RubyMotion. – alexrothenberg