2011-04-14 7 views

Respuesta

17

en primer lugar definir un declarar un delegado como esto -

@protocol IconDownloaderDelegate; 

a continuación, cree un objeto delegado como esto -

@interface IconDownloader : NSObject 
{ 
    NSIndexPath *indexPathInTableView; 
    id <IconDownloaderDelegate> delegate; 
    NSMutableData *activeDownload; 
    NSURLConnection *imageConnection; 
} 

declarar una propiedad para que -

@property (nonatomic, assign) id <IconDownloaderDelegate> delegate; 

definirlo -

@protocol IconDownloaderDelegate 

- (void)appImageDidLoad:(NSIndexPath *)indexPath; 

@end 

A continuación, puede llamar a métodos en este delegado -

[delegate appImageDidLoad:self.indexPathInTableView]; 

Aquí está el código fuente completo de la clase de descargador de imágenes -

.h archivo - archivo

@class AppRecord; 
@class RootViewController; 

@protocol IconDownloaderDelegate; 

@interface IconDownloader : NSObject 
{ 
    AppRecord *appRecord; 
    NSIndexPath *indexPathInTableView; 
    id <IconDownloaderDelegate> delegate; 

    NSMutableData *activeDownload; 
    NSURLConnection *imageConnection; 
} 

@property (nonatomic, retain) AppRecord *appRecord; 
@property (nonatomic, retain) NSIndexPath *indexPathInTableView; 
@property (nonatomic, assign) id <IconDownloaderDelegate> delegate; 

@property (nonatomic, retain) NSMutableData *activeDownload; 
@property (nonatomic, retain) NSURLConnection *imageConnection; 

- (void)startDownload; 
- (void)cancelDownload; 

@end 

@protocol IconDownloaderDelegate 

- (void)appImageDidLoad:(NSIndexPath *)indexPath; 

@end 

.m -

#import "IconDownloader.h" 
#import "MixtapeInfo.h" 

#define kAppIconHeight 48 
#define TMP NSTemporaryDirectory() 

@implementation IconDownloader 

@synthesize appRecord; 
@synthesize indexPathInTableView; 
@synthesize delegate; 
@synthesize activeDownload; 
@synthesize imageConnection; 

#pragma mark 

- (void)dealloc 
{ 
    [appRecord release]; 
    [indexPathInTableView release]; 

    [activeDownload release]; 

    [imageConnection cancel]; 
    [imageConnection release]; 

    [super dealloc]; 
} 

- (void)startDownload 
{ 
    self.activeDownload = [NSMutableData data]; 

    // alloc+init and start an NSURLConnection; release on completion/failure 
    NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest: 
          [NSURLRequest requestWithURL: 
           [NSURL URLWithString:appRecord.mixtape_image]] delegate:self]; 
    self.imageConnection = conn; 
    [conn release]; 

} 

- (void)cancelDownload 
{ 
    [self.imageConnection cancel]; 
    self.imageConnection = nil; 
    self.activeDownload = nil; 
} 


#pragma mark - 
#pragma mark Download support (NSURLConnectionDelegate) 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    [self.activeDownload appendData:data]; 
} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{ 
    // Clear the activeDownload property to allow later attempts 
    self.activeDownload = nil; 

    // Release the connection now that it's finished 
    self.imageConnection = nil; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    // Set appIcon and clear temporary data/image 
    UIImage *image = [[UIImage alloc] initWithData:self.activeDownload]; 
    self.appRecord.mixtape_image_obj = image; 

    self.activeDownload = nil; 
    [image release]; 

    // Release the connection now that it's finished 
    self.imageConnection = nil; 

    // call our delegate and tell it that our icon is ready for display 
    [delegate appImageDidLoad:self.indexPathInTableView]; 
} 

@end 

y aquí es cómo la utilizamos -

#import "IconDownloader.h" 

@interface RootViewController : UITableViewController <UIScrollViewDelegate, IconDownloaderDelegate> 
{ 
    NSArray *entries; // the main data model for our UITableView 
    NSMutableDictionary *imageDownloadsInProgress; // the set of IconDownloader objects for each app 
} 

en el archivo .m -

- (void)startIconDownload:(AppRecord *)appRecord forIndexPath:(NSIndexPath *)indexPath 
{ 
    IconDownloader *iconDownloader = [imageDownloadsInProgress objectForKey:indexPath]; 
    if (iconDownloader == nil) 
    { 
     iconDownloader = [[IconDownloader alloc] init]; 
     iconDownloader.appRecord = appRecord; 
     iconDownloader.indexPathInTableView = indexPath; 
     iconDownloader.delegate = self; 
     [imageDownloadsInProgress setObject:iconDownloader forKey:indexPath]; 
     [iconDownloader startDownload]; 
     [iconDownloader release]; 
    } 
} 

aquí es delegado recibe llamado automáticamente -

// called by our ImageDownloader when an icon is ready to be displayed 
- (void)appImageDidLoad:(NSIndexPath *)indexPath 
{ 
    IconDownloader *iconDownloader = [imageDownloadsInProgress objectForKey:indexPath]; 
    if (iconDownloader != nil) 
    { 
     UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:iconDownloader.indexPathInTableView]; 

     // Display the newly loaded image 
     cell.imageView.image = iconDownloader.appRecord.appIcon; 
    } 
} 
+0

Gracias Saurabh. –

1

Este es conceptos básicos para crear un propio delegado

Delegados son muy útiles para controlar la transferencia dentro de la gama de controladores de vista en aplicación manualmente. Al usar delegados, puede administrar el flujo de control muy bien.

aquí es pequeño ejemplo de los propios delegados ....

  1. Crear una clase de protocolo .... (.h solamente)

SampleDelegate.h

#import 


@protocol SampleDelegate 
@optional 

#pragma Home Delegate 

-(NSString *)getViewName; 

@end 
  1. Importar clase de protocolo superior en la clase a la que desea delegar de otra clase. Aquí en mi ex. Estoy usando AppDelegate para hacer delegar el Objeto HomeViewController.

también añadir por encima de DelegateName en Delegado de referencia <>

ownDelegateAppDelegate.h

#import "SampleDelegate.h" 

@interface ownDelegateAppDelegate : NSObject <UIApplicationDelegate, SampleDelegate> { 

} 

ownDelegateAppDelegate.m

//setDelegate of the HomeViewController's object as 
[homeViewControllerObject setDelegate:self]; 

//add this delegate method definition 
-(NSString *)getViewName 
{ 
    return @"Delegate Called"; 
} 

HomeViewController.h

#import 
#import "SampleDelegate.h" 

@interface HomeViewController : UIViewController { 

    id<SampleDelegate>delegate; 
} 

@property(readwrite , assign) id<SampleDelegate>delegate; 

@end 

HomeViewController.h

- (void)viewDidAppear:(BOOL)animated { 

    [super viewDidAppear:animated]; 


    UILabel *lblTitle = [[UILabel alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    lblTitle.text = [delegate getViewName]; 
    lblTitle.textAlignment = UITextAlignmentCenter; 
    [self.view addSubview:lblTitle]; 
} 
Cuestiones relacionadas