2012-07-14 20 views
6

Zdefiniowałem protokół w osobnym pliku (myProtocol.h). Oto kod dla niego:Aplikacja IOS - zdefiniuj protokół w oddzielnym pliku

#import <Foundation/Foundation.h> 

@protocol myProtocol <NSObject> 
    -(void) loadDataComplete; 
@end 

Teraz chcę wywołać tę metodę tak zrobiłem następujący kod:

firstViewController.h:

#import "myProtocol.h" 

@interface firstViewController : UIViewController{ 
    id <myProtocol> delegate; 
} 
@property (retain) id delegate; 
-(void) mymethod; 

firstViewController.m

@implementation firstViewController 
@synthesize delegate; 

- (void)viewDidLoad { 
    [self mymethod]; 
} 

-(void) mymethod { 
    //some code here... 
    [delegate loadDataComplete]; 
} 

mam inny plik, w którym protokół wykorzystywany jest również:

secondViewController.h:

#import "myProtocol.h" 
@interface secondViewController : UIViewController<myProtocol>{ 
} 

secondViewController.m:

-(void) loadDataComplete{ 
    NSLog(@"loadDataComplete called"); 
} 

, ale mój secondViewController nie wywołuje metad protokołu. Dlaczego tak jest? Wszelkie sugestie zostaną docenione.

+2

Czy faktycznie tworzysz obiekt i przypisujesz go jako delegata? Ponadto - wyraźne odniesienie do delegata nie jest typowe. Na koniec nazwy klas powinny zaczynać się od dużej litery. – Abizern

+0

czy ustawiasz swojego delegata, jaka jest wartość self.delegate w wiadomość Mymethod? mam zwyczaj używać "siebie". dla dostępu do właściwości – divol

Odpowiedz

11

Po pierwsze, jako sugerowane, @Abizern, spróbuj ponownie sformatować swój kod. Użyj dużej litery na zajęcia. Powiedział to tutaj rozwiązanie dla twojej odpowiedzi.

To jest protokół. Nazwałbym to tak, jak FirstViewControllerDelegate, ponieważ klasa implementująca obiekt jest delegatem dla FirstViewController. Jest to SecondViewController. Jest to FirstViewController.

#import <UIKit/UIKit.h> 

@interface FirstViewController : UIViewController 

// it coud be better to declare these properties within a class extension but for the sake of simplicity you could leave here 
// the important thing is to not declare the delegate prop with a strong/retain property but with a weak/assign one, otherwise you can create cycle 
@property (nonatomic, strong) SecondViewController* childController; 
@property (nonatomic, weak) id<MyProtocol> delegate; 

@end 

@implementation FirstViewController 

// other code here... 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.childController = [[SecondViewController alloc] init]; 
    self.delegate = self.childController; // here the central point 

    // be sure your delegate (SecondViewController) responds to doSomething method 
    if(![self.delegate respondsToSelector:@selector(doSomething)]) { 

     NSLog(@"delegate cannot respond"); 
    } else { 

     NSLog(@"delegate can respond"); 
     [self.delegate doSomething]; 
    }  
} 

@end 

Ze względu na kompletność, należy rozumieć charakterystykę delegatów. Apple doc jest twoim przyjacielem. Możesz rzucić okiem na the-basics-of-protocols-and-delegates, aby uzyskać podstawowe wprowadzenie do argumentu. Ponadto wyszukiwanie SO pozwala znaleźć wiele odpowiedzi na ten temat.

Nadzieję, że pomaga.

+0

Oczywiście, jeśli chcesz, możesz zmienić wzorzec 'if-else' w' myMethod'. –

+1

Dziękuję Flex_Addicted. Niesamowita odpowiedź. korekta trochę kodu w kodzie self.delegate = self.childController; zamiast self.delegate = dziecko; dzięki jeszcze raz. –

+0

@ViralNarshana Nie ma za co! Przepraszam za błąd. Naprawiłem to :) –

Powiązane problemy