2011-04-14 40 views

回答

17

首先定義一個聲明一個代理這樣的 -

@protocol IconDownloaderDelegate; 

然後創建一個委託對象這樣的 -

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

聲明一個屬性爲它 -

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

定義它 -

@protocol IconDownloaderDelegate 

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

@end 

然後就可以調用這個委託方法 -

[delegate appImageDidLoad:self.indexPathInTableView]; 

這裏的完整的源代碼圖片下載類 -

.h file -

@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 

,這裏是我們如何使用它 -

#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 
} 

在.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]; 
    } 
} 

這裏是代表獲得自動調用 -

// 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

由於SAURABH。 – 2011-04-14 11:03:26

1

這是基本概念來創建自己的委託

委託是手動控制的應用程序視圖控制器的陣列內轉移非常有用的。使用委託可以很好地管理控制流。

這裏是自己的代表小例子....

  1. 創建一個協議類....(.H只)

SampleDelegate.h

#import 


@protocol SampleDelegate 
@optional 

#pragma Home Delegate 

-(NSString *)getViewName; 

@end 
  1. 導入上面的協議類,你想讓另一個類的委託的類。在我的前身。我使用AppDelegate來使HomeViewController的對象的委託。

也代表參考<>

ownDelegateAppDelegate添加上述DelegateName。ħ

#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]; 
} 
相關問題