2013-03-06 3 views
3

Я создаю приложение, которое будет использовать комбинацию MonoTouch (Xamarin.iOS) и Cordova (PhoneGap). Пользовательский интерфейс будет в основном выполнен с использованием Cordova, и наша бизнес-логика будет в основном написана в MonoTouch.Проблема с привязкой Monotouch к Cordova (NSInvalidArgumentException)

Я нашел guide that describes this scenario, поэтому я знаю, что это возможно, и автор добавил Cordova Binding to their fork of the monotouch-bindings project.

К сожалению, когда я попытался создать проект одного вида с использованием привязок, я сразу же столкнулся с проблемами. Я создаю dll для этого, используя файл make в предоставленной Библиотеке Кордовы, и я добавил к методу ViewDidLoad в простом контроллере представления в своем тестовом приложении под названием MyViewController. Вот мой источник

public class MyViewController : UIViewController 
{ 
    private CDVViewController cdv; 

    public MyViewController() 
    { 
    } 

    public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 

     View.Frame = UIScreen.MainScreen.Bounds; 
     View.BackgroundColor = UIColor.White; 
     View.AutoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight; 

     cdv = new CDVViewController(); 

     RectangleF rect = new RectangleF (0, 0, 320, 480); 

     CDV.View.Frame = rect; 

     View.AddSubview(cdv.View); 
    } 
} 

Когда я построить CDVViewController, я получаю следующее исключение:

MonoTouch.Foundation.MonoTouchException: Objective-C exception thrown. Name: NSInvalidArgumentException Reason: -[__NSCFArray dictionaryWithLowercaseKeys]: unrecognized selector sent to instance 0xc892680 
    at at (wrapper managed-to-native) MonoTouch.ObjCRuntime.Messaging:IntPtr_objc_msgSend (intptr,intptr) 
    at CordovaIOS.CDVViewController..ctor() [0x00000] in <filename unknown>:0 
    at <Project_name>.MyViewController.ViewDidLoad() [0x00043] in /Users/jstarke/tmp/<Project_name>/MyViewController.cs:32 
    at at (wrapper managed-to-native) MonoTouch.ObjCRuntime.Messaging:void_objc_msgSend (intptr,intptr) 
    at MonoTouch.UIKit.UIWindow.MakeKeyAndVisible() [0x00010] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIWindow.g.cs:126 
    at <Project_name>.AppDelegate.FinishedLaunching (MonoTouch.UIKit.UIApplication app, MonoTouch.Foundation.NSDictionary options) [0x00031] in /Users/jstarke/tmp/<Project_name>/AppDelegate.cs:23 
    at at (wrapper managed-to-native) MonoTouch.UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr) 
    at MonoTouch.UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x0004c] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:38 
    at <Project_name>.Application.Main (System.String[] args) [0x00000] in /Users/jstarke/tmp/<Project_name>/Main.cs:17 

Моих исследований в этот вопрос до сих пор показали мне, что это почти наверняка связывание проблемы. Я еще не знаю много о привязках, но я пытаюсь учиться, и любая помощь или предложения будут очень благодарны. Чтобы повторить, привязка, которую я использую, найдена здесь: https://github.com/sblom/monotouch-bindings/tree/master/Cordova/Binding

ответ

2

Согласно this thread это проблема компоновщика/загрузчика.

Ссылки что нить относится к мертв, но это выглядит как документ также доступно здесь: http://docs.phonegap.com/en/1.9.0/guide_cordova-webview_ios.md.html

+0

Thanks Rolf. Я посмотрел на этот документ, раздел «Подпроект КордовыLib», пункт 14, в качестве упоминаемого вами потока. Я немного смущен. Эти инструкции кажутся действительно конкретными для создания объектного проекта C. Вы понимаете, что я пытаюсь сделать привязку MonoTouch для этого права? Я проверил, что фреймворки, упомянутые в этом документе, находятся в предложении LinkWith Frameworks, и они, похоже, все в порядке. –

+0

@JamieStarke: Я понимаю, что вы пытаетесь сделать привязку Xamarin.iOS для этого, я считаю, что другие люди (используя чистую Objective-C) столкнулись с одной и той же проблемой, поэтому это не Xamarin.iOS -конкретный. Однако вам необходимо «перенести» инструкции Objective-C эквивалентным способом выполнения этого в привязке Xamarin.iOS. Может быть, сначала попытайтесь сделать полный образец Objective-C, а затем оттуда? –

+0

Хорошая точка, спасибо за совет :) –

1

Итак, как обидные, как это, я должен признать, что я думаю, что это был PEBKAC (проблема существует между Клавиатура и стул).

Учебное пособие, которое я выполнял (here), фактически имело дело с более старой версией Кордовы, но файл make, предоставленный автором, фактически сместил бы голову репортера Кордовы, чтобы построить привязки.

На самом деле, это была красная селедка, и реальной проблемой была проблема с пользователем (мной). Я проверил самую последнюю версию Кордовы и использовал ее для создания образца проекта в соответствии с инструкциями автора, и когда мне пришлось копировать через config.plist (которого там не было), я по ошибке подумал, что это просто переименован в другое имя и вместо этого скопировал этот файл. Когда ни один из плагинов не был доступен, система выйдет из строя с приведенным выше сообщением об ошибке.

Я считаю, что это было в Cordova 2.1, но это было определенно на 2.3, config.plist был удален и заменен на config.xml. Связи действительно нуждались в нескольких незначительных обновлениях, но я не думаю, что это вызывало мои ошибки.

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