Hola, Soy nuevo en iPhone, ¿alguien me puede decir cómo crear un delegado (definido por el usuario), he hecho una investigación sobre esto, pero no es capaz de encontrar ninguna respuesta satisfactoria, cualquier ayuda sería muy apreciada GraciasCómo crear mi propio delgate (delegado definido por el usuario en el objetivo c)
Respuesta
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;
}
}
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 ....
- Crear una clase de protocolo .... (.h solamente)
SampleDelegate.h
#import
@protocol SampleDelegate
@optional
#pragma Home Delegate
-(NSString *)getViewName;
@end
- 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];
}
- 1. objetivo-c protocolo definido en su propio archivo .h?
- 2. ¿Crear mi propio instalador desde C#?
- 3. Definición de Guid definido por el usuario
- 4. Seriado de clase definido por el usuario, C++ y msgpack
- 5. Cómo crear mi propio dotnet obfuscator
- 6. Cómo crear mi propio formulario en joomla
- 7. C++ montón mínimo con tipo definido por el usuario
- 8. ¿Puedo crear mi propio certificado digital en C# o Windows?
- 9. ¿Cómo crear mi propio motor de recomendación?
- 10. crear mi propio lenguaje de programación
- 11. ¿Cómo escribir mi propio contenedor en C#?
- 12. ¿Cómo crear un vector de tamaño definido por el usuario pero sin valores predefinidos?
- 13. ¿Dónde pongo mi declaración de delegado C# en un archivo propio?
- 14. por qué necesitamos el cargador de clases definido por el usuario en java
- 15. cómo extender un protocolo para un delegado en el objetivo C, luego subclase un objeto para requerir un delegado conforme
- 16. ¿Cómo obtener información sobre un tipo definido por el usuario?
- 17. Cómo poner el tipo de datos definido por el usuario en un diccionario
- 18. por qué y dónde utilizar un delegado en el objetivo c
- 19. El método __mul__ definido por el usuario no es conmutativo
- 20. ¿Cómo puedo crear mi propio archivo vsdoc.js para mi JavaScript?
- 21. TIPO definido por el usuario en bases de datos
- 22. cómo crear json en objetivo-c
- 23. epub en el objetivo c
- 24. Cómo pasar valores por referencia en el objetivo C (iphone)
- 25. ¿Cómo puedo crear mi propio diseñador de formularios?
- 26. Ajuste del objetivo C en el objetivo C++/C++
- 27. Error "Tipo definido por el usuario no definido" en VB 6 bajo Windows 7
- 28. Escribiendo mi propio compilador C++
- 29. Distinct() devuelve duplicados con un tipo definido por el usuario
- 30. Symfony2: Dónde establecer un huso horario definido por el usuario
Gracias Saurabh. –