我对 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 ();
}
}
我的 extras C# 文件中有两种方法可以更轻松地调用这些初始化方法。我认为它们在这里不相关,但如果需要,我可以将它们包括在内。
这是“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 中有一个非常简单的示例应用程序,遵循确实有效的应用程序教程(测试用例是当显示特色游戏时,在委托上调用“pauseGame”方法)
- 我注意到,如果我将任何对象分配给 WeakDelegate,没有任何抱怨,这让我大吃一惊。例如,没有错误或警告: Applifier.SharedInstance.WeakDelegate = new NSString("Foo");
- 我可以从共享实例中获取委托并自己调用该方法,它确实被调用了。例如:Applifier.SharedInstance.Delegate.PauseGame(); -- 无论我将委托实例分配给 WeakDelegate、Delegate 还是通过接受委托作为参数之一的 init 方法,这都是正确的。
我现在唯一的结论是,似乎有两件事是真的:
- 我可以通过绑定将任何对象分配给 gameDelegate,没有任何抱怨
- 某处无法识别我的 ApplifierGameDelegate 接口与 AppliferGameDelegate 协议匹配。
我注意到的另一个奇怪的事情是,在我在 monotouch-bindings git 项目中探索的所有其他示例绑定中,我没有看到任何其他在委托属性上使用保留属性的示例。
我的 monotouch-bindings 分支可以在https://github.com/threerings/monotouch-bindings找到。当前的 HEAD 是一种组合解决方案,可以完成我们需要完成的工作,但我仍然希望最终得到一个完全正确的绑定(只需要委托在 C# 领域工作)。我在这个问题中写的原始绑定可以在提交 fdcff4662a36ac42fbe135c098ff7f71cbdf205d 中查看。