【问题标题】:How to create my own delegate (user defined delegate in Objective-C) [duplicate]如何创建我自己的委托(Objective-C 中的用户定义委托)[重复]
【发布时间】:2011-08-05 09:01:05
【问题描述】:

在 iOS 上,如何创建委托(用户定义)?

【问题讨论】:

    标签: ios objective-c


    【解决方案1】:

    首先定义一个像这样声明一个委托 -

    @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 文件 -

    @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;
        }
    }
    

    【讨论】:

      【解决方案2】:

      这是创建自己的委托的基本概念

      委托对于手动控制应用程序中视图控制器数组内的传输非常有用。使用委托可以很好地管理控制流。

      这是自己的代表的小例子......

      1. 创建协议类....(仅限.h)

      SampleDelegate.h

      #import
      
      
      @protocol SampleDelegate
      @optional
      
      #pragma Home Delegate
      
      -(NSString *)getViewName;
      
      @end
      
      1. 将上面的协议类导入您要委托给另一个类的类中。在我的前任这里。我正在使用 AppDelegate 来委托 HomeViewController 的对象。

      也在Delegate Reference中添加上面的DelegateName

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多