Monotouch绑定无法接受委托模型

时间:2012-10-26 04:46:10

标签: ios xamarin.ios

我对Applifier API有以下绑定:

namespace MonoTouch.Applifier {

[BaseType (typeof (NSObject))]
interface Applifier {
    [Export ("initWithApplifierID:withWindow:supportedOrientations:"), Static]
    Applifier InitWithApplifierId (string applifierId, UIWindow withWindow,
        UIDeviceOrientation firstOrientation, IntPtr orientationsPtr);

    [Export ("initWithApplifierID:withWindow:delegate:usingBanners:usingInterstitials:usingFeaturedGames:supportedOrientations:"), Static]
    Applifier InitWithApplifierId (string applifierId, UIWindow withWindow,
        ApplifierGameDelegate gameDelegate, bool usingBanners, bool usingInterstitials,
        bool usingFeaturedGames, UIDeviceOrientation firstOrientation, IntPtr orientationsPtr);

    [Export ("sharedInstance"), Static]
    Applifier SharedInstance { get; }

    [Wrap ("WeakDelegate")]
    ApplifierGameDelegate Delegate { get; set; }

    [Export ("gameDelegate", ArgumentSemantic.Retain)]
    NSObject WeakDelegate { get; set; }

    [Export ("prepareFeaturedGames")]
    void PrepareFeaturedGames ();

    [Export ("showFeaturedGames")]
    void ShowFeaturedGames ();

    [Export ("showBannerAt:")]
    void ShowBannerAt (PointF position);
}

[BaseType (typeof (NSObject))]
[Model]
interface ApplifierGameDelegate {
    [Export("applifierInterstitialReady"), Abstract]
    void InterstitialReady ();

    [Export("applifierFeaturedGamesReady"), Abstract]
    void FeaturedGamesReady ();

    [Export("applifierBannerReady")]
    void BannerReady ();

    [Export("applifierAnimatedReady")]
    void AnimatedReady ();

    [Export("applifierCustomInterstitialReady")]
    void CustomInterstitialReady ();

    [Export("pauseGame")]
    void PauseGame ();

    [Export("resumeGame")]
    void ResultGame ();
}
}

我的附加C#文件中有两种方法可以使这些init方法更容易调用。我不认为它们在这里是相关的,但如果需要我可以包括它们。

这是“gameDelegate”的Obj-C声明:

@property (nonatomic, retain) id<ApplifierGameDelegate> gameDelegate;

ApplifierGameDelegate的协议定义:

@protocol ApplifierGameDelegate <NSObject>
- (void)applifierInterstitialReady;
- (void)applifierFeaturedGamesReady;
@optional
- (void)applifierBannerReady;
- (void)applifierAnimatedReady;
- (void)applifierCustomInterstitialReady;
- (void)pauseGame;
- (void)resumeGame;
@end

这里的问题是,无论我尝试什么,我都无法在我的monotouch项目中获取我的委托实现的方法来从Applifier获取回调。一些说明:

我在Xcode中有一个非常简单的示例应用程序跟随applifier教程工作(测试用例是当显示特色游戏时,在委托上调用“pauseGame”方法)

  • 我注意到如果我将任何对象分配给WeakDelegate,没有任何抱怨,这让我感到惊讶。例如,没有错误或警告:Applifier.SharedInstance.WeakDelegate = new NSString(“Foo”);
  • 我可以从共享实例中获取委托并自己调用该方法,然后调用它。例如:Applifier.SharedInstance.Delegate.PauseGame(); - 无论是将我的委托实例分配给WeakDelegate,Delegate,还是通过接受委托作为参数之一的init方法,都是如此。

我现在唯一的结论是,似乎有两件事是真的:

  • 我可以通过绑定将任何对象分配给gameDelegate,并且没有任何抱怨
  • 某处某处未能识别出我的ApplifierGameDelegate界面与AppliferGameDelegate协议匹配。

我注意到的唯一另一个奇怪的事情是,在我在monotouch-bindings git项目中调用的所有其他示例绑定中,我还没有看到任何其他在委托属性上使用retain属性的绑定

我可以在https://github.com/threerings/monotouch-bindings找到我的monotouch-bindings分支。当前的HEAD是一个被黑客攻击的解决方案,它可以完成我们需要的工作,但我仍然希望最终得到一个完全正确的绑定(只需要委托从C#land工作)。我在这个问题上写的原始绑定可以在提交fdcff4662a36ac42fbe135c098ff7f71cbdf205d查看。

1 个答案:

答案 0 :(得分:0)

我根据您的情况编写了绑定,请检查此绑定是否适合您,我没有测试过,因为我没有ApplifierID

https://github.com/dalexsoto/AlexTouch.Applifier

我向Delegate类添加了一些事件,以便更容易使用并绑定大部分API。

希望这有帮助

亚历