Как использовать протокол вместо делегата в iPhone - PullRequest
0 голосов
/ 16 июля 2010

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

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

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

On 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

On 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 ]

3 голосов
/ 16 июля 2010

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

@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 голосов
/ 11 июля 2012

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

On 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

On MyWebView.m

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    [delegate finishLoading];
}
0 голосов
/ 25 марта 2011

Также см. Apple Общение с объектами , в которой рассматриваются делегаты, протоколы и селекторы. Несмотря на то, что он указан в Mac OS X, большинство (если не все), похоже, применимо и к iOS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...