2015-05-31 2 views
2

Когда я передаю объектно-c-протокол в качестве параметра, когда и этот делегат затем используется для запуска одного из его методов, метод не запускается.Передача делегата протокола цели-c в качестве параметра

Я использую делегата от Paypal iOS SDK определяется следующим образом:

@protocol PayPalPaymentDelegate <NSObject> 
    - (void)payPalPaymentDidCancel:(PayPalPaymentViewController *)paymentViewController; 
@end 

У меня есть UIViewController, который реализует протокол:

//simpleviewcontroller.h 
@interface SimpleViewController : UIViewController<PayPalPaymentDelegate> 

и сигнатуру метода, как следующее:

// HelperFunctions.m 
+ (void) doSomething: (id<PayPalPaymentDelegate>)paypalDelegate 
{ 
    // the selector 'payPalPaymentDidCancel' DOES fire 
    [paypalDelegate performSelector:@selector(payPalPaymentDidCancel:) withObject:self] 
} 


// called from simpleviewcontroller.m that implements PayPalPaymentDelegate 
[HelperFunctions doSomething: self] 

Проблема в том, что когда paypal возвращает результат, i т не вызывает делегат:

// code inside of the 'success' block of an AFNetworking call 
PayPalPaymentViewController *paymentViewController; 
paymentViewController = [[PayPalPaymentViewController alloc] initWithPayment:payment  
                  configuration:paypalConfiguration 
                  delegate:paypalDelegate]; 

paypalDelegate переданного «делегат» здесь никогда не срабатывают по PayPal. Принимая во внимание, что он срабатывает, если выполняется с помощью simpleviewcontroller.m, а не с помощью метода doSomething

+0

Я думаю, вы также должны передать SimpleViewController, так как для метода делегата также нужен контроллер вида. Он работает с SimpleViewController, так как вы передаете «его», но он не работает, поскольку вы передаете объект «HelperFunctions». (О, подождите, делегат! Просто используйте paypalDelegate вместо себя.) – EDUsta

+0

В строке, где вы пишете '[paypalDelegate performSelector: @selector (payPalPaymentDidCancel :) withObject: self];', что такое 'self', предназначенное для ссылки на ? В конце концов, это метод класса. –

ответ

1

Как только вы создали paymentViewController, вы держите где-то paypalDelegate? PayPalPaymentViewController поддерживает только слабую ссылку на делегата, поэтому, если он не будет выпущен (и, следовательно, ни один из его методов не запускается) ARC в конце области, которая создает PayPalPaymentViewController.

+0

Я не храню paypalDelegate в любой переменной вообще, просто передавая Self в метод doSomething. Должен ли я создать сильную переменную и включить в нее paypalDelegate? Обратите внимание, что использование функции performSelector внутри метода _does_ работает, так ли это не означает, что ссылка делегата не теряется? – Shane

+0

- это код, который создает 'PayPalPaymentViewController' в методе' doSomething: '? Хотя я предполагаю, что вы контроллер просмотра (делегат) находится в иерархии контроллера представления и, вероятно, не выпущен? Поместите журнал в метод 'dealloc' объекта делегата и просто убедитесь, что он не выпущен. –

Смежные вопросы