C# Monotouch绑定到Cordova时出现问题(NSInvalidArgumentException)

C# Monotouch绑定到Cordova时出现问题(NSInvalidArgumentException),c#,ios,cordova,xamarin.ios,C#,Ios,Cordova,Xamarin.ios,我正在构建一个应用程序,它将使用MonoTouch(Xamarin.iOS)和Cordova(PhoneGap)的组合。UI将主要使用Cordova制作,我们的业务逻辑将主要使用MonoTouch编写 我发现了一个,所以我知道这是可能的,作者添加了一个 不幸的是,当我试图使用绑定创建单视图项目时,我几乎立即遇到了问题。我使用提供的Cordova库中的make文件为此构建dll,并在名为MyViewController的测试应用程序中的简单视图控制器中添加了ViewDidLoad方法。这是我的消息

我正在构建一个应用程序,它将使用MonoTouch(Xamarin.iOS)和Cordova(PhoneGap)的组合。UI将主要使用Cordova制作,我们的业务逻辑将主要使用MonoTouch编写

我发现了一个,所以我知道这是可能的,作者添加了一个

不幸的是,当我试图使用绑定创建单视图项目时,我几乎立即遇到了问题。我使用提供的Cordova库中的make文件为此构建dll,并在名为
MyViewController
的测试应用程序中的简单视图控制器中添加了
ViewDidLoad
方法。这是我的消息来源

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
<代码>单调基础.MULTULUCH异常:抛出Objy-C异常。名称:NSInvalidArgumentException原因:-[\uu nsFarray dictionaryWithLowercaseKeys]:发送到实例0xc892680的无法识别的选择器 at(包装器管理为本机)MonoTouch.ObjCRuntime.Messaging:IntPtr_objc_msgSend(IntPtr,IntPtr) 在CordovaIOS.CDVViewController..ctor()[0x00000]中:0 在/Users/jstarke/tmp//MyViewController.cs:32中的.MyViewController.ViewDidLoad()[0x00043]处 at(包装器管理为本机)MonoTouch.ObjCRuntime.Messaging:void_objc_msgSend(intptr,intptr) 在/Developer/MonoTouch/Source/MonoTouch/src/UIKit/UIWindow.g.cs:126中的MonoTouch.UIKit.UIWindow.makeyAndVisible()[0x00010]处 在AppCuff.FieldHebug启动(Mythouc.UIKIT.UIAPP APP,MyLuxC.Buffig.NS字典选项)[0x00331 ]中/用户/ JStKe/TMP//AppDealt.cs:23 at(包装器管理为本机)MonoTouch.UIKit.UIApplication:UIApplicationMain(int,string[],intptr,intptr) 在/Developer/MonoTouch/Source/MonoTouch/src/UIKit/UIApplication.Main中的MonoTouch.UIKit.UIApplication.Main(System.String[]args,System.String principalClassName,System.String delegateClassName)[0x0004c] /Users/jstarke/tmp//Main.cs:17中的at.Application.Main(System.String[]args)[0x00000] 到目前为止,我对这个问题的研究表明,这几乎肯定是一个有约束力的问题。我对绑定的了解还不多,但我正在努力学习,如有任何帮助或建议,将不胜感激。重申一下,我正在使用的绑定可以从这里找到:

根据它是一个链接器/加载程序问题


线程所指的链接已失效,但看起来这里也有文档:

因此,尽管这很尴尬,我不得不承认,我认为这是一个PEBKAC(键盘和椅子之间存在问题)问题

我所遵循的教程()实际上是处理旧版本的Cordova,但作者提供的make文件实际上会拉下Cordova repo的头部来构建绑定

但事实上,这只是一个转移视线的问题,真正的问题是用户(我)的问题。我已经查看了Cordova的最新版本,并按照作者的指示使用它来设置一个示例项目,当我开始复制config.plist(它不在那里)时,我错误地认为它只是重命名为一个不同的名称,而是复制了该文件。当所有插件都不可用时,系统将因上述错误消息而崩溃


我相信它出现在Cordova 2.1中,但肯定是在2.3中,config.plist被删除,并被config.xml替换。绑定确实需要一些小的更新,但我不认为这会导致我的错误。

谢谢Rolf。我看了一下文档“CordovaLib子项目”部分,第14点,正如您引用的线程所提到的。我有点困惑。这些说明似乎确实针对目标C子项目。你知道我想做一个单触式装订,对吗?我检查了该文档中引用的框架是否在LinkWith frameworks子句中,它们似乎很好。@JamieStarke:我知道您正试图为此创建一个Xamarin.iOS绑定,我的观点是其他人(使用纯Objective-C)也遇到了同样的问题,因此它不是Xamarin.iOS特定的。但是,您确实需要将Objective-C指令“移植”到Xamarin.iOS绑定中的等效方法中。也许首先尝试制作一个完整的Objective-C示例,然后再从那里开始?知道绑定必须有多具体吗。在浏览上述绑定时,我确实发现当前头中不再存在的引用方法和属性存在一些问题。也许这不是问题的全部,但可能会增加问题?@JamieStarke:我相信你也需要与PhoneGap链接(这是找不到的方法:)谢谢Rolf,我想我已经解决了问题。我抓取了一份Cordova 2.5的副本,显然是针对Cordova孵化器<1.9版本进行的绑定。当我尝试运行他们的make时,它会从repo中提取最新版本,并根据该版本进行构建,但从那时起,标题似乎已经更改,不再具有supportsOrientation,例如“()”。今天晚上我会试着写些东西。