Respuesta a la pregunta de ILeW con un artículo sobre lo que el real, adjuntando tales como notificaciones y de trabajo los delegados. Usando un modelo que ver primero cómo el patrón de delegado:

Un objeto en busca de un delegado
Respuesta a la pregunta de ILeW con un artículo sobre lo que el real, adjuntando tales como notificaciones y de trabajo los delegados. Usando un modelo que ver primero cómo el patrón de delegado:

Un objeto en busca de un delegado
Xcode 4 le permite desarrollar aplicaciones para iPhone o iPad con una meta más baja que el iPhone OS 4.3 de hoy. Sin embargo, el mismo código que viene con las plantillas de "pecado" de la arrogancia, en el supuesto de que nuestra solicitud se dirigirá a iPhone OS 4 o superior. Delegado en la aplicación, por ejemplo, inserta Xcode las siguientes líneas de código:
1 2 3 4 5 6 7 | BOOL ) application : ( UIApplication * ) application didFinishLaunchingWithOptions : ( NSDictionary * ) launchOptions - (BOOL) de aplicación: (UIApplication *) didFinishLaunchingWithOptions aplicación: ( NSDictionary *) launchOptions { / / Sobrescribir el punto de partida para la personalización después del lanzamiento de la aplicación. self.window.rootViewController = self.viewController; ; [Self.window makeKeyAndVisible]; ; volver SÍ; } |
è estremamente versatile, come già visto in setAnimationDidStopSelector: usi diversi ed avanzati . El ajuste de la final de la animación, ejecutado con setAnimationDidStopSelector , una clase de UIView es extremadamente versátil, como se ve en setAnimationDidStopSelector: diferentes usos y avanzados .
Permítanme ahora mostrar una técnica muy útil cuando tenemos varias animaciones y / o desean administrar las colas (cola) de las animaciones.
En muy breve fragmento: Quitar desplazamiento de un objeto UIWebView vimos cómo era posible para eliminar el desplazamiento de un objeto UIWebView :
Los mensajes (métodos) definidos en la aplicación (Application delegado) principal se puede invocar rápidamente usando performSelector :
1 2 | delegate ] [[[SharedApplication UIApplication] delegado] ( applicationMessage ) ] ; performSelector: @ selector (applicationMessage)]; |
Documentados o indocumentados, una característica, a veces, se ven obligados a aplicar por la fuerza! Útil en algunas situaciones, el desplazamiento es de sacar un objeto de UIWebView . : Curiosamente, en general, ver cómo se puede acceder a los componentes del objeto "interno" parte de que se trate: en este ejemplo, se recupera el puntero de objeto UIScrollView presente en el asunto UIWebView :
Objective-C es un lenguaje maravilloso que te permite hacer cosas asombrosas. Uno de los aspectos más interesantes es su invocación dinámica de métodos (mensajes). Puede, de hecho, obtener la dirección de un mensaje de una cadena.
En la mayoría de los casos, o porque estamos acostumbrados o porque hemos visto en los tutoriales y en algunos textos, se utiliza el setAnimationDidStopSelector de esta manera:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | nil context : NULL ] ; [BeginAnimations UIView: contexto nada: NULL]; 1.5 ] ; [UIView setAnimationDuration: 1,5]; UIViewAnimationCurveEaseInOut ] ; [UIView setAnimationCurve: UIViewAnimationCurveEaseInOut]; self ] ; [SetAnimationDelegate UIView: auto]; @selector ( removeView ) ] ; [UIView setAnimationDidStopSelector: @ selector (removeView)]; ; myView.alpha = 0; ; [CommitAnimations UIView]; / / void ) removeView { - (Void) {removeView ; [MyView removeFromSuperview]; } |
come delegato e tramite la setAnimationDidStopSelector gli invia un messaggio removeView quando l'animazione è terminata. En el código anterior el setAnimationDelegate conjunto self como delegado ya través de setAnimationDidStopSelector envía un mensaje removeView cuando la animación ha terminado. El código es correcto, sin embargo, hace uso de una definición de mensaje ( removeView ) que podrían ser omitidos. Ahora, aquí es el mismo código, con el mismo efecto, sin el mensaje de removeView :
1 2 3 4 5 6 7 8 9 | nil context : NULL ] ; [BeginAnimations UIView: contexto nada: NULL]; 1.5 ] ; [UIView setAnimationDuration: 1,5]; UIViewAnimationCurveEaseInOut ] ; [UIView setAnimationCurve: UIViewAnimationCurveEaseInOut]; myView ] ; [SetAnimationDelegate UIView: myView]; @selector ( removeFromSuperview ) ] ; [UIView setAnimationDidStopSelector: @ selector (removeFromSuperview)]; ; myView.alpha = 0; ; [CommitAnimations UIView]; |
! Lo interesante de este enfoque es que myView podría ser una subclase de UIView ! Por lo tanto, puede ser una clase personalizada con nuestros propios mensajes y, como se dijo, fácilmente se puede llamar desde setAnimationDidStopSelector . Además, el setAnimationDidStopSelector selectores de acuerdo con los parámetros:
1 2 3 4 5 6 7 8 9 | nil context : NULL ] ; [BeginAnimations UIView: contexto nada: NULL]; 1.5 ] ; [UIView setAnimationDuration: 1,5]; UIViewAnimationCurveEaseInOut ] ; [UIView setAnimationCurve: UIViewAnimationCurveEaseInOut]; myView ] ; [SetAnimationDelegate UIView: myView]; @selector ( myMessage : param1 : ) ] ; [UIView setAnimationDidStopSelector: @ selector (myMessage: param1:)]; ; myView.alpha = 0; ; [CommitAnimations UIView]; |
En este ejemplo se puede extender a todos los casos aquí, donde hemos establecido un delegado, Atro no es un puntero a una instancia de un objeto.
Incluso en el tutorial más simples que usted puede encontrar el uso de protocolos. Sin duda, va a pasar a muchos en su controlador para utilizar un protocolo, escribir, junto a la definición de la interfaz, una declaración similar a:
1 2 3 | UIViewController <uiwebviewdelegate> { @ Interface myViewController: {UIViewController <uiwebviewdelegate> ... } |
Normalmente, un evento que no es más que un mensaje es fijo (establecido y aplicado) en la misma clase o contexto, la función o el procedimiento de "llamador". o in un UIViewController . Por ejemplo, si se añade un botón UIButton a través del código (programación), se encuentra nuestra clase en un UIView o UIViewController . En ambos casos, la asignación de tareas y la inicialización del botón será seguido por el establecimiento de target que debe recibir un mensaje cuando se hace "click" el botón, escriba:
1 2 3 4 5 6 7 8 9 | [ UIButton buttonWithType : UIButtonTypeRoundedRect ] ; UIButton * = botón [UIButton buttonWithType: UIButtonTypeRoundedRect]; 10 , 180 , 300 , 30 ) ; bottone.frame CGRectMake = (10, 180, 300, 30); @ "Press me" forState : UIControlStateNormal ] ; [Botón setTitle: @ "me Prensa" Forst: UIControlStateNormal]; / / Decidir quién debe recibir el mensaje de UIControlEventTouchUpInside self action : @selector ( onButtonClicked ) forControlEvents : UIControlEventTouchUpInside ] ; El botón [AddTarget: acción de auto: @ selector (onButtonClicked) forControlEvents: UIControlEventTouchUpInside]; / / ... void ) onButtonClicked { - (Void) {onButtonClicked / / ... } |
Línea 5 decide que la palabra clave (el objeto) y lo (método) "llamada" cuando nuestros se pulsa el botón. En el ejemplo anterior también se sabe que el ajuste de la presión de que el mensaje se envía al método onButtonClick implementado a continuación, que entonces formaba parte del mismo contexto (o clase). potremmo inviare il nostro messaggio ad un qualsiasi altro oggetto, posto quindi al difuori del contesto in uso. La primera consideración es evidente que podemos hacer, entonces, es que mediante la alteración de los parámetros de self y action que podemos enviar nuestro mensaje a cualquier otro objeto, se colocará en la difuori contexto de uso. : He aquí un ejemplo: una clase UIApplicationDelegate crear un UIViewController :
1 2 3 4 5 | / / / / MyAppDelegate.m / / SplashScreenController alloc ] ; splashScreenController = [SplashScreenController alloc]; splashScreenController.view ] ; [Ventana addSubview: splashScreenController.view]; |
associata al UIViewController stesso: El SplashScreenController expone un método que permite animar el UIView asociados con UIViewController mismo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | / / / / SplashScreenController.m / / void ) animateBackgroundDown { - (Void) {animateBackgroundDown nil context : nil ] ; [BeginAnimations UIView: contexto cero: nil]; 0.75 ] ; [UIView setAnimationDuration: 0,75]; UIViewAnimationCurveEaseInOut ] ; [UIView setAnimationCurve: UIViewAnimationCurveEaseInOut]; self ] ; [SetAnimationDelegate UIView: auto]; @selector ( onAnimationFinished ) ] ; [UIView setAnimationDidStopSelector: @ selector (onAnimationFinished)]; CGRect ) { 0 , 480 , 320 , 480 } ; self.view.frame = (CGRect) {0, 480, 320, 480}; ; [CommitAnimations UIView]; } / / ... void ) onAnimationFinished { - (Void) {onAnimationFinished "Animazione terminata" ) ; NSLog (@ "La animación ha terminado"); } |
. El código anterior muestra un método definido dentro de la clase SplashScreenController tipo UIViewController . ) onAnimationFinished definito più sotto, facente parte sempre della classe SplashScreenController . No hace más que animar el UIView animación abajo, y cuando la animación se ha completado, llame al (enviar un mensaje a sí mismo - de ahí self ) onAnimationFinished se define a continuación, es parte de la clase siempre SplashScreenController . , non saremo informati della fine dell'animazione: De ello se desprende que en nuestro myAppDelegate , al invocar el método animateBackgroundDown , no vamos a ser informados del fin de la animación:
1 2 3 4 | / / / / MyAppDelegate.m / / ; [SplashScreenController animateBackgroundDown]; |
Lo que puede ser que desee, en cambio, es la creación de una nueva versión de animateBackgroundDown que me dicen a dónde enviar el mensaje al final de la animación, y el método de llamada. En la práctica, quiere asegurarse de que escribir en nuestra clase myAppDelegate :
1 2 3 4 5 6 7 8 | / / / / MyAppDelegate.m / / self selector : @selector ( onAnimationFinished ) ] ; [SplashScreenController animateBackgroundDown: auto selector: @ selector (onAnimationFinished)]; / / ... void ) onAnimationFinished { - (Void) {onAnimationFinished "Animazione terminata" ) ; NSLog (@ "La animación ha terminado"); } |
, bensì in myAppDelegate . Esta vez el método onAnimationFinished no está en la UIViewController , pero en myAppDelegate . nel modo seguente: Para ello basta con cambiar el método de animateBackgroundDown en UIViewController de la siguiente manera:
1 2 3 4 5 6 7 8 9 10 11 12 | / / / / SplashScreenController.m / / void ) animateBackgroundDown : ( id ) target selector : ( SEL ) selector { - (Void) animateBackgroundDown: (id) objetivo de selección: (SEL) selector { nil context : nil ] ; [BeginAnimations UIView: contexto cero: nil]; 0.75 ] ; [UIView setAnimationDuration: 0,75]; UIViewAnimationCurveEaseInOut ] ; [UIView setAnimationCurve: UIViewAnimationCurveEaseInOut]; target ] ; [SetAnimationDelegate UIView: blanco]; selector ] ; [UIView setAnimationDidStopSelector: selector]; CGRect ) { 0 , 480 , 320 , 480 } ; self.view.frame = (CGRect) {0, 480, 320, 480}; ; [CommitAnimations UIView]; } |
). Ahora tenemos un método que toma el "contexto" ( target ) y el método de llamada ( selector ). a qualsiasi altro “oggetto” / classe in grado di riceverlo. Ahora, cuando termina la animación, el mensaje AnimationDidStop será enviado a myAppDelegate cualquier otro "objeto" / clase que pueda recibir.
Últimos Comentarios
Marcos : @ Marcos: Gracias por la respuesta. Por ejemplo, si usted tiene un código para guardar / utilizar la carpeta ...
Marcos : Gracias por la respuesta. Por ejemplo, si usted tiene un código para guardar / utilizar la carpeta ...
Giovambattista Fazioli : @ Marcos: en principio, absolutamente, mucho depende de cómo y por qué descargar. Luisiana ..
Marcos : Hola, buen guía! Quería preguntarle, usted puede usar el mismo código para ejecutar una base de datos sql? En lugar de ...
José : Hola quería preguntar cómo se puede hacer en el post que he subido una galería de 50 imágenes, por ejemplo, ...