2010-07-16 3 views
0

Сценарий: необходимо выполнить делегат CustomWebview на контроллере представления.Как использовать протокол вместо делегирования в iPhone

Пожалуйста, помогите мне с этим кодом. Вместо использования обратного вызова мне нужно использовать «Протокол». Это можно сделать или мы можем использовать только обратный вызов в этом сценарии.

На 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"); 
} 

На 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 

На 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]; 
} 

ответ

3

Ваш вопрос немного неясен. Протокол и делегат - это две совершенно разные, хотя и связанные вещи - яблоки и апельсины. Протокол определяет список методов объект может или должен реагировать:

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

Делегат является объектом, как правило, экземпляром пользовательского класса, который передал другой объект для пользовательской обработки или обратной связи - это последний объект делегаты работают с объектом делегата.


Вы спрашиваете, как преобразовать категорию делегата в NSObject в протокол делегата? (Раньше был образцом Apple для определения обязательств и способностей делегата, последний - это новый способ сделать то же самое.) Если это так, то обычно выглядит примерно так:

Категория делегата в NSObject

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

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

Делегат Протокол

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


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

Это то, что вы ищете? Если нет, можете ли вы точно определить, что вы пытаетесь сделать?

+0

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

+0

Вы хотите, чтобы ваш собственный класс имел протокол делегата (отдельно от 'UIWebViewDelegate')?Если это так, определите протокол (как показано выше), измените тип свойства делегата с 'id' на' id 'и используйте либо' [self.delegate performSelector: @selector (theDelegateMethod :) withObject: self] ' или 'objc_msgSend (self.delegate, @selector (theDelegateMethod :), self)' для отправки сообщения делегату. (Если протокол определяет метод как необязательный, убедитесь, что вы можете его вызвать с помощью '[self.delegate replysToSelector: @selector (theDelegateMethod :))' first!) –

+0

В MyWebView.h @protocol webProtocol - (void) loadWeb; @end @property (nonatomic, assign) id делегат ;. Теперь, как это реализовать в «ViewControler.m» – iPhoneDev

0

Также см. Раздел Apple Communicating with Objects, в котором рассматриваются делегаты, протоколы и селекторы. Хотя он указан в Mac OS X, большинство (если не все), похоже, также относятся к iOS.

0

На 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"); 
} 

На 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 

На MyWebView.m

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    [delegate finishLoading]; 
} 
Смежные вопросы