Almacena información asociada adicional en una UIView

He estado leyendo mucho acerca de los reconocedores de gestos en SO, y he logrado escribir un código de trabajo que cuando se reconoce a largo ploop en un UIImage, aparece una hoja de acción:

{ ... UILongPressGestureRecognizer *longPressWall = [[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(deleteImage:)] autorelease]; longPressWall.minimumPressDuration = 0.4; l.userInteractionEnabled=YES; [l addGestureRecognizer:longPressWall]; ... } -(void)deleteImage:(UILongPressGestureRecognizer*)sender { if(UIGestureRecognizerStateBegan == sender.state) { UIActionSheet *as = [[UIActionSheet alloc] initWithTitle:@"" delegate:self cancelButtonTitle:@"Close" destructiveButtonTitle:@"Delete Screenshot" otherButtonTitles: nil]; [as showInView:masterView]; [as release]; } } 

Por lo tanto, enviar información al selector deleteImage: es un poco complicado en esta situación. Quiero enviar una request HTTP a un server cuando se llama deleteImage, así que necesito algo de información de la vista.

¿Hay UIImageView almacenar información en UIImageView y recuperarla de sender.view.myinfo (por ejemplo)?

¡Gracias!

La forma más obvia es usar la propiedad tag. Si necesita más información, siempre puede subclasificar UIImageView y agregar una propiedad adicional.

A través de una extensión puede agregar una propiedad a UIView para almacenar sus valores asociados, así:

 import Foundation import ObjectiveC extension UIImageView { struct Static { static var key = "key" } var myInfo:AnyObject? { get { return objc_getAssociatedObject( self, &Static.key ) as AnyObject? } set { objc_setAssociatedObject( self, &Static.key, newValue, .OBJC_ASSOCIATION_RETAIN) } } } 

Ahora puedes hacer esto en cualquier parte de tu código

 let anImageView = UIView() // set your new property on any UIView: anImageView.myInfo = <some object> // get your proeprty from any UIView myImage = anImageView.myInfo 

respuesta anterior (mismo código, pero en Objective-C) Echa un vistazo a objc_setAssociatedObject() en <objc/runtime.h>

Implementaría esto como una categoría … (estilo ARC)

 #import <objc/runtime.h> @interface UIImageView (MyInfo) @property ( nonatomic, strong ) id myInfo ; @end @implementation UIImageView (MyInfo) -(void)setMyInfo:(id)info { objc_setAssociatedObject( self, "_myInfo", info, OBJC_ASSOCIATION_RETAIN_NONATOMIC ) ; } -(id)myInfo { return objc_getAssociatedObject( self, "_myInfo" ) ; } @end 

Ahora puedes hacer esto:

 UIImage * myImage ; myImage.myInfo = <some object> 

Si desea almacenar una cadena en su UIImageView (o cualquier UIView para ese asunto), intente lo siguiente:

Establezca el identificador de accesibilidad en su vista, "l"

 { l.accessibilityIdentifier = @"your string here"; } 

Obtenga la UIView, "l", de su reconocimiento de gestos:

 -(void)deleteImage:(UILongPressGestureRecognizer*)sender { if(UIGestureRecognizerStateBegan == sender.state) { UIView *view = sender.view; NSString *stonetworkingString = view.accessibilityIdentifier; } } 

stonetworkingString es la cadena almacenada en su UIView. Espero que esto ayude a cualquiera en el futuro.

No, no puede mantener la información en una instancia de imageView. Incluso si encuentra una propiedad de cadena grabable de imageView, este será un enfoque equivocado. Haga esto en su lugar: asigne un número de order a la propiedad imegeview.tag y mantenga un NSMutableDictionary para la información, así, imageView.tag utilizará como la key y la información será el valor.