'Objective-C' Categoría


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.

Más información ...

iPhone: Eliminar el efecto de sombra al desplazarse un UIWebView

En este último período he trabajado en tres aplicaciones para el iPhone de Apple, prácticamente de forma simultánea. Dos ya han sido aprobados por Apple y se encuentran en la App Store: thefirst y iMakeLove .

TheFirst iMakeLove

En ambas aplicaciones han adoptado el uso de un objeto UIWebView para mostrar las instrucciones.
El objeto UIWebView tiene ilevato muy conveniente en este caso. Se me permitió ver de forma rápida y un bonito texto, imágenes, y acompañado, si todo lo demás se muestra en una página Web (Flash en el iPhone no incluido).

TheFirst

El objeto UIWebView es muy versátil y requiere ajustes muy pocos para ser utilizado. El único defecto es la presencia de una misteriosa sombra que aparece al hacer un desplazamiento fuera de la zona de control se encuentra en la parte inferior que en la parte superior:

UIWebView Shadow

Después de mucho investigar me di cuenta de que este comportamiento depende de la SDK, especialmente las últimas actualizaciones. Y Apple no ha publicado ningún comunicado oficial sobre la forma de eliminarlo, por el contrario, rechazó que el código no se permite una serie de hacks que hacen uso de las funciones sensibles, o la documentación. Finalmente me di por vencido, tanto por el tiempo y porque las soluciones parecía que todo fuera de la caja de manzana.
Afortunadamente tengo la solución, espero que con bastante frecuencia, lo que parece resolver el problema (gracias a Adolfo ):

1
2
3
4
5
6
/ / WebView es el control de UIWebView
[ webView.subviews objectAtIndex : 0 ] ; id = scroller [objectAtIndex webView.subviews: 0];

UIView * subView in [ scroller subviews ] ) de (* UIView subvista en [scroller subvistas])
subView class ] description ] isEqualToString : @ "UIImageView" ] ) if ([[[subvista clase]] Descripción isEqualToString: @ "UIImageView"])
; subView.hidden = YES;

Como ha señalado Adolfo esto sigue siendo un truco que podría dejar de trabajar con las futuras versiones del SDK.

Más información ...

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:

ViewController

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.

Más información ...

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>
...
}

Más información ...

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.

Más información ...

10 Fragmento de utilidad para el iPhone de Apple

Ejecutar un método después de n segundos

Toda la familia performSelector es muy interesante y puede ser útil en una multitud de casos. Su aplicación más simple y común es la siguiente:

1
2
3
4
5
@selector ( myMethod ) withObject : nil afterDelay : 3 ] ; [Self performSelector: @ selector (myMethod) withObject: nil afterDelay: 3];
/ /
void ) myMethod { - (Void) {myMethod
"Hello World!" ) ; NSLog (@ "Hola Mundo!");
}

Sin embargo, tenga en cuenta que el "timer" no es exacta. Este procedimiento, por lo tanto, se debe utilizar cuando no es necesario "considerable" de precisión del tiempo.

Recuperar la versión de la

1
2
version = [ [ [ NSBundle mainBundle ] infoDictionary ] objectForKey : @ "CFBundleVersion" ] ; NSString * Version = [[[ NSBundle mainBundle] infoDictionary] objectForKey: @ "CFBundleVersion"];
"versione = %@" , version ) ; NSLog (@ "Version =% @", versión);

Sí, cierto o cierto?

e TRUE sono in pratica la stessa edentica cosa: El ir a peinarse a través del iPhone de Apple kernel puede darse cuenta de que YES , true , y TRUE son prácticamente la misma cosa edentica:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/ / Definición de la SI
# Definir SI (BOOL) 1
# Definir NO 0 (BOOL)

/ / Definición de la verdad
# Definición de una verdadera
# Definir 0 falsa

/ / Definición de TRUE
# Si! Definida (VERDADERO)
# Definición de un VERDADERO
# Endif

# Si! Definida (FALSO)
# Definir 0 FALSO
# Endif

Al menos por ahora ...

Vibración

1
2
3
# Importar <AudioToolbox/AudioToolbox.h>
/ /
; AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);

CGImageRef puntero de una UIImage

1
2
3
4
[ UIImage imageNamed : @ "LittleHeart.png" ] ; UIImage corazón * = [UIImage imageNamed: @ "LittleHeart.png"];
heart CGImage ] ; CGImageRef imagen = [corazón CGImage];
/ / La imagen ahora se puede "trama" en una CGContextRef
CGRect ) { 0 , 0 , 100 , 100 } , image ) ; CGContextDrawImage (c, (CGRect) {0, 0, 100, 100}, imagen);

Animaciones

1
2
3
4
5
nil context : NULL ] ; [BeginAnimations UIView: contexto nada: NULL];
1.5 ] ; [UIView setAnimationDuration: 1,5];
UIViewAnimationCurveEaseInOut ] ; [UIView setAnimationCurve: UIViewAnimationCurveEaseInOut];
/ / ...
; [CommitAnimations UIView];

NSLog

1
2
3
"NSString object %@ " , myString ) ; NSLog (@ "NSString objeto% @", MyString);
"Float: %f " , myFloat ) ; NSLog (@ "float:% f", myFloat);
"Integer: %i " , myInt ) ; NSLog (@ "entero:% s", myInt);

Convertidor de RGB a UIColor

1
# Definir RGBA (R, G, B, A) [UIColor colorWithRed: r/255.0 verde: azul g/255.0: b/255.0 alfa: a]

Paso de parámetros a un NSTimer

Explotando el parámetro userInfo puede enviar un puntero a nuestro objeto al método invocado por el temporizador.

1
2
3
4
5
6
7
8
9
10
11
12
13
scheduledTimerWithTimeInterval : 1 target : self selector : @selector ( timerMethod ) userInfo : objectPointer repeats : YES ] ; [ NSTimer scheduledTimerWithTimeInterval: 1 de destino: selector de auto: @ selector (timerMethod) userInfo: repite objectPointer: YES];

/ / ...

void ) timerMethod : ( NSTimer * ) timer { - (Void) timerMethod: ( NSTimer *) {contador de tiempo
/ / Recuperar el puntero a mi objeto
timer userInfo ] ; objectPointer = [temporizador userInfo];
/ / O
myMethod ] ; [[Temporizador userInfo] myMethod];
[ [ timer userInfo ] myProperty ] ; int a = [[temporizador userInfo] myProperty];
/ / ¿Qué es la misma
[ objectPointer myProperty ] ; int a = [objectPointer myProperty];
}

Tiempo de ejecución

Aquí está una manera fácil de calcular tiempo necesario para comprobar la velocidad de la ejecución de código:

1
2
3
4
; CFAbsoluteTime initialTime CFAbsoluteTimeGetCurrent = ();
/ / ... código
; CFAbsoluteTime finalTime CFAbsoluteTimeGetCurrent = ();
"Tempo trascorso %f" , finalTime - initialTime ) ; NSLog (@ "f% transcurrido el tiempo", finalTime - initialTime);

Más información ...

Objective-C: exponen las propiedades de una clase

Me gustaría mostrar y discutir algunos ejemplos acerca de cómo agregar y manipular las propiedades en la clase de Objective-C. : Un ejemplo clásico es, precisamente, de la siguiente manera: en la definición de nuestra interfaz de clase se definen 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 que inserta la declaración @synthesize de manera que Xcode va a producir para nosotros los métodos getter y setter , respectivamente, que se utiliza para leer y establecer nuestras dos propiedades:

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

@ Aplicación MyClass

Sintetizar @ nombre, apellido;

@ End

, possiamo scrive: Cuando usted va a utilizar nuestra 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>
# Importar "MyClass.h"

@ Clase TestViewController;

NSObject <UIApplicationDelegate> { @ Interfaz TesAppDelegate: NSObject {<UIApplicationDelegate>
UIWindow * ventana;
* TestViewController viewController;

MyClass * MiClase;
}

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

O, que es equivalente a:

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

Hasta aquí todo bien. Sin embargo, podría inducir a error a la equivalencia de "variabli" interno (ivar) como bienes inmuebles. Para entender la diferencia, proponer de nuevo lo mismo que hacerlo sin que, en esta ocasión, la @synthesize . . Ahora, por lo tanto, debemos tratar con nosotros para escribir los métodos getter y setter . Para enfatizar aún más las diferencias, las variables internas rinominerò insertando 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; / / conjunto
void ) setCognome : ( NSString * ) stringaIngresso; // set - (Void) setCognome: ( NSString *) stringaIngresso; / / conjunto

@ End

. A diferencia del ejemplo anterior, los punteros a las variables internas (incapsultate) se han convertido en _nome y _cognome . . @property è scomparso, in quanto non serve più. Además, hay cuatro definiciones de métodos que representan nuestra get y set . @property ha desaparecido, ya no es necesario.
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
# Importar "MyClass.h"

@ Aplicació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 regresar;
}
/ / Set para "Last Name"
void ) setCognome : ( NSString * ) stringaIngresso { - (Void) setCognome: ( NSString *) {stringaIngresso
_cognome = stringaIngresso;
}

@ End

Una clase que por escrito se puede utilizar exactamente igual que el anterior, a saber:

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

/ / O, que es equivalente a:

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

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 "sus propios" métodos de get y set , poniendo de relieve - 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. A nivel funcional, el uso personal de los métodos de get y set permite el control real de los datos antes de su entorno (o antes de su lectura) y luego una encapsulación 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;
}

Variante adicional

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 anteriores:

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

. De este modo podemos utilizar el puntero interno _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, aunque el uso de @synthesize produce los métodos de generación automática (mensajes) de getter y setter , también es cierto que sólo lo hace si los encuentra, por lo que si quieren "aplicar" un método para el getter y el / o setter 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. Además, carece de 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
# Importar "MyClass.h"

@ Aplicació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";
}
volver sí mismo;
}

void ) dealloc { - (Void) {dealloc
; [_name Lanzamiento];
; [_cognome Lanzamiento];
; [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 regresar;
}
void ) setCognome : ( NSString * ) stringaIngresso { - (Void) setCognome: ( NSString *) {stringaIngresso
_cognome = stringaIngresso;
}

@ End

, etc… En el futuro, a continuación podrán ver los detalles sobre las propiedades readonly , retain , etc ... :)

Más informació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 funcionan cuando un UIButton modo se establece UIButtonTypeCustom ! O, mejor dicho, no funcionan (porque reservados para otros tipos de botón), por ejemplo, para crear un botón con dos estados: nota de alternancia. Si hemos creado dos imágenes (stato1.png y stato2.png) para nuestro botón, podemos proceder de la siguiente manera:

1
2
3
/ / El encabezado del archivo que creamos una variable global para usaremo
/ / Activar el cheque era
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"
/ / Edición initWithFrame: (CGRect)} {100,100,50,50 con la posición y
/ / Tamaño de la imagen tiene
; 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: @ "" forState: UIControlStateNormal];
[ UIImage imageNamed : @ "stato1.png" ] forState : UIControlStateNormal ] ; [ToggleButton setBackgroundImage: [UIImage imageNamed: @ "stato1.png"] forState: 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) {emisor
/ / Recuperar puntero a UIButton
( UIButton * ) sender; UIButton buttonClicked * = (UIButton *) del remitente;
/ / Ejecutar el Toogle
toggleFlag = toggleFlag!;
[ UIImage imageNamed : ( toggleFlag ) ? @ "stato1.png" : @ "stato2.png" ] forState : UIControlStateNormal ] ; [ButtonClicked setBackgroundImage: [UIImage imageNamed: (toggleFlag) @ "Stato1.png" @ "stato2.png"] forState: UIControlStateNormal];
}

Más información ...

Fragmento muy corto: reproducir archivos mp3 para el iPhone de Apple

Una alternativa muy fácil de ejecutar una secuencia de un archivo mp3 en el iPhone de Apple podría ser:

Más información ...

Fragmento muy corto: el iPhone de Apple sistema de archivos

Tanto el Mac OS X que el sistema operativo del iPhone, se puede acceder con facilidad y directamente en el directorio - más importante - el sistema que son:

1
2
3
NSHomeDirectory Devuelve la ruta al directorio home del usuario actual.
Devuelve la ruta de acceso a NSHomeDirectoryForUser Dado un directorio home del usuario.
NSTemporaryDirectory Devuelve la ruta del directorio temporal del usuario actual.

Más información ...



Deje de SOPA