2010-07-16 5 views
0

Scénario: Nécessité d'exécuter le délégué CustomWebview sur le contrôleur de vue.Comment utiliser le protocole au lieu de déléguer dans l'iPhone

S'il vous plaît aidez-moi avec ce code. Au lieu d'utiliser le rappel, j'ai besoin d'utiliser "Protocole". Peut-il être fait ou nous pouvons seulement utiliser le rappel dans ce scénario.

Sur ViewController.m

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    //MyWebView *webView = [[MyWebView alloc] initWithDelegate:self callback:@selector(finishLoading)]; 

    MyWebView *webView= [[MyWebView alloc] initWithFrame:CGRectMake(0,0,320, 460)]; 
    [webView LoadURL:@"http://192.168.5.165/"]; 
    [webView setDelegate:self]; 
    [webView setCallback:@selector(finishLoading)]; 
    [self.view addSubview:webView] ; 
} 

- (void) finishLoading 
{ 
    NSLog(@"Finish"); 
} 

Sur MyWebView.h

@interface MyWebView : UIView<UIWebViewDelegate> { 
    NSString *strURL; 
} 
@property(nonatomic, retain) NSString *strURL; 
@property (nonatomic, assign) id delegate; 
@property (nonatomic, assign) SEL callback; 

-(void) LoadURL:(NSString*)url; 
@end 

Sur MyWebView.m

#import "MyWebView.h" 

@implementation MyWebView 
@synthesize strURL,delegate,callback; 
UIWebView *webView; 
-(id) initWithFrame:(CGRect)frame 
{ 
    if(self =[super initWithFrame:frame]) 
    { 
     webView = [[UIWebView alloc] initWithFrame:frame]; 
     webView.delegate = self; 
     [self addSubview:webView]; 

    } 
    return self; 
} 

-(void) LoadURL:(NSString*)url 
{ 
    NSURL *u = [NSURL URLWithString:url]; 
    NSURLRequest *req= [NSURLRequest requestWithURL:u]; 
    [webView loadRequest:req]; 
} 

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    [delegate performSelector:callback]; 
} 

Répondre

3

Votre question est un peu floue. Un protocole et un délégué sont deux choses complètement séparées, bien que liées, des pommes et des oranges. Un protocole définit une liste des méthodes d'un objet peut ou doit répondre à:

@protocol Document 
+ (id)documentWithContentsOfURL: (NSURL *)aURL; 
- (void)writeToURL: (NSURL *)aURL error: (NSError **)outError; 
@end 

Un délégué est un objet, généralement une instance d'une classe personnalisée, qui est remis à un autre objet pour le traitement personnalisé ou une rétroaction - que dernier objet délégués travail à l'objet délégué. Demandez-vous comment convertir une catégorie de délégué sur NSObject en un protocole de délégué? (Le premier était le modèle d'Apple pour définir les obligations et les capacités d'un délégué, ce dernier étant la nouvelle façon de faire la même chose.) Si oui, cela ressemble généralement à ceci:

Catégorie de délégué sur NSObject

@interface NSObject (WidgetDelegate) 
- (void)doSomethingWithWidget: (Widget *)w; 
@end 

@interface Widget : NSObject 
@property (readwrite, assign) id delegate; 
@end 

Protocole délégué

@protocol WidgetDelegate <NSObject> 
- (void)doSomethingWithWidget: (Widget *)w; 
@end 


@interface Widget : NSObject 
@property (readwrite, assign) id <WidgetDelegate> delegate; 
@end 

Est-ce que vous cherchez? Si non, pouvez-vous clarifier exactement ce que vous essayez de faire?

+0

Je sais que le code ci-dessus peut avoir le protocole, dans ce cas, je don Pas besoin d'utiliser CALLBACK. juste ne sais pas comment mettre en œuvre le protocole. Pouvez-vous s'il vous plaît aider à changer le code en utilisant le protocole au lieu de CALLBACK. – iPhoneDev

+0

Voulez-vous dire que vous voulez que votre propre classe ait un protocole de délégué (distinct de 'UIWebViewDelegate')?Si oui, définissez le protocole (comme indiqué ci-dessus), changez le type de propriété de votre délégué de 'id' à' id ', et utilisez soit [[self.delegate performSelector: @selector (theDelegateMethod :) withObject: self]' ou 'objc_msgSend (self.delegate, @selector (theDelegateMethod :), self)' pour envoyer le message au délégué. (Si le protocole définit la méthode comme facultative, assurez-vous de vérifier que vous pouvez l'appeler avec [self.delegate respondsToSelector: @selector (theDelegateMethod :)] 'en premier!) –

+0

Dans MyWebView.h @protocol webProtocol - (vide) loadWeb; @end @property (non atomique, affectez) id délégué ;. Maintenant, comment puis-je l'implémenter dans "ViewControler.m" – iPhoneDev

0

Voir aussi Communicating with Objects d'Apple, qui traite des délégués, des protocoles et des sélecteurs. Bien qu'il soit répertorié sous Mac OS X, la plupart (sinon la totalité) semble s'appliquer également à iOS.

0

Sur ViewController.m

@interface MyViewController : UIViewController<MyFinishLoadingDelegate> { 
//your own definition 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    //MyWebView *webView = [[MyWebView alloc] initWithDelegate:self callback:@selector(finishLoading)]; 

    MyWebView *webView= [[MyWebView alloc] initWithFrame:CGRectMake(0,0,320, 460)]; 
    [webView LoadURL:@"http://192.168.5.165/"]; 
    [webView setDelegate:self]; 
    [self.view addSubview:webView] ; 
} 

- (void)finishLoading //this is your implementation for MyFinishLoadingDelegate 
{ 
    NSLog(@"Finish"); 
} 

Sur MyWebView.h

//you declare the protocol here to tell anyone who'd like to act like your delegate that they need to implement "finishLoading" 
@protocol MyFinishLoadingDelegate <NSObject> 
- (void)finishLoading; 
@end 

@interface MyWebView : UIView<UIWebViewDelegate> { 
    NSString *strURL; 
} 
@property(nonatomic, retain) NSString *strURL; 
@property (nonatomic, assign) id<MyFinishLoadingDelegate> delegate; 

-(void) LoadURL:(NSString*)url; 
@end 

Sur MyWebView.m

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    [delegate finishLoading]; 
} 
Questions connexes