Я создаю приложение, которое будет использовать комбинацию 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
Thanks Rolf. Я посмотрел на этот документ, раздел «Подпроект КордовыLib», пункт 14, в качестве упоминаемого вами потока. Я немного смущен. Эти инструкции кажутся действительно конкретными для создания объектного проекта C. Вы понимаете, что я пытаюсь сделать привязку MonoTouch для этого права? Я проверил, что фреймворки, упомянутые в этом документе, находятся в предложении LinkWith Frameworks, и они, похоже, все в порядке. –
@JamieStarke: Я понимаю, что вы пытаетесь сделать привязку Xamarin.iOS для этого, я считаю, что другие люди (используя чистую Objective-C) столкнулись с одной и той же проблемой, поэтому это не Xamarin.iOS -конкретный. Однако вам необходимо «перенести» инструкции Objective-C эквивалентным способом выполнения этого в привязке Xamarin.iOS. Может быть, сначала попытайтесь сделать полный образец Objective-C, а затем оттуда? –
Хорошая точка, спасибо за совет :) –