如何解决如何创建自己的代理目标c中用户定义的委托[重复]
|| 这个问题已经在这里有了答案:解决方法
首先定义一个声明这样的委托-
@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;
}
}
,这是创建自己的委托的基本概念
委托对于在应用程序中手动控制视图控制器数组中的传输非常有用。使用委托,您可以很好地管理控制流。
这是自己的代表的一个小例子。
创建一个协议类...。(仅.h)
SampleDelegate.h
#import
@protocol SampleDelegate
@optional
#pragma Home Delegate
-(NSString *)getViewName;
@end
在要作为另一个类的委托的类中,将以上协议类导入。在我前任我正在使用AppDelegate来委托HomeViewController的Object。
还要在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];
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。