【问题标题】:How do I use optional protocol methods in Objective-C?如何在 Objective-C 中使用可选协议方法?
【发布时间】:2014-09-12 07:14:32
【问题描述】:

我对 Objective-C 还是很陌生,但我已经成功地创建了自己的应用程序,但在实施 Chartboost 的视频广告时遇到了一些麻烦。

我正在实施一个奖励视频,它会创建一个弹出窗口,为用户提供免费生活以换取观看视频。我可以让弹出窗口正常工作。但我不知道用户是否决定观看视频。

我知道 Chartboost.h 文件有正确的方法,列在@optional 下,但我不知道如何在我的 Level1.m 文件中使用它

 - (void)didClickRewardedVideo:(CBLocation)location;

另外请注意,Chartboost.m 不包含在他们给我的框架中。

感谢您的帮助!

【问题讨论】:

  • 请看question & answer。听起来Chartboost 只是一个协议(我认为Chartboost.h 中没有@interface?),这就是为什么没有相应的“.m”文件的原因——协议只是声明的接口,而不是实现。在这种情况下,您需要从符合此协议的对象中调用didClickRewardedVideo:,并检查该对象是否实现了该方法。
  • 好的,我明白了——它只是一个声明的接口。但是我不太明白您的意思是“在检查对象是否实现该方法之后,您需要从符合此协议的对象中调用 didClickRewardedVideo:”。我阅读了您链接到的那个问题和答案,但我仍然不太明白。我想实现这一点 - 如果(didClickRewardedVideo){然后这样做}。抱歉 - 我还是新手!
  • 啊抱歉,我想我弄错了。我相信您想在自己的某个符合该协议的类中实现该方法,并且库会在适当的时候调用它。请参阅下面的答案。

标签: ios objective-c xcode ios8 chartboost


【解决方案1】:

我不熟悉 Chartboost 库,但听起来ChartboostDelegate 是您需要在自己的代码中实现的协议,就像任何委托对象一样。当点击奖励视频时,图书馆将在某个注册对象上调用didClickRewardedVideo:。您是否将自己设置为 Chartboost 实例或类似实例的代表?

因此,在您的Level1 类中,您必须声明符合协议并实现该方法(如果您需要...毕竟是可选的):

@interface Level1 () <ChartboostDelegate>
@end

@implementation

// ...
// ...

- (void)didClickRewardedVideo:(CBLocation)location
{
    // Video was clicked. Do something appropriate.
}

@end

您可以在Concepts in Objective-C Programming 文档中阅读有关 Cocoa 中委托模式的更多信息。

【讨论】:

  • 嗨 Stuart,这是我根据你的建议所做的:在我的 Level1.h 文件中我做了:@interface Level1 : CCNode &lt;CCPhysicsCollisionDelegate, ChartboostDelegate&gt; - (void)didClickRewardedVideo:(CBLocation)location; 然后我在我的 .m 文件中实现了- (void)didClickRewardedVideo:(CBLocation)location { CCLOG(@"I CLICKED IT"); } 所以当[Chartboost showRewardedVideo:CBLocationGameOver]; 是运行并单击视频,我应该看到“我单击了它”,但我仍然一无所获。 @斯图尔特
  • 另外,Chartboost.h 中有两个协议@protocol ChartboostDelegate;,其中包含@interface Chartboost : NSObject。第二个协议是包含 didClickRewardedVideo 的协议,它看起来像这样:@protocol ChartboostDelegate &lt;NSObject&gt; @optional 也许这有帮助?
  • 啊,是的,我确实希望该协议被称为ChartboostDelegate。因此库定义了一个类Chartboost,它将委托回调发送到一个对象,该对象将自己注册为Chartboost 的委托(在@interface Chartboost 下,您将看到一个名为delegate 的属性)。我怀疑你没有设置委托,所以没有收到回调。这通常在您创建 Chartboost 实例的地方完成。此外,无需在 Level1.h 中声明 -didClickRewardedVideo: - 这是通过声明符合 ChartboostDelegate 隐式完成的。
  • @Alan_s 我强烈建议您阅读documentation on the delegation pattern。这种设计模式在 Cocoa 框架和库中普遍存在,您会一次又一次地遇到它。下载一些示例代码并尝试一下(例如,任何带有UITableViews 的东西都将使用委托)。
  • @Alan_s 哦,另一件事:Chartboost.h 中只有一个协议。第一个(@protocol ChartboostDelegate;)是一个前向声明,因为实际的协议声明(@protocol ChartboostDelegate &lt;NSObject&gt;...)是写在Chartboost接口之后。接口需要知道委托协议的存在,所以前向声明说“有一个协议叫ChartboostDelegate,相信我”,这足以让接口声明一个委托属性(例如@property(nonatomic, weak) id &lt;ChartboostDelegate&gt; delegate;)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-15
相关资源
最近更新 更多