Как использовать дополнительные методы протокола в Objective-C?

Я все еще новичок в Objective-C, но я успешно создал свое собственное приложение, и у меня возникли небольшие проблемы с реализацией видеообъявлений для Chartboost.

Я реализую наградное видео, которое создает всплывающее окно, предлагающее пользователю бесплатную жизнь в обмен на просмотр видео. Я могу заставить всплывающее окно работать нормально. Но я не могу понять, как, если пользователь решил смотреть видео или нет.

Я знаю, что в файле Chartboost.h есть правильный метод для этого, указанный в разделе @Optional, но я понятия не имею, как использовать его в моем файле Level1.m.

 - (void)didClickRewardedVideo:(CBLocation)location;

Также обратите внимание, что Chartboost.m не входит в структуру, которую мне дали.

Спасибо за любую помощь!


person Alan Scarpa    schedule 12.09.2014    source источник
comment
Хорошо, я вижу - это просто заявленный интерфейс. Но я не совсем понимаю, что вы имеете в виду, говоря, что вам нужно вызвать didClickRewardedVideo: из объекта, который соответствует этому протоколу, после проверки того, что объект реализует этот метод. Я прочитал этот вопрос и ответ, на который вы ссылались, но я все еще не совсем понимаю. Я хочу добиться этого - if (didClickRewardedVideo) { then do this }. Извините - я еще новенький!   -  person Alan Scarpa    schedule 12.09.2014
comment
Ах, извините, я думаю, что я понял это неправильно. Я полагаю, что вы хотите реализовать этот метод в своем собственном классе, который соответствует этому протоколу, и библиотека вызовет его в соответствующее время. Смотрите мой ответ ниже.   -  person Stuart    schedule 12.09.2014


Ответы (1)


Я не знаком с библиотекой Chartboost, но похоже, что ChartboostDelegate — это протокол, который необходимо реализовать в собственном коде, как и в случае любого объекта-делегата. Библиотека будет вызывать didClickRewardedVideo: для некоторого зарегистрированного объекта при нажатии на видео с вознаграждением. Назначили ли вы себя делегатом экземпляра Chartboost или аналогичного?

Итак, в вашем классе Level1 вы должны объявить о соответствии протоколу и реализовать метод (если вам нужно... в конце концов, это необязательно):

@interface Level1 () <ChartboostDelegate>
@end

@implementation

// ...
// ...

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

@end

Подробнее о шаблоне делегирования в Cocoa можно прочитать в Концепции программирования на языке Objective-C.

person Stuart    schedule 12.09.2014
comment
Привет, Стюарт, вот что я сделал на основе вашего предложения: В моем файле Level1.h я сделал: @interface Level1 : CCNode <CCPhysicsCollisionDelegate, ChartboostDelegate> - (void)didClickRewardedVideo:(CBLocation)location; Затем я реализовал в своем файле .m - (void)didClickRewardedVideo:(CBLocation)location { CCLOG(@"I CLICKED IT"); } Итак, когда [Chartboost showRewardedVideo:CBLocationGameOver]; запускается и я щелкаю видео, я должен увидеть, что Я ЩЕЛКНУЛ ЭТО, но у меня все еще ничего нет. @Стюарт - person Alan Scarpa; 12.09.2014
comment
Также в Chartboost.h есть 2 протокола @protocol ChartboostDelegate;, который содержит @interface Chartboost : NSObject. Второй протокол содержит didClickRewardedVideo и выглядит следующим образом: @protocol ChartboostDelegate <NSObject> @optional Может быть, это поможет? - person Alan Scarpa; 12.09.2014
comment
Ах да, я ожидал, что протокол будет называться ChartboostDelegate. Итак, библиотека определяет класс Chartboost, который отправляет обратные вызовы делегата объекту, который регистрирует себя как делегат Chartboost (под @interface Chartboost вы увидите свойство с именем delegate). Я подозреваю, что вы не устанавливаете делегата, поэтому не получаете обратный вызов. Обычно это делается при создании экземпляра Chartboost. Также нет необходимости объявлять -didClickRewardedVideo: в Level1.h — это делается неявно, декларируя соответствие ChartboostDelegate. - person Stuart; 12.09.2014
comment
@Alan_s Я настоятельно рекомендую вам прочитать документация по шаблону делегирования. Этот шаблон проектирования широко распространен во всех фреймворках и библиотеках Cocoa, и вы будете сталкиваться с ним снова и снова. Загрузите пример кода и попробуйте его (например, все с UITableViews будет использовать делегирование). - person Stuart; 12.09.2014
comment
@Alan_s О, еще одно: в Chartboost.h есть только один протокол. Первый (@protocol ChartboostDelegate;) является упреждающим объявлением, используемым, поскольку фактическое объявление протокола (@protocol ChartboostDelegate <NSObject>...) пишется после интерфейса Chartboost. Интерфейс должен знать о существовании протокола делегата, поэтому в предварительном объявлении говорится, что существует протокол с именем ChartboostDelegate, поверьте мне, этого достаточно, чтобы интерфейс объявил свойство делегата (например, @property(nonatomic, weak) id <ChartboostDelegate> delegate;). - person Stuart; 12.09.2014