2017-01-05 6 views
0

На самом деле у меня есть три контроллера вида, названных в моем приложении. Я навигации от А до В, а затем B до C. Я звоню метод делегата от C, который реализуется в А. вот мой кодПользовательский делегат не вызван?

A.h

#import "A.h" 
#import "C.h" 

В A.m У меня есть

@interface A()<delegateName> 
-(void)delegateMethod 
{ 
    NSLog(@"delegate"); 
} 
-(void)moveToB 
{ 
    C *instanceOfC=[C alloc] init]; 
    instanceOfC.delegate=self;    //line 1 
} 

В B.h

#"import C.h" 

В B.m

-(void)moveToC 
{ 
    A *instanceOfA=[[A alloc] init]; 
    C *instanceOfC=[[C alloc] init];  
    instanceOfC.delegate= instanceOfA;   //line 2 
} 

В C.h

@protocal delegateName <NSObject> 
-(void)delegateMethod; 
@end 
@interface C 
@property(nonatomic,weak) id<delegateName> delegate; 
@end 

В C.m

@synthesize delegate; 
-(void)inSomeMethod 
{ 
[delegate delegateMethod]; 
} 

если я ставлю <delegateName> в A.h вместо A.m то говорит undeclared delegate.

+0

- (void) moveToB { C * instanceOfC = [C alloc] init]; instanceOfC.delegate = self; } Я думаю, вам нужно сделать экземпляр класса B здесь –

+0

, чтобы перейти к следующему viewController с помощью pushViewController i, созданного экземпляром b, но когда я отлаживаю [делегировать делегатMethod]; @ этот делегат линии равен нулю, поэтому я назначил этот экземпляр между страницами. – jaymala

+0

Попробуйте это. В A - (void) moveToB { B * instanceOfB = [B alloc] init]; instanceOfB.delegate = self; }. И в B - (void) moveToC { C * instanceOfC = [[C alloc] init]; instanceOfC.delegate = self.delegate; } – Arjuna

ответ

0

В moveToC вы назначаете instanceOfA собственности делегата от instanceOfC. В конце moveToC оба экземпляра освобождены, так как вы не храните ссылки на instanceOfC, например. присвойте ему свойство.

Вы можете это исправить, добавив @property (strong, nonatomic) C *cInstance; в свой B.m класс и назначить его при инстанцировании instanceOfC:

-(void)moveToC { 
    A *instanceOfA=[[A alloc] init]; 
    self.cInstance = [[C alloc] init]; 
    self.cInstance.delegate= instanceOfA; 
} 

Тем не менее, конструкция выглядит не так со мной. Я бы переименовать delegateProtocol в Somthing еще, как DirtyJobHandler и ввести обычай init метод в классе C:

- (instanceType)initWithDirtyJobHandler:id<DirtyJobHandler> dirtyJobHandler { 
    self = [super init]; 
    if (self) { 
     self.dirtyJobHandler = dirtyJobHandler //previous knonw as self.delegate 
    } 
} 

, который способен придать эту зависимость:

[[C alloc] initWithDirtyJobHandler:instanceOfA]; 
+0

Добавьте указанное свойство 'cInstance' в' Bm', которое затем можно присвоить 'self.cInstance = ...', чтобы провести сильную ссылка на 'instanceOfC'. Однако я рекомендую второй подход. – shallowThought

+0

спасибо за помощь – jaymala

+0

На этом мы благодарим, приняв ответ. – shallowThought

0

Я думаю, что проблема в линии

A *instanceOfA=[[A alloc] init]; 

в функции

-(void)moveToC 
{ 
A *instanceOfA=[[A alloc] init]; 
C *instanceOfC=[[C alloc] init]; 
instanceOfC.delegate= instanceOfA; 
} 

Заменить первую строку с

A *instanceofA = self.navigationController.viewControllers[indexofA] 

В B ViewController вы снова выделить новую память для ViewController и установить делегата к нему.Вместо этого вам нужно установить делегат, который был ранее в памяти, и который можно найти двумя способами.

(i) Получить его от контроллера навигации (ii) Создайте объект A viewcontroller в B viewcontroller.

+0

Правильно, что распределение новых контроллеров представлений является ошибкой. Правда, это не так. – danh

+0

Я заменил данную линию Gour и сделал свойство делегата сильным и его вокалом. Спасибо vishal, arjuna, danh, shallowThought и каждое тело ... Его работа – jaymala

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

  • Нет связанных вопросов^_^