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). Es posible, de hecho, para obtener la dirección de un mensaje de una cadena.
Artículos con la etiqueta 'Objective-C'
Fragmento muy corto: Objective-C, selector de NSString
Fragmento muy corto: UIWebView, y los archivos PDF en la pantalla
El objeto UIWebView puede ser utilizado para la visualización de numerosos archivos. Por ejemplo, puede utilizarlo para mostrar -, así como películas de QuickTime o YouTube - archivos PDF o HTML en nuestro propio código.
Fragmento muy corto: componer mensajes de correo electrónico a un iPhone, iPod o iPad
Para redactar un correo electrónico en el iPhone / iPod sólo tiene que añadir el marco MessageUI . En nuestro controlador para entrar en la inclusión del marco y poner en práctica el protocolo MFMailComposeViewControllerDelegate :
Objective-C los métodos de clase y Alloc auto
davanti al prototipo, tipo: Al definir y utilizar los métodos (mensajes) en Objective-C, que a menudo se enfrentan con la sintaxis curioso que muestra un signo - o + en la parte frontal del prototipo, escriba:
1 2 3 4 5 6 7 | / / En la definición void ) mioMessaggio; - (Void) mioMessaggio; / / Del mismo modo, en la aplicación void ) mioMessaggio { - (Void) {mioMessaggio / / ... } |
O bien:
1 2 3 4 5 6 7 | / / En la definición void ) mioMessaggio; + (Void) mioMessaggio; / / Del mismo modo, en la aplicación void ) mioMessaggio { + (Void) {mioMessaggio / / ... } |
La diferencia reside en el hecho de que los métodos definidos por el símbolo - son métodos, por ejemplo, a continuación, vinculado a un objeto. Los métodos definidos por el símbolo + se denominan métodos de la clase, ya que pueden llevarse a cabo sin asignar y crear una instancia del objeto en cuestión.
sono due classi, molto usate, che contengono svariati metodi di classe. NSString o UIView dos clases, ampliamente utilizados, los cuales contienen varios métodos de la clase. Los métodos de clase se utilizan constantemente, al igual que cuando nos inicializar o asignar cualquier objeto:
1 | [ UIView alloc ] ; MyView UIView * = [UIView alloc]; |
El método alloc es un ejemplo clásico, presente en todos los objetos y, como lo demuestra el código, es un método de clase, como afirmó antes de la asignación del objeto en sí mismo.
Los métodos de clase pueden ser útiles en muchos casos, sobre todo cuando creamos nuestro objeto y queremos asignar e inicializar en menos líneas de código posible. Imagínese tener que recoger una matriz en un conjunto de objetos definidos por nosotros. Definimos nuestro primer objeto, escribiendo el código en la forma más sencilla, sin necesidad de utilizar métodos de la clase:
1 2 3 4 5 6 7 8 9 10 | / / Definición de la interfaz en myObject.h # Importar <Foundation/Foundation.h> NSObject { @ Interfaz myObject: NSObject { name; NSString * nombre; lastname; NSString * apellido; } nonatomic, retain ) NSString * name; @ Propiedad (no atómica, retener) NSString * nombre; nonatomic, retain ) NSString * lastname; @ Propiedad (no atómica, retener) NSString * Apellido; |
La puesta en práctica, en el caso más simple, puede ser nada, o:
1 2 3 4 5 6 7 8 9 10 11 12 | / / MyObject.m # Importar "myObject.h" @ Aplicación myObject Sintetizar @ nombre, apellido; void ) dealloc { - (Void) {dealloc ; [Nombre de la liberación]; ; [Comunicado de apellido]; ; [Super dealloc]; } |
¿Cuándo vamos a usar nuestro objeto, podemos utilizar un código como este:
1 2 3 | [ myObject alloc ] ; myObject * obj = [myObject alloc]; "Mario" ; obj.name @ = "Juan"; "Rossi" ; obj.lastname @ = "Smith"; |
Si quisiéramos crear muchos objetos de este tipo, y colocarlos en un NSArray , la situación se vuelve un poco incómodo:
1 2 3 4 5 6 7 8 9 10 11 12 | [ myObject alloc ] ; objA * myObject = [myObject alloc]; "Mario" ; objA.name @ = "Juan"; "Rossi" ; objA.lastname @ = "Smith"; [ myObject alloc ] ; objB * myObject = [myObject alloc]; "Carlo" ; objB.name @ = "Carlos"; "Bianchi" ; objB.lastname @ = "Smith"; elenco = [ NSArray arrayWithObjects : objA, objB, nil ] ; NSArray * lista = [ NSArray arrayWithObjects: objA, objB, nil]; ; [ObjA liberación]; ; [ObjB liberación]; |
per aggiungere man mano gli oggetti nel nostro elenco. Se podría mejorar el código mediante la creación de un bucle for o el uso de un NSMutableArray para agregar como objetos en nuestro directorio. . Sin embargo, el migliorebbe situación un poco, de vez en cuando permanecen fuera de la propiedad de configuración name y lastname . Sería espontánea, para empezar, añadir un método - objeto - initWithName que le permiten saltar a cualquier configuración de la propiedad, las cosas semplificandoci un poco. En el archivo de implementación myObject.m añadir:
1 2 3 4 5 6 7 | id ) initWithName : ( NSString * ) stringName lastname : ( NSString * ) stringLastname { - (ID) initWithName: ( NSString *) apellido StringName: ( NSString *) {stringLastname self = [ super init ] ) { if (self = [super init]) { self.name = StringName; self.lastname = stringLastname; } volver sí mismo; } |
Al hacerlo, han mejorado la situación, ahora se puede escribir:
1 2 3 4 5 6 7 | [ [ myObject alloc ] initWithName : @ "Mario" lastname : @ "Rossi" ] ; objA * myObject = [[myObject alloc] initWithName: @ "Mario" apellido: @ "Smith"]; [ [ myObject alloc ] initWithName : @ "Carlo" lastname : @ "Bianchi" ] ; objB * myObject = [[myObject alloc] initWithName: @ "Charles" apellido: @ "Smith"]; elenco = [ NSArray arrayWithObjects : objA, objB, nil ] ; NSArray * lista = [ NSArray arrayWithObjects: objA, objB, nil]; ; [ObjA liberación]; ; [ObjB liberación]; |
, necessari per l'inserimento nell'array e liberare la memoria. Abbiammo y aún punteros objA y objB , necesarios para la entrada de la matriz y la memoria libre. Deseando que directamente podría entrar en la creación de un objeto en poblar la matriz, con autorelease para liberar memoria, pero el código aún no inactivo. Permítanme demostrar cómo resolver el problema con un método de clase. Primero de todo, reemplazar nuestro - (id)initWidthName con:
1 2 3 4 5 6 7 8 9 10 | id ) initWithName : ( NSString * ) name lastname : ( NSString * ) lastname { + (Id) initWithName: ( NSString *) apellido nombre: ( NSString *) {lastname * myObject tema; item = [ [ self alloc ] init ] ) { if (elemento = [[ALLOC auto] init]) { / / Init item.name = nombre; item.lastname = apellido; } item autorelease ] ; retorno [tema disparador automático]; } |
De esta manera hemos creado un método de clase que se asigna (en autorelase) y iniziallizza nuestro tema, antes de tener el puntero a la instancia. El código utilizado es entonces:
1 2 3 4 |
Mucho, mucho mejor ...
WordPress Plugin Creador
Estoy muy feliz de estar en condiciones de presentar una vista previa del fabricante Plugin de WordPress, una aplicación para Mac OS X (Snow Leopard), que le permite crear un esqueleto de un plugin para Wordpress en cuestión de segundos, lo que le permite configurar muchos parámetros. La aplicación está todavía en desarrollo, sin embargo, realiza su tarea de base y es fácilmente utilizable y funcional. Algunas de las características aún no han sido incluidos, y el otro está en espera de los comentarios de los "pocos" afortunados beta testers.
Cómo llegar Latitud y Longitud en Objective-C
El marco MapKit ofrece muchas funciones útiles, salvo el regreso de Latitud y Longitud de una dirección. En JavaScript, por ejemplo, puede utilizar el servicio prestado por Google geocodificación y discutido en Google Maps: Cómo llegar Latitud y Longitud de una dirección . El iPhone de Apple o el IPAD, sin embargo, puede superar el obstáculo mediante el uso de un diferentes servicios de Google. Específicamente, usted puede llamar directamente a la url:
1 | http://maps.google.com/maps/geo?q = [dirección] & output = csv |
¿Dónde está [indirizzo] para entrar en la cadena con la dirección que desea para transformar las coordenadas. El resultado devuelto es de tipo:
1 | 200,8,41.9128300,12.2241172 |
). El primer valor, 200 , indica que todo ha ido bien ( 200 OK ). El segundo, 8 , es el parámetro de precisión Google (1-10). Los dos últimos valores son, por último, la latitud y longitud. Ahora vemos un prototipo de un método puede ser incluido en las aplicaciones:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | CLLocationCoordinate2D ) getLocationFromAddress : ( NSString * ) address { - (CLLocationCoordinate2D) getLocationFromAddress: ( NSString *) dirección { urlString = [ NSString stringWithFormat : @ "http://maps.google.com/maps/geo?q=%@&output=csv" , NSString * urlString = [ NSString stringWithFormat: @ "% @ http://maps.google.com/maps/geo?q = & output = csv" NSUTF8StringEncoding ] ] ; [StringByAddingPercentEscapesUsingEncoding Dirección: NSUTF8StringEncoding]]; listItems = [ locationString componentsSeparatedByString : @ "," ] ; NSArray * ListItems = [locationString componentsSeparatedByString: @ ""]; / / Int zoom = 0; 0.0 ; latitud doble = 0,0; 0.0 ; doble de la longitud = 0,0; listItems count ] > = 4 && [ [ listItems objectAtIndex : 0 ] isEqualToString : @ "200" ] ) { if ([ListItems cuenta]> = 4 && [[objectAtIndex ListItems: 0] isEqualToString: @ "200"]) { / / Zoom = [[ListItems objectAtIndex: 1] intValue]; listItems objectAtIndex : 2 ] doubleValue ] ; latitud = [[objectAtIndex ListItems: 2] doubleValue]; listItems objectAtIndex : 3 ] doubleValue ] ; Longitud = [[ListItems objectAtIndex: 3] doubleValue]; { Else {} / / Error } CLLocationCoordinate2D ubicación; location.latitude = latitud; location.longitude = longitud; devolver la ubicación; } |
Notas de Interés
, alla stregua della funzione explode ( ) del PHP per intenderci. La cadena devuelta en locationString está "dividido" por el método de componentsSeparatedByString , al igual que la función de explode ( ) de PHP, por ejemplo. En el ejemplo que propone entré - pero comentó - el código para recuperar siquiera la precisión del parámetro de Google, precisión o factor de escala, denotado por zoom .
Fuente como
Para completar, hice una pequeña aplicación de ejemplo con el que puedes probar el método propuesto más arriba, entrar en cualquier dirección y el iPhone se mostrará en el mapa.
Doy las gracias al equipo de devAPP por la inspiración de este artículo.
setAnimationDidStopSelector: diferentes usos y avanzado
En la mayoría de los casos, o porque estamos acostumbrados o porque hemos visto en clases particulares 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 de la setAnimationDelegate configurar self como delegado ya través de setAnimationDidStopSelector envía un mensaje removeView cuando se acabe la animación. El propio código es correcto, sin embargo, hace uso de una definición de mensaje ( removeView ) que podría ser omitido. 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, en la forma establecida, en silencio convocada por setAnimationDidStopSelector . Por otra parte, los 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 nos planteamos un delegado, atrofia no es un puntero a una instancia de un objeto.
Cómo localizar imágenes y vistas en Interface Builder
Después de explicar cómo localizar nuestras cadenas en Xcode , como lo vemos ahora es simple - la aplicación de la misma técnica - para localizar y ver las imágenes e interfaces creados con Interface Builder.
Busque recursos gráficos
El proceso, como se mencionó, es el mismo, si tenemos una imagen ya está incluido en nuestros recursos, o coloque una nueva, y nos quieren "ubicar" - es decir, la gestión de dos o más imágenes en función de los idiomas soportados - simplemente haga clic en el botón imagen de la derecha ( Adium.png en este ejemplo) y seleccione Obtener información:

Nos haga clic en Crear archivo localizable en la parte inferior izquierda.

Haga clic en Añadir e introduzca la localización Italian :

Con el fin de obtener:

esattamente come accadeva con il testo: Nuestra imagen se mueve (física, una de las raras ocasiones en que ocurre nell'alberatura Xcode se refleja en el sistema de archivos) en carpetas virtuales English.lproj y Italian.lproj tal y como sucedió con el texto:

contiene una stessa versione dell'immagine. En este punto, cada una de las carpetas English.lproj y Italian.lproj contiene la misma versión de la imagen. Esta imagen es manipulada dentro de Interface Builder, donde vamos a ver - por defecto - la versión en Inglés.
En este punto, sólo sobrescribir uno (o ambos ficheros Adium.png ) para obtener una localización de las imágenes "flash".
Busque la XIB archivos
Incluso las interfaces construidas con Interface Builder se puede localizar en su totalidad, cuando se considere necesario. ) con interfaccia XIB , lo selezioniamo, scegliamo Get Info dal menu contestuale, rendiamo il file localizzabile, aggiungiamo la localizzazione in italiano: El procedimiento es idéntico al realizado con las capacidades gráficas: agregar un ViewController (por ejemplo, infoViewController ) de la interfaz XIB, lo selecciona, elige Obtener información en el menú contextual, dar la localizable archivo, añadir la localización en italiano:

Haga clic en Inglés o Italiano abrirá Interface Builder! ) all'interno della classica cartella Classes . Esta vez, el sistema de archivos, nos daremos cuenta de que ha creado dos directorios ( English.lproj y Italian.lproj ) dentro de la carpeta de clases clásica. Ambos tendrán sus archivos infoViewController.xib . La comodidad en este, claramente resuelta en el código, cuando vamos a una instancia de nuestro código de control vamos a tener una "limpia" de esta manera:
1 2 | [ InfoViewController alloc ] ; InfoViewController * info = [InfoViewController alloc]; info.view ] ; [Self.view addSubview: info.view]; |
Como puedes ver no hay ni rastro de cualquier declaración relativa a la ubicación, totalmente administrado por el sistema. Las dos interfaces, por supuesto, puede ser completamente diferente en que se encuentran en todos los aspectos como dos XIB archivos separados.
Cómo crear tu propio protocolo con la delegada
Incluso en el tutorial mas simple que usted puede encontrar el uso de los protocolos. Sin duda, va a pasar con muchos de su controlador de vista utilizado en un protocolo, escribir, junto a la definición de la interfaz, una declaración similar a:
1 2 3 | UIViewController <uiwebviewdelegate> { @ MyViewController Interfaz: {UIViewController <uiwebviewdelegate> ... } |
Fragmento muy breve: obtener la salida de una dirección URL en Objective-C
Tal vez debería escribir "Muy, muy, pequeños pedazos", sin embargo, es una excelente y cómoda "truco" que yo voy a mostrar. Ejecución de los "dos" líneas de código se muestra a continuación, usted puede conseguir la salida de cualquier URL y manipularlo.








Últimos Comentarios
Giovambattista Fazioli : @ Vik: la validación es siempre un tema difícil de manejar, como debe ser ...
Vik : los campos de usuario personalizados parece interesante, hay que añadir la posibilidad de validar el campo sobre la base de ...
kOoLiNuS : @ Giovambattista Fazioli: ¡gracias! más que dispuesto!
Giovambattista Fazioli : @ kOoLiNuS: Calma, es probable que pueda anticipar que WPX Cleanfix será gratuito, y ...
kOoLiNuS : @ kOoLiNuS: una falta
y un 