
Artículos con la etiqueta 'Apple'
Cómo configurar XCode para usar el iPhone en lugar de un simulador
iPhone: Crear una forma de responder a los eventos que cruzan la clase
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 informado de la final 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.
Objective-C: una alternativa al uso de CGRectMake
CGRectMake() es una función (en realidad una línea # define) que se utiliza mucho, especialmente cuando se crea objetos gráficos de código o interfaz de usuario. o UIImageView . CGRectMake() restituisce una struct (struttura di tipo) CGRect : Su uso se asocia a menudo por lo tanto, los componentes de la inicialización de UIKit , sino también a simples UIView o UIImageView . CGRectMake() devuelve una struct (tipo de estructura) CGRect :
1 2 3 4 5 | struct {CGRect CGPoint origen; CGSize tamaño; }; typedef struct CGRect CGRect; |
: Que a su vez se compone de dos diferentes struct CGPoint y CGSize :
1 2 3 4 5 6 7 8 9 10 11 12 13 | struct {CGPoint CGFloat x; CGFloat y; }; typedef struct CGPoint CGPoint; Tamaños / *. * / struct {CGSize Ancho CGFloat; CGFloat altura; }; typedef struct CGSize CGSize, |
. Que, a su vez, otra vez, contienen tipos CGFloat o el tipo float . Si analizamos el código de CGRectMake () son los siguientes:
1 2 3 4 5 6 7 8 | CG_INLINE CGRect CGRectMake (CGFloat x, y CGFloat, ancho CGFloat, CGFloat altura) { CGRect rect; y; rect.origin.x = x, y = rect.origin.y; height; rect.size.width = anchura, altura = rect.size.height; volver rect; } |
De ello se desprende, por tanto, que este pedazo de código:
1 2 3 4 | [ UIButton buttonWithType : UIButtonTypeRoundedRect ] ; UIButton gbutton * = [UIButton buttonWithType: UIButtonTypeRoundedRect]; 12 , 409 , 100 , 40 ) ; gbutton.frame CGRectMake = (12, 409, 100, 40); @ "Press" forState : UIControlStateNormal ] ; [Gbutton setTitle: @ "Prensa" Forst: UIControlStateNormal]; gbutton ] ; [MainWindow addSubview: gbutton]; |
Con razón se puede escribir como:
1 2 3 4 | [ UIButton buttonWithType : UIButtonTypeRoundedRect ] ; UIButton gbutton * = [UIButton buttonWithType: UIButtonTypeRoundedRect]; CGRect ) { 12 , 409 , 100 , 40 } ; gbutton.frame = (CGRect) {12, 409, 100, 40}; @ "Press" forState : UIControlStateNormal ] ; [Gbutton setTitle: @ "Prensa" Forst: UIControlStateNormal]; gbutton ] ; [MainWindow addSubview: gbutton]; |
Sólo para acelerar las cosas "se ejecuta el código ... ![]()
Xcode acceso directo
Xcode es un entorno de desarrollo muy bueno, bonito y lleno de detalles que hacen que escribir código eficiente y agradable. Entre ellas se encuentra la facilidad de auto-completar al escribir, especialmente cuando la creación de aplicaciones para el iPhone de Apple, donde los marcos son muchos y recordar la sintaxis de la empresa y la nomenclatura de unos pocos.
Xcode: Trucos para depurar en las preferencias
Utilizando las preferencias de Xcode se puede establecer el comportamiento de la atmósfera durante la fase de depuración de una aplicación para iPhone. La configuración por defecto, de hecho, son muy incómodos cuando se intenta y vuelve a intentarlo una aplicación, por ejemplo, después del lanzamiento de nuestra aplicación, debe abrir manualmente la ventana de la consola para ver la salida de varios NSLog() . Xcode también permite a las sesiones anteriores con el fin de obligarnos a limpiar la ventana con la mano. Afortunadamente, usted puede resolver el problema, actuando sobre las preferencias:

Como puede observarse, sólo tiene que seleccionar un elemento en el menú de inicio para decidir qué ventana de depuración que se abra automáticamente en el inicio de nuestra válida si (I & conjunto depurador de consola, pero puede elegir los trajes mejor que usted). A la derecha, entonces nos encontramos con la consola de Auto Debug claro, por lo que siempre comienzan con una consola limpia.
iPhone SecondApp: Adivinar el número - Parte 2
Como se ha mencionado iPhone FirstApp: Adivinar el número - Parte 1 podemos ver cómo hacer una aplicación para el iPhone de Apple sin necesidad de utilizar Interface Builder! De hecho, vamos a eliminar los archivos físicos creados por Interface Builder, Xcode asistente. Al final de este post, entonces, tenemos una aplicación idéntica en todos los aspectos, a la conseguida en la primera parte, con la diferencia que vamos a lograr todos nuestros componentes visuales, incluyendo la ventana principal, por completo con el código.
La aplicación ya está hecho, si lo que desea es descargar, está disponible en mi repositorio de Google Code:
Me gustaría señalar de inmediato que el ZIP de este ejemplo que pesan menos que la última vez! ![]()
Creamos el proyecto
Comenzamos por crear nuestro proyecto SecondApp (para distinguirla de FirstApp), aunque esta vez elija Ventana de aplicaciones basado en:

Ahora vamos a borrar todo lo relacionado con Interface Builder. : eliminatelo anche dal file system, quindi selezionate Also Move to Trash . Elimine el archivo MainWindow.xib , que se encuentra en la carpeta de Resources : también se elimina del sistema de archivos, a continuación, seleccione también se mueven a la papelera. nella casella Main nib file base name : A continuación, seleccione el archivo SecondoApp-info.plist y eliminar la referencia a la MainWindow punta de caja principal nombre base del archivo:

En este punto, ya no tienen Windows, por lo menos a través de Interface Builder. , e modifichiamo la funzione main() in questo modo: Por lo tanto, abrir el archivo main.m , situado en Other Sources , y modificar la función main() así:
1 2 3 4 5 6 7 8 9 10 11 | int argc, char * argv [ ] ) { int main (int argc, char * argv []) { pool = [ [ NSAutoreleasePool alloc ] init ] ; NSAutoreleasePool * Piscina = [[ NSAutoreleasePool alloc] init]; / / Al eliminar el archivo. XIB hemos perdido el punto / / Delegado a la Asamblea Parlamentaria Paritaria, a continuación, pasar a la "mano" UIApplicationMain ( argc, argv, nil , @ "SecondAppAppDelegate" ) ; int retval = UIApplicationMain (argc, argv, nil, @ "SecondAppAppDelegate"); ; [Comunicado de piscina]; volver retval; } |
Abrir SecondAppAppDelegate.me a continuación, crear la ventana principal en el código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | void ) applicationDidFinishLaunching : ( UIApplication * ) application { - (Void) applicationDidFinishLaunching: (UIApplication *) {aplicación / / Obtener el tamaño de la pantalla (320, 480) UIScreen mainScreen ] applicationFrame ] ; CGRect windowRect = [[Principal UIScreen] applicationFrame]; / / Se crea una ventana - como lo hemos hecho en Interface Builder bye bye [ [ UIWindow alloc ] initWithFrame : windowRect ] ; MainWindow UIWindow * = [[UIWindow alloc] initWithFrame: windowRect]; / / Establecer el fondo de la ventana de color amarillo, para diferenciar / / El FirstApp solicitud anterior [ UIColor yellowColor ] ] ; [SetBackgroundColor MainWindow: [UIColor yellowColor]]; mainWindow ] ; [Self SetWindow: MainWindow]; ; [Ventana makeKeyAndVisible]; ; [MainWindow liberación]; } |
Ya se puede probar la aplicación, si usted consigue una ventana amarilla que lo hizo todo bien!
, necessario solo se si usa Interface Builder. En el archivo de SecondAppAppDelegate.h podemos eliminar IBOutlet , sólo es necesario si se utiliza Interface Builder. También añadir que nuestras variables globales, la última vez que había entrado en el controlador. A continuación, modificar el archivo SecondAppAppDelegate.h :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # Importar <UIKit/UIKit.h> NSObject <UIApplicationDelegate> { @ Interface SecondAppAppDelegate: NSObject {<UIApplicationDelegate> UIWindow * ventana; UITextField * número; UIButton botón *; numeroACaso int; } nonatomic, retain ) UIWindow * window; @ Propiedad (no atómica, retener) UIWindow ventana *; void ) controllaNumero; - (Void) obtenerNumero; @ End |
, in quanto non stiamo usando Interface Builder. Una vez más, hemos preparado la definición del método controllaNumero , como la última vez, pero hemos eliminado la indicación IBAction , porque no se está utilizando Interface Builder.
Creamos la interfaz de código
Es el momento de crear código con todos los componentes de nuestra interfaz. ed inseriamo il seguente codice: Volvamos al archivo SecondAppAppDelegate.m , posizioniamoci antes [mainWindow release] e introduzca el siguiente código:
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 | / / Creamos la barra de título [ [ UINavigationBar alloc ] initWithFrame : CGRectMake ( 0.0 , 0.0 , 320.0 , 44.0 ) ] ; UINavigationBar myNavigationBar * = [[UINavigationBar alloc] initWithFrame: CGRectMake (0.0, 0.0, 320.0, 44.0)]; myNavigationBar.barStyle = UIBarStyleDefault; [ [ UINavigationItem alloc ] initWithTitle : @ "Indovina un numero" ] ; UINavigationItem navigationItem * = [[UINavigationItem alloc] initWithTitle: @ "Adivina el número"]; navigationItem animated : NO ] ; [MyNavigationBar pushNavigationItem: navigationItem animados: NO]; myNavigationBar ] ; [Ventana addSubview: myNavigationBar]; / / Crear la etiqueta [ [ UILabel alloc ] initWithFrame : CGRectMake ( 10 , 50 , 300 , 80 ) ] ; UILabel myLabel * = [[UILabel alloc] initWithFrame: CGRectMake (10, 50, 300, 80)]; UIColor clearColor ] ; myLabel.backgroundColor = [UIColor clearColor]; ; myLabel.numberOfLines = 2; "iPhone ha pensato un numero da 1 a 10, prova ad indovinarlo?" ; myLabel.text = @ "El iPhone ha diseñado un número del 1 al 10, trata de adivinar?" myLabel ] ; [Ventana addSubview: myLabel]; / / Crear entrada de texto UITextField alloc ] initWithFrame : CGRectMake ( 10 , 120 , 300 , 30 ) ] ; = número [[UITextField alloc] initWithFrame: CGRectMake (10, 120, 300, 30)]; numero.borderStyle = UITextBorderStyleRoundedRect; numero.textAlignment = UITextAlignmentCenter; numero.keyboardType = UIKeyboardTypeNumberPad; "Inserisci il numero" ; numero.placeholder = @ "Introduzca el número"; numero ] ; [Ventana addSubview: número]; / / Crear el botón UIButton buttonWithType : UIButtonTypeRoundedRect ] ; botón = [UIButton buttonWithType: UIButtonTypeRoundedRect]; 10 , 180 , 300 , 30 ) ; bottone.frame CGRectMake = (10, 180, 300, 30); @ "Premi qui" forState : UIControlStateNormal ] ; [Botón setTitle: @ "Click Aquí" Forst: UIControlStateNormal]; self action : @selector ( controllaNumero ) forControlEvents : UIControlEventTouchUpInside ] ; El botón [AddTarget: acción de auto: @ selector (obtenerNumero) forControlEvents: UIControlEventTouchUpInside]; bottone ] ; [Ventana addSubview: botón]; ; [MyLabel liberación]; ; [NavigationItem liberación]; ; [MyNavigationBar liberación]; |
della scorsa volta, subito dopo il [mainWindow release]; inseriamo: Desde el ' applicationDidFinishLaunching corresponde a viewDidLoad que la última vez, justo después de la [mainWindow release]; insertar:
1 | + arc4random ( ) % 10 ; numeroACaso arc4random = 1 + () 10%; |
Ahora que podemos hacer es implementar el método controllaNumero , que será idéntico (aparte del prototipo) para que el tiempo utilizado por última vez:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | void ) controllaNumero { - (Void) {obtenerNumero "Premuto bottone di controlla numero" ) ; NSLog (@ "número presionado el botón de control"); [ numero.text integerValue ] ; numeroInserito = int [numero.text integerValue]; message; NSString * mensaje; "Il numero inserito è %d" , numeroInserito ) ; NSLog (@ "El número introducido es% d", numeroInserito); numeroInserito <numeroACaso ) { if (numeroInserito <numeroACaso) { "Troppo basso..." ; message = @ "demasiado baja ..."; ( numeroInserito> numeroACaso ) { } Else if (numeroInserito> numeroACaso) { "Troppo alto..." ; message = @ "demasiado alto ..."; ( numeroInserito == numeroACaso ) { } Else if (numeroInserito numeroACaso ==) { "Bravo hai indovinato" ; message = @ "Bravo, lo habéis adivinado"; + arc4random ( ) % 10 ; numeroACaso arc4random = 1 + () 10%; "Numero pensato %d" , numeroACaso ) ; NSLog (@ "% d Número de pensamiento," numeroACaso); } [ [ UIAlertView alloc ] UIAlertView alertMessaggio * = [[UIAlertView alloc] "Responso" initWithTitle: @ "Respuesta" mensaje: mensaje delegado: nil "OK" cancelButtonTitle: @ "OK" ] ; otherButtonTitles: nil]; ; [AlertMessaggio show]; ; [AlertMessaggio liberación]; "" ; numero.text @ = ""; } |
Ya hemos terminado!
Conclusiones y consideraciones
, proprio perchè volevo lasciarlo il più semplice e snello possibile e, anche, per dimostrare che non sono elementi sempre necessari. Este ejemplo no hacer uso directo de un UIView o UIViewController , sólo porque me quería ir lo más simple y ágil como sea posible y, también, para mostrar que los elementos no siempre son necesarias. Sin embargo insertar objetos directamente en la ventana puede tener algún sentido en este ejemplo y otros contextos esporádicos. portano comunque benefici in tantissimi altri casi, ein alcuni sono praticamente indispensabili; come avremo modo di vedere in futuro. El uso de UIView y UIViewController traer beneficios en muchos otros casos, sin embargo, algunos son ein prácticamente indispensable, como veremos en el futuro.
XCode: organizar el código con la marca # pragma
Xcode es un muy potente y versátil y ofrece al programador con muchas características útiles y fáciles de usar. Al escribir código complejo, o por lo menos articulado, es importante para organizar el código para que no pierdas el tiempo buscando las funciones de extensión en las líneas largas de código. Después de comentar, lo primero y más importante que hacer, el entorno XCode proporciona directrices (NICE) para mejorar la usabilidad y legginilità en el desarrollo. Una de ellas es la directiva #pragma mark que es muy útil en la organización de los grupos del código y los métodos.
En la siguiente imagen se puede ver la parte del código de mi proyecto PragmaTest :

En el menú desplegable superior le permite a la lista de todos los métodos de nuestra clase. Ahora bien, si insertamos nuestro método sobre la directiva #pragma mark que tiene una sintaxis:
1 | Marca # Pragma {etiqueta} |
Se obtiene:

El primer #pragma mark con un guión (-) inserta una línea de separación. El segundo es un texto (etiqueta) al gusto. Usted puede agregar la siguiente declaración en la que desea, la organización del código como mejor le parezca. Puede introducir más pragmático líneas, escriba:
1 2 3 4 5 6 | # Pragma marca - # Pragma marca / ** # Pragma marca * Usando el pragma # Pragma * marca en varias líneas de código # Pragma marca * / void ) mioMetodo { } - (Void) {} miMetodo |
Apple iPhone: la primera versión 1.2

Disponible en el AppStore de actualización a la versión 1.2 de thefirst . Aquí están las notas de la versión:
- Completamente revisado a lo largo de los gráficos del juego, que ahora es mucho más agradable
- Compatible con Apple iPhone 3.0
- Añadido efectos de sonido
- Revisado y mejorado la navegabilidad del juego y las instrucciones
iPhone: todas las fuentes del sistema
El iPhone de Apple ofrece un número limitado de tipos de letra para los desarrolladores. La lista de fuentes disponibles es fácil de lograr por el código, como veremos más adelante. Si desea utilizar sus propias fuentes, como la inclusión en los recursos, es un poco más articulado y conivolge también la expedición de certificados (derechos) fuentes "embed" ... vamos a hablar más tarde. Cambio, en cuanto a las fuentes oficiales presentes en el iPhone son (haga clic sobre la imagen para ampliar):
El Apple iPhone SDK permite el acceso a las fuentes del sistema especial. Estos son identificados por las constantes especiales y son los siguientes:
1 2 3 | [ UIFont boldSystemFontOfSize : 12.0 ] ; UIFont myBoldFont * = [UIFont boldSystemFontOfSize: 12,0]; [ UIFont SystemFontOfSize : 12.0 ] ; UIFont mySystemFont * = [UIFont SystemFontOfSize: 12,0]; [ UIFont italicSystemFontOfSize : 12.0 ] ; UIFont myItalicFont * = [UIFont italicSystemFontOfSize: 12,0]; |
Si usted consigue realmente un puntero a una Odei fuentes se muestra en la imagen de arriba sólo tiene que utilizar:
1 | [ UIFont fontWithName : @ "Helvetica-Bold" size : 22.0 ] ; UIFont myCustomFont * = [fontWithName UIFont: @ "Helvetica-Bold", tamaño: 22,0]; |
Como se puede ver la dirección de la fuente es especial, además de la familia (Helvetica, Courier, etc ...) debe especificar el tipo (negrita, cursiva, etc ...). En la práctica, por lo tanto, una fuente debe estar equipado con estas características. La Helvética, por ejemplo, está representada por:
1 2 3 4 | Helvetica Helvetica-Bold Helvetica-Oblique Helvetica-BoldOblique |
Si desea visualizar sus fuentes directamente en el iPhone, he aquí algunas líneas de código de utilidad:
1 2 3 4 5 6 7 8 9 10 11 12 | listOfFonts = [ [ NSArray alloc ] initWithArray : [ UIFont familyNames ] ] ; NSArray listOfFonts * = [[ NSArray alloc] initWithArray: [UIFont familyNames]]; subFontTypes; NSArray * subFontTypes; int i = 0 ; i< [ listOfFonts count ] ; i ++ ) { for (int i = 0; i <[listOfFonts cuenta]; i + +) { "Font Family: %@" , [ listOfFonts objectAtIndex : i ] ) ; NSLog (@ "Font Family:% @", [objectAtIndex listOfFonts: i]); NSArray alloc ] initWithArray : [ UIFont fontNamesForFamilyName : [ listOfFonts objectAtIndex : i ] ] ] ; subFontTypes = [[ NSArray alloc] initWithArray: [UIFont fontNamesForFamilyName: [objectAtIndex listOfFonts: i]]]; int j = 0 ; j< [ subFontTypes count ] ; j ++ ) { for (int j = 0 j <[subFontTypes cuenta] j + +) { "+----->Type: %@" , [ subFontTypes objectAtIndex : j ] ) ; NSLog (@ Tipo "+----->:% @ ", [objectAtIndex subFontTypes: j]); } ; [Liberación SubFontTypes]; } ; [ListOfFonts liberación]; |
Con la SDK 2.2.1 en mi simulador, que tengo:
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | Familia de fuentes: Courier Tipo +----->: Courier Tipo +----->: Courier-BoldOblique Tipo +----->: Courier-Oblique Tipo +----->: Courier-Bold Font Family: AppleGothic Tipo +----->: AppleGothic Familia de la fuente: Arial Tipo +----->: ArialMT +-----> Tipo: Arial-BoldMT +-----> Tipo: Arial-BoldItalicMT +-----> Tipo: Arial-ItalicMT Font Family: sLa TC Tipo +----->: Luz STHeitiTC +-----> Tipo: Media-STHeitiTC Font Family: Hiragino Kaku Pron gótico Tipo +----->: HiraKakuProN-W6 Tipo +----->: HiraKakuProN-W3 Familia de fuentes: Courier New Tipo +----->: CourierNewPS-BoldMT Tipo +----->: CourierNewPS-ItalicMT Tipo +----->: CourierNewPS-BoldItalicMT Tipo +----->: CourierNewPSMT Familia de fuentes: Zapfino +-----> Tipo: Zapfino Familia de la fuente: Arial Unicode MS Tipo +----->: ArialUnicodeMS Font Family: sLa SC Tipo +----->: Media-STHeitiSC Tipo +----->: Luz STHeitiSC Font Family: Máquina de escribir de América Tipo +----->: AmericanTypewriter Tipo +----->: AmericanTypewriter-Bold Familia de fuentes: Helvetica +-----> Tipo: Helvetica-Oblique +-----> Tipo: Helvetica-BoldOblique +-----> Tipo: Helvetica Tipo +----->: Helvetica-Bold Font Family: rotulador Tipo +----->: Thin-MarkerFelt Familia de fuentes: Helvetica Neue Tipo +----->: HelveticaNeue +-----> Tipo: HelveticaNeue-Bold Font Family: DB LCD Temperatura Tipo +----->: DBLCDTempBlack Familia de fuentes: Verdana +-----> Tipo: Verdana-Bold Tipo +----->: Verdana-BoldItalic +-----> Tipo: Verdana Tipo +----->: Verdana-Italic Familia de letra: Times New Roman Tipo +----->: TimesNewRomanPSMT Tipo +----->: TimesNewRomanPS-BoldMT Tipo +----->: TimesNewRomanPS-BoldItalicMT Tipo +----->: TimesNewRomanPS-ItalicMT Font Family: Georgia +-----> Tipo: Georgia-Bold +-----> Tipo: Georgia +-----> Tipo: Georgia-BoldItalic +-----> Tipo: Georgia-Italic Font Family: sLa J +-----> Tipo: Media-STHeitiJ +-----> Tipo: Luz STHeitiJ Familia de la fuente: Arial Rounded MT Bold Tipo +----->: ArialRoundedMTBold Font Family: Trebuchet MS Tipo +----->: TrebuchetMS-Italic Tipo +----->: TrebuchetMS +-----> Tipo: Trebuchet-BoldItalic Tipo +----->: TrebuchetMS-Bold Font Family: sLa K Tipo +----->: Media-STHeitiK Tipo +----->: Luz STHeitiK |
Cómo borrar NSLog () de la fuente de XCode
<a target="_blank" href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/Reference/reference.html#//apple_ref/c/func/NSLog">NSLog()</a> una función útil durante las primeras etapas de un proyecto para probar y depurar una aplicación para el iPhone de Apple o, más generalmente, en el entorno XCode. Siendo sólo una función, al igual que el otro, su presencia se hará sentir, incluso cuando la liberación (release) nuestro ejecutable. potrebbero influire sulle performance della nostra applicazione, soprattutto se abbiamo inserito NSLog() all'interno di loop. Se hace necesario para eliminar, de alguna manera, todas las filas de NSLog() de nuestro código, porque ya no es necesaria, y porque las llamadas a NSLog() podría afectar el rendimiento de nuestra aplicación, sobre todo si ponemos NSLog() para 'bucle interno.
Descartar inmediatamente la solución a la "mirada" y "cancelar" porque un día podría ser usado de nuevo. Se excluye la solución de la "apariencia" y "comentarios", incómodo por la misma razón que antes. Afortunadamente, uno. Limpio, simple, y está utilizando el compilador condicionales correcta ¿Qué vamos a hacer en la práctica, y decirle al compilador que excluir - si hay una condición específica - la hora de elaborar nuestras líneas de código que contienen NSLog() .
Las directivas de compilador y las declaraciones de compilación condicional, es un muy poderoso y generalizado. Los procedentes de la elaboración de la norma ANSI-C sin duda saben muy bien y tienen utilizzte en muchas situaciones. La peculiaridad de estas "instrucciones" radica en el hecho, mencionado anteriormente, para ser vistos por el compilador y ejecutable no. Esta característica los hace útiles en muchos casos y puede resolver los problemas de otro modo muy molesto.
Veamos un ejemplo de código que, como se predijo, se puede "borrar" de la compilación de código compartido, en nuestro caso NSLog() :
1 2 3 4 5 6 | # Definición de una ACTIVE_NSLOG / / Si la constante se define ACTIVE_NSLOG llenar / / El bloque de código entre # ifdef y # endif # Ifdef ACTIVE_NSLOG " ... bla bla" ) ; NSLog (@ "... bla, bla"); # Endif |
). Las instrucciones condicionales son parte del compilador de la misma familia que #define , también, de hecho, son precedidos por una "libra" ( # ). solo se ACTIVE_NSLOG è definito. En el ejemplo mostrado, hemos definido una constante ACTIVE_NSLOG , las siguientes líneas de código indica al compilador de "incluir" línea NSLog() sólo si ACTIVE_NSLOG se define. Si nos ocupamos, durante la redacción de nuestro código, para realizar llamadas a NSLog() dentro del bloque #ifdef ... #endif per far sparire, alla prossima compilazione, tutti i nostri NSLog() . #ifdef ... #endif , basta con borrar la definición de la constante ACTIVE_NSLOG a desaparecer, la siguiente compilación, todos nuestros NSLog() .
Una mejor y final
Veamos ahora cómo configurar el entorno XCode para mejorar aún más lo que hemos hecho aquí! En primer lugar se elige un nombre de constante que utilizamos en nuestros proyectos para excluir de la compilación NSLog() . o quello che preferite. Usted puede elegir el nombre que desee, desde DEBUG a MIO_DEBUG o lo que sea que usted prefiera. Abra su proyecto, nuevo o viejo. Introduzca todos los NSLog() dentro del bloque (o bloques):
1 2 3 | # Ifdef MIO_DEBUG " ... bla bla" ) ; NSLog (@ "... bla, bla"); # Endif |
Seleccione el archivo principal de su proyecto, haga clic en el botón derecho y elegir la opción Obtener información.

Esto abre una ventana con información sobre el proyecto:

Seleccione la pestaña Crear, comprobar que está en la configuración de depuración (esta es la joya), vaya a la sección definida por el usuario y agregar, a través del botón en la parte inferior izquierda, un nuevo campo llamado OTHER_CFLAGS . En este valor assegnamoli -DMIO_DEBUG=1 . La sintaxis es -D{mia define}=1 .
Este procedimiento tiene dos ventajas:
- No debemos poner en el código
#define MIO_DEBUG 1, pero lo hacemos a través de la información del proyecto. Por lo tanto, cuando vamos a llenar la versión de lanzamiento (el uno sin elNSLog()) no tiene que acordarse de eliminar la línea#define MIO_DEBUG 1 - La constante se define en relación a la configuración, en nuestro caso, de depuración. Por lo tanto, cambiar a la versión de configuración (la liberación) va a estar ausente y las filas constante con
NSLog()no se compila
Conclusiones
El procedimiento anterior puede ser útil en otros casos moltidutine, con NSLog() , no tienen nada que hacer. Las instrucciones condicionales pueden ayudar a que el compilador en una amplia gama de contextos. A menudo son utilizados por los programadores para determinar el tipo de sistema operativo, la versión, el objetivo, la presencia de los procesadores de matemáticas, mientras que el mantenimiento de la misma "misma" fuente.
Para entender, por ejemplo, podemos utilizzre nuestra constante MIO_DEBUG también intervenir en otras áreas del código:
1 2 3 4 5 6 7 8 9 10 | / / Debug si ganan el juego / / Con una puntuación de 100 en vez de 10000:) # Ifdef MIO_DEBUG score == 100 ) if (calificación == 100) # Else score == 10000 ) if (puntuación == 10000) # Endif { ; [HaiVinto mismo]; } |
Para terminar, he aquí algunos ejemplos y variantes:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | / / En general, hay # Si la expresión / / Si la declaración similar a la tradicional, por lo que con una expresión de completa / / Comprobar si una constante se define # Constante Ifdef / / Comprobar si NO es una constante definida # Ifndef constante / / Else # Else / / Cerrar el bloque # Endif |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | / / Por ejemplo ... # Define DEBUG 1 5 # define MIA_ALTRA_COSTANTE ... # Si DEBUG / / Rellena el siguiente # Else / / En caso contrario llenar este otro # Endif # Si MIA_ALTRA_COSTANTE> 4 "..." ) ; NSLog (@ "..."); # Endif |
1 2 3 4 | # Ifndef INCLUDE_MIO_FILE # Definir INCLUDE_MIO_FILE # Include "mio_file.h" # Endif |








Ú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, ...