Archivo de Diciembre, 2009

Objective-C: propiedades de exponer en una clase

Me gustaría mostrar y discutir algunos ejemplos acerca de cómo agregar y manipular las propiedades de la clase Objective-C. : Un ejemplo clásico es, precisamente, lo siguiente, en la definición de nuestra clase de interfaz define dos propiedades nome y cognome :

1
2
3
4
5
6
7
8
9
10
11
/ / MyClass.h
# Importar <Foundation/Foundation.h>

NSObject { @ Interface MyClass: NSObject {
nome; NSString * nombre;
cognome; NSString * nombre;
}

retain ) NSString * nome; @ Propiedad (retener) NSString * nombre;
retain ) NSString * cognome; @ Propiedad (retener) NSString * nombre;
@ End

e setter usati rispettivamente per leggere ed impostare le nostre due proprietà: En el archivo de la aplicación de la instrucción INSERT @synthesize lo que Xcode se producen para nosotros los métodos getter y setter , respectivamente, que se utiliza para leer y establecer las dos propiedades:

1
2
3
4
5
6
7
8
/ / MyClass.m
# Import "MyClass.h"

@ Implementación MyClass

@ Name Sintetizar y apellidos;

@ End

, possiamo scrive: Cuando usted va a utilizar la clase MyClass , que es cuando istanziaremo un objeto de tipo MyClass , se puede escribir:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/ / Cualquier otra clase, como AppDelegate
/ / En el archivo. H
# Importar <UIKit/UIKit.h>
# Import "MyClass.h"

@ Clase TestViewController;

NSObject <UIApplicationDelegate> { @ Interface TesAppDelegate: NSObject {<UIApplicationDelegate>
UIWindow * ventana;
* TestViewController ViewController;

MyClass * miClase;
}

/ / En el archivo. M
MyClass alloc ] ; myClass = [MyClass alloc];
"Giovambattista" ; miaClasse.nome @ = "Giovambattista";
"miaClasse.nome = %@" , miaClasse.nome ) ; NSLog (@ "miaClasse.nome =% @", miaClasse.nome);

O, lo que es equivalente a:

1
2
3
/ / Siempre en la M archivo.
@ "Undolog" ] ; [SetNome myClass: @ "Undolog"];
"miaClasse.nome = %@" , [ miaClasse nome ] ) ; NSLog (@ "miaClasse.nome =% @", [nombre miClase]);

Hasta aquí todo bien. Sin embargo, podría inducir a error a la equivalencia de las "variables" internas (ivar) con el nombre de la propiedad en sí. Para entender la diferencia, proponer de nuevo lo mismo que hacerlo fuera, esta vez, la @synthesize . . Ahora, por lo tanto, debemos tener cuidado en escribir los métodos getter y setter . Para enfatizar aún más las diferencias, se cambie el nombre de las variables internas mediante la inserción de un guión bajo delante del nombre. Sin embargo, vemos el código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Importar <Foundation/Foundation.h>

NSObject { @ Interface MyClass: NSObject {
_nome; NSString * _name;
_cognome; NSString * _cognome;
}

NSString * ) nome; // get - ( NSString *) Nombre; / / obtener
NSString * ) cognome; // get - ( NSString *) Nombre; / / obtener

void ) setNome : ( NSString * ) stringaIngresso; // set - (Void) setNome: ( NSString *) stringaIngresso; / / establecer
void ) setCognome : ( NSString * ) stringaIngresso; // set - (Void) setCognome: ( NSString *) stringaIngresso; / / establecer

@ End

. A diferencia de los punteros antes de las variables internas (incapsultate) se han convertido en _nome y _cognome . . @property è scomparso, in quanto non serve più. Además hay cuatro definiciones de los métodos que representan nuestra get y set . @property ha desaparecido, ya que no necesita más.
Vemos el archivo de implementación MyClass.m :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Import "MyClass.h"

@ Implementación MyClass

/ / Obtener un "nombre"
NSString * ) nome { - ( NSString *) Nombre {
_name Retorno;
}
/ / Set para "nombre"
void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso
_name StringaIngresso =;
}

/ / Obtener de "apellido"
NSString * ) cognome { - ( NSString *) Nombre {
_cognome retorno;
}
/ / Set para "apellido"
void ) setCognome : ( NSString * ) stringaIngresso { - (Void) setCognome: ( NSString *) {stringaIngresso
_cognome = stringaIngresso;
}

@ End

Escrito como una clase se puede utilizar exactamente igual que el anterior, a saber:

1
2
3
4
5
6
7
8
MyClass alloc ] ; myClass = [MyClass alloc];
"Giovambattista" ; miaClasse.nome = @ "Giovambattista";
"miaClasse.nome = %@" , miaClasse.nome ) ; NSLog (@ "miaClasse.nome =% @", miaClasse.nome);

/ / O, lo que equivale a:

@ "Undolog" ] ; [SetNome myClass: @ "Undolog"];
"miaClasse.nome = %@" , [ miaClasse nome ] ) ; NSLog (@ "miaClasse.nome =% @", [nombre miClase]);

e set , evidenziando – anche con l'aggiunta dell'underscore – le differenze tra il nome della proprietà e la sua ivar interna _nome . En el nivel de abandono educativo @synthesize nos obligó a escribir "su propia" métodos de get y set , destacando - incluso con la adición dell'underscore - las diferencias entre el nombre de la propiedad y su ivar interna _nome .
permette un reale controllo del dato prima della sua impostazione (o prima della sua lettura) e quindi un reale incapsulamento per proteggere la variabile interna. En el nivel funcional del uso personal de los métodos de get y set permite un control real de los datos antes de su puesta (o antes de su lectura) y un encapsulado real para proteger a la variable interna.
Por ejemplo, sería posible para impedir el paso de cadenas vacías a la propiedad nome :

1
2
3
4
void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso
stringaIngresso == @ "" ) stringaIngresso = @ "senza nome" ; if (@ stringaIngresso == "") @ stringaIngresso = "sin nombre";
_name StringaIngresso =;
}

Otra variación

Si desea utilizar las variables internas con el guión bajo delante (que rpoviene Adobe ActionScript puede ser utilizado también) no es necesario abandonar el uso de la directiva @synthesize . Xcode permite "fusionar" los métodos mencionados anteriormente:

1
2
_nome; Sintetizar @ name = _name;
_cognome; @ Name = Sintetizar _cognome;

. Al hacerlo, puede usar el puntero para las personas internamente _nome ", resumió" - en el exterior - como una propiedad de nome . e setter , è vero anche che lo fa solo se non li trova, quindi se desiderate “implementare” un vostro metodo di getter e/o setter potete farlo anche se avete usato la direttiva @synthesize . Por otra parte, es cierto que el uso de @synthesize produce la generación de métodos automáticos (mensajes) de getter y setter , también es cierto que si no las encuentra, por lo que si quieren "aplicar" un método para su getter y / o setter que usted puede hacer esto incluso si ha utilizado la directiva @synthesize .

Las asignaciones de memoria

En los ejemplos anteriores he omitido algunos detalles importantes para una implementación real. En primer lugar, no han mostrado ningún método init() , útil para la inicialización de objetos y valores por defecto. Por otra parte, está la adición de un método dealloc() :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/ / Archivo MyClass.m
# Import "MyClass.h"

@ Implementación MyClass

id ) init { - (Id) {init
self = [ super init ] ) { if (self = [super init]) {
"Nome preimpostato" ; _name @ = "Nombre del ajuste";
"Cognome preimpostato" ; _cognome @ = "Nombre del ajuste";
}
cambio sí;
}

void ) dealloc { - (Void) {dealloc
; [_name Release];
; [_cognome Release];
; [Super dealloc];
}

NSString * ) nome { - ( NSString *) Nombre {
_name Retorno;
}
void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso
stringaIngresso == @ "" ) stringaIngresso = @ "senza nome" ; if (@ stringaIngresso == "") @ stringaIngresso = "sin nombre";
_name StringaIngresso =;
}

NSString * ) cognome { - ( NSString *) Nombre {
_cognome retorno;
}
void ) setCognome : ( NSString * ) stringaIngresso { - (Void) setCognome: ( NSString *) {stringaIngresso
_cognome = stringaIngresso;
}

@ End

, etc… En el futuro veremos entonces los detalles de las propiedades readonly , retain , etc ... :)

Continuación ...

Explorador o navegador de tu móvil?

Nuestro sitio web es ahora sólo se muestra por los PC. Con la difusión de la telefonía móvil, gracias al iPhone de Apple, para acceder al sitio o blog es cada vez más los trabajos realizados por una variedad de dispositivos móviles. Por lo tanto, necesitamos saber cuántos Web Developer interceptar e identificar los diferentes "agentes", es decir, el medio por el cual un usuario está viendo (navegación) y nuestras páginas.

Continuación ...

Personalización de un formulario de forma gráfica

Me preguntó cómo personalizar una forma gráfica, en particular, un cuadro de búsqueda como la que en este blog. La técnica utilizada, o mejor dicho, que yo uso, obviamente es válido para cualquier tipo de forma del módulo. Lo que cambia es sólo la complejidad del trabajo a realizar en función de la complejidad de la misma forma.

Continuación ...

WordPress: Muestra el último tema de bbPress

Hemos visto cómo la integración del núcleo de WordPress bbPress , por ejemplo, para utilizar o compartir algún tema de función WordPress. Ahora vamos a ver el contraio, es decir, cómo mostrar la información en la página de Inicio del Foro bbPress de WordPress. Para ello existen algunos plugins (algunos trabajan y otros no). Aquí vamos a ver cómo se escribe una - función sencilla que, en el caso, puede ser mejorado y perfeccionado en todos los casos - en realidad.

Continuación ...

Apple iPhone: Crear un botón de activación personalizado

non funzionano quando un UIButton è impostato in modalità UIButtonTypeCustom ! Los estados UIControlStateSelected o UIControlStateHighlighted no funciona cuando hay un UIButton modo se establece UIButtonTypeCustom ! O más bien, no funcionan (porque reservado para otro tipo de botón), por ejemplo, para crear un botón de dos estados: nota de palanca. Si hemos creado dos imágenes (y stato2.png stato1.png) para nuestro botón, se puede proceder de la siguiente manera:

1
2
3
/ / Los archivos de cabecera que se crea una variable global para usaremo
/ / Comprobar la palanca se
ToggleFlag BOOL;

Ahora vamos a crear nuestro botón:

1
2
3
4
5
6
7
8
9
/ / Creamos un botón y lo colocamos inicialmente en el estado "stato1.png"
/ / Editar initWithFrame: (CGRect) {} 100,100,50,50 con la ubicación y
/ / Tamaño de la imagen ha
; toggleFlag = YES;
[ [ UIButton buttonWithType : UIButtonTypeCustom ] initWithFrame : ( CGRect ) { 100 , 100 , 50 , 50 } ] ; UIButton ToggleButton * = [[UIButton buttonWithType: UIButtonTypeCustom] initWithFrame: (CGRect) {100, 100, 50, 50}];
@ "" forState : UIControlStateNormal ] ; [ToggleButton setTitle: @ "" Forst: UIControlStateNormal];
[ UIImage imageNamed : @ "stato1.png" ] forState : UIControlStateNormal ] ; [ToggleButton setBackgroundImage: [UIImage imageNamed: @ "stato1.png"] Forst: UIControlStateNormal];
self action : @selector ( onToggle : ) forControlEvents : UIControlEventTouchUpInside ] ; [AddTarget ToggleButton: acción de auto: @ selector (onToggle:) forControlEvents: UIControlEventTouchUpInside];
toggleButton ] ; [Self.view addSubview: ToggleButton];

Al hacer clic en el botón se envía un mensaje a gestionar onToggle :

1
2
3
4
5
6
7
void ) onToggle : ( id ) sender { - (Void) onToggle: (id) {remitente
/ / Recuperar puntero a UIButton
( UIButton * ) sender; UIButton buttonClicked * = (UIButton *) del remitente;
/ / Ejecutar Toogle
toggleFlag = toggleFlag!;
[ UIImage imageNamed : ( toggleFlag ) ? @ "stato1.png" : @ "stato2.png" ] forState : UIControlStateNormal ] ; [ButtonClicked setBackgroundImage: [UIImage imageNamed: (toggleFlag) @ "Stato1.png" @ "stato2.png"] Forst: UIControlStateNormal];
}

Continuación ...

Fragmento muy breve: la transmisión de archivos mp3 en el iPhone de Apple

Una alternativa muy simple de ejecutar una secuencia de un archivo mp3 en tu iPhone de Apple podría ser:

Continuación ...


Dejar de SOPA