<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Sumolari.com &#187; Objective-C</title>
	<atom:link href="http://sumolari.com/category/objective-c/feed/" rel="self" type="application/rss+xml" />
	<link>http://sumolari.com</link>
	<description>Proyectos de un amante de la informática</description>
	<lastBuildDate>Tue, 08 May 2012 16:01:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Actualización 2.0.1 de Music Maniac</title>
		<link>http://sumolari.com/actualizacion-2-0-1-de-music-maniac/</link>
		<comments>http://sumolari.com/actualizacion-2-0-1-de-music-maniac/#comments</comments>
		<pubDate>Mon, 12 Sep 2011 17:28:50 +0000</pubDate>
		<dc:creator>Sumolari</dc:creator>
				<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPod Touch]]></category>
		<category><![CDATA[mis creaciones]]></category>
		<category><![CDATA[Muisc Maniac]]></category>

		<guid isPermaLink="false">http://sumolari.com/?p=5659</guid>
		<description><![CDATA[En cuestión de horas estará disponible la versión 2.0.1 de Music Maniac en el AppStore. Esta actualización corrige algunos errores de la versión 2.0, entre los que se encuentran: Un error en la traducción al español. Errores diversos al tener pocas canciones en la biblioteca de iTunes (o pocos metadatos sobre las mismas). Un error [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://sumolari.com/wp-content/uploads/2011/09/LiteiTunesArtwork.png" rel="lightbox-5659"><img class="alignright size-medium wp-image-5664" title="Icono de Music Maniac Lite 2.0" src="http://sumolari.com/wp-content/uploads/2011/09/LiteiTunesArtwork-300x300.png" alt="Icono de Music Maniac Lite 2.0" width="150" height="150" /></a>En cuestión de horas estará disponible la versión 2.0.1 de <a href="http://musicmaniac.sumolari.com/">Music Maniac</a> en <a href="http://itunes.com/apps/music-maniac">el AppStore</a>. Esta actualización corrige algunos errores de la versión 2.0, entre los que se encuentran:</p>
<ul>
<li>Un error en la traducción al español.</li>
<li>Errores diversos al tener pocas canciones en la biblioteca de iTunes (o pocos metadatos sobre las mismas).</li>
<li>Un error que no iluminaba la respuesta correcta al terminar una ronda y no seleccionar ninguna canción.</li>
<li>Se ha mejorado el consumo de capacidad de almacenamiento que requiere Music Maniac para guardar ciertas estadísticas.</li>
</ul>
<p>También incluye otros cambios menores, como que al jugar Offline y salir de un concurso, en lugar de perder los avances, se carga la vista de estadísticas y se guardan los puntos obtenidos durante el tiempo que se jugó.</p>
<p>Además esta actualización también afecta a <a href="http://itunes.apple.com/es/app/music-maniac-lite/id411728119?mt=8">Music Maniac Lite</a>, pudiendo disfrutar de las novedades de la versión 2.0 en la versión reducida de <a href="http://itunes.apple.com/es/app/music-maniac/id404414993?mt=8">Music Maniac</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://sumolari.com/actualizacion-2-0-1-de-music-maniac/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Guardar objetos en archivos con Objective-C</title>
		<link>http://sumolari.com/guardar-objetos-en-archivos-con-objective-c/</link>
		<comments>http://sumolari.com/guardar-objetos-en-archivos-con-objective-c/#comments</comments>
		<pubDate>Wed, 07 Sep 2011 06:50:02 +0000</pubDate>
		<dc:creator>Sumolari</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Introducción a Objective-C]]></category>
		<category><![CDATA[xcode]]></category>

		<guid isPermaLink="false">http://sumolari.com/?p=5633</guid>
		<description><![CDATA[Ayer Carmen Parra preguntaba en un comentario cómo se pueden guardar los datos introducidos por el usuario en un archivo. Como el proceso es demasiado largo como para publicarlo en un comentario, he decidido escribir este pequeño tutorial. NSArray, NSDictionary, NSString, NSNumber, NSData y otros Hay dos métodos sencillos para almacenar un objeto en un [...]]]></description>
			<content:encoded><![CDATA[<p>Ayer <a href="http://sumolari.com/introduccion-a-objective-c-el-paradigma-de-la-poo/comment-page-1/#comment-42784">Carmen Parra</a> preguntaba en un comentario cómo se pueden guardar los datos introducidos por el usuario en un archivo. Como el proceso es demasiado largo como para publicarlo en un comentario, he decidido escribir este pequeño tutorial.</p>
<h3>NSArray, NSDictionary, NSString, NSNumber, NSData y otros</h3>
<p><a href="http://sumolari.com/wp-content/uploads/2011/09/Captura-de-pantalla-2011-09-07-a-las-07.21.15.png" rel="lightbox-5633"><img class="alignright size-medium wp-image-5634 rightimage" title="Resultado del código de ejemplo" src="http://sumolari.com/wp-content/uploads/2011/09/Captura-de-pantalla-2011-09-07-a-las-07.21.15-300x115.png" alt="Resultado del código de ejemplo" width="300" height="115" /></a>Hay dos métodos sencillos para almacenar un objeto en un archivo y poder recuperarlo cuando nos convenga. El primero no se puede aplicar a cualquier objeto, sino a objetos de algunas clases de <a href="http://sumolari.com/category/objective-c/">Objective-C </a>que responden a dos métodos llamados <em>writeToFile:atomically:</em> y <em>writeToURL:atomically:</em>. El uso de estos métodos es muy sencillo, basta con llamarlos en el momento en el que queramos que el objeto se guarde en un archivo.</p>
<p>A continuación teneís un ejemplo comentado. Básicamente creamos una matriz, le añadimos algo de contenido, la imprimimos, la guardamos en un archivo y nos deshacemos de ella. A continuación creamos otra matriz que lea el contenido del archivo y comprobamos que tiene el mismo contenido que la anterior. El resultado que obtendréis será similar al de la imagen de la derecha.</p>
<pre class="prettyprint linenums">
NSMutableArray *array = [[NSMutableArray alloc] init]; // Creamos una matriz
	[array addObject:@&quot;¡Hola&quot;]; // Añadimos un objeto
	[array addObject:@&quot;mundo!&quot;]; // Añadimos otro objeto
	NSLog(@&quot;Matriz original: %@&quot;, array); // Imprimimos la matriz original
	[array writeToFile:@&quot;filename&quot; atomically:YES]; // Escribimos en el archivo filename el contenido de la matriz
	[array release]; // Liberamos memoria
	NSMutableArray *arrayFromFile = [[NSMutableArray alloc] initWithContentsOfFile:@&quot;filename&quot;]; // Esta matriz tiene el mismo contenido que tenía la matriz anterior
	NSLog(@&quot;%@&quot;, arrayFromFile); // Imprimimos la matriz recuperada del archivo
	[arrayFromFile release]; // Liberamos memoria
</pre>
<p>Del mismo modo que se puede guardar en un archivo un objeto de la clase <em>NSArray</em>, también se puede usar con objetos <em>NSDictionary</em>, <em>NSString</em>, <em>NSData</em> y <em>NSNumber</em>, entre otros. Sin embargo no se puede usar con objetos de una clase creada por nosotros (en la mayoría de los casos).</p>
<h3>Clases creadas por nosotros</h3>
<p>Para guardar en un archivo un objeto de una clase creada por nosotros, tendremos que hacer que el objeto sigua el protocolo <em>NSCoding</em>. Tras esto, mediante las clases <em>NSKeyedArchiver</em> y <em>NSKeyedUnarchiver</em> podremos guardar en un archivo y leer de un archivo nuestro objeto. Este protocolo tiene dos métodos necesarios: <em>initWithCoder:</em> y <em>encodeWithCoder:</em>.</p>
<p>Vamos a suponer que hemos creado la clase <em>Empleado</em>, que tiene la siguiente interfaz:</p>
<pre class="prettyprint linenums">
@interface Empleado : NSObject
@property (nonatomic, retain)	NSString	*nombre, *apellidos;
@property						NSUInteger	edad;
@property						BOOL		esEmpleadoDelMes;
@end
</pre>
<p>Para poder almacenar este objeto en un archivo tendremos primero que hacer que siga el protocolo <em>NSCoding</em>. Modficaremos la interfaz y la dejaremos así:</p>
<pre class="prettyprint linenums">
#define kNombre				@&quot;Nombre&quot;
#define kApellidos			@&quot;Apellidos&quot;
#define kEdad				@&quot;Edad&quot;
#define kEsEmpleadoDelMes	@&quot;esEmpleadoDelMes&quot;
@interface Empleado : NSObject
@property (nonatomic, retain)	NSString	*nombre, *apellidos;
@property						NSUInteger	edad;
@property						BOOL		esEmpleadoDelMes;
@end
</pre>
<p>Básicamente hay dos cambios: hemos indicado que la clase sigue el protocolo <em>NSCoding</em> y hemos definido una serie de constantes que usaremos más adelante y que entenderéis en seguida su utilidad.</p>
<p>Ahora pasamos a la implementación. Esta es la implementación original de la clase <em>Empleado</em>, antes de seguir el protocolo <em>NSCoding</em>:</p>
<pre class="prettyprint linenums">
@implementation Empleado
@synthesize nombre, apellidos;
@synthesize edad;
@synthesize esEmpleadoDelMes;
- (void)dealloc
{
	[nombre release];
	[apellidos release];
	[super dealloc];
}
@end
</pre>
<p>Ahora vamos a añadir los dos métodos que necesitamos para seguir el protocolo <em>NSCoding</em>. Estos métodos nos permiten archivar nuestro objeto. El método <em>encodeWithCoder:</em> tiene por parámetro un objeto de la clase <em>NSCoder</em>. En este objeto archivaremos las propiedades del nuestro, asignándole a una serie de claves las propiedades del objeto.</p>
<p>Por ejemplo, si queremos hacer que la propiedad <em>nombre</em> se archive en la clave <em>clave</em>, el método tendría el siguiente aspecto:</p>
<pre class="prettyprint linenums">
- (void)encodeWithCoder:(NSCoder *)coder {
    [coder encodeObject:self.nombre forKey:@&quot;clave&quot;];
}
</pre>
<p>No todas las propiedades se archivan de la misma forma. Los objeto se archivan a través del método <em>encodeObject:forKey:</em>, los números enteros se archivan con <em>encodeInteger:forKey:</em> y los valores booleanos con <em>encodeBool:forKey:</em>. Las claves son muy importantes, ya que el método <em>initWithCoder:</em> va a desarchivar el objeto usando las mismas claves para acceder a las propiedades, por eso hemos definido una serie de constantes que serán las claves que usaremos para archivar y desarchivar las propiedades.</p>
<p><strong>Nota:</strong> Tenéis una lista de todos los métodos para archivar objetos, así como una explicación del proceso de archivar y desarchivar objetos en <a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Archiving/Articles/codingobjects.html#//apple_ref/doc/uid/20000948-BCIHBJDE">la documentación de Apple</a> (en inglés).</p>
<p>Nuestro método <em>encodeWithCoder:</em> quedará así:</p>
<pre class="prettyprint linenums">
- (void)encodeWithCoder:(NSCoder *)coder {
    [coder encodeObject:self.nombre forKey:kNombre];
	[coder encodeObject:self.apellidos forKey:kApellidos];
	[coder encodeInteger:self.edad forKey:kEdad];
	[coder encodeBool:self.esEmpleadoDelMes forKey:kEsEmpleadoDelMes];
}
</pre>
<p>El método <em>initWithCoder:</em> es muy similar al anterior, sólo que su funcionamiento es el contrario: a partir de un objeto archivado se obtienen las propiedades y se crea un objeto de la clase <em>Empleado</em> (en este caso) con las propiedades que tenía el objeto al archivarse. En este caso enviaremos el mensaje <em>decodeObjectForKey:@&#8221;clave&#8221;</em> a <em>coder</em> y asignaremos el valor devuelto a la propiedad de nuestro objeto. De nuevo, se usan métodos diferentes para decodificar número enteros, valores booleanos y otros tipos de variables. Nuestro método <em>initWithCoder: </em>quedará así:</p>
<pre class="prettyprint linenums">
- (id)initWithCoder:(NSCoder *)coder {
    if ((self = [super init])) {
		self.nombre = [coder decodeObjectForKey:kNombre];
		self.apellidos = [coder decodeObjectForKey:kApellidos];
		self.edad = [coder decodeIntForKey:kEdad];
		self.esEmpleadoDelMes = [coder decodeBoolForKey:kEsEmpleadoDelMes];
	}
    return self;
}
</pre>
<p><a href="http://sumolari.com/wp-content/uploads/2011/09/Captura-de-pantalla-2011-09-07-a-las-08.43.05.png" rel="lightbox-5633"><img class="alignleft size-medium wp-image-5641 leftimage" title="Resultado del ejemplo" src="http://sumolari.com/wp-content/uploads/2011/09/Captura-de-pantalla-2011-09-07-a-las-08.43.05-300x19.png" alt="Resultado del ejemplo" width="300" height="19" /></a>Ahora pasemos a crear un objeto <em>Empleado</em>, a guardarlo en un archivo y a comprobar que funciona correctamente. Primero incluímos la interfaz de la clase <em>Empleado </em>en el archivo en el que vamos a crear el objeto, en mi caso, y al tratarse de una &#8220;<em>Command Line Tool</em>&#8220;, lo incluiré en el archivo <em>main.m</em>. El siguiente código comentado crea un objeto de la clase <em>Empleado</em>, le asigna algunos valores sus propiedades, lo archiva y después crea un nuevo objeto con el contenido del archivo en el que se ha guardado antes el objeto:</p>
<pre class="prettyprint linenums">
Empleado *trabajador = [[Empleado alloc] init]; // Creamos el objeto
	trabajador.nombre = @&quot;Juan&quot;; // Le damos un nombre
	trabajador.apellidos = @&quot;García López&quot;; // Unos apellidos
	trabajador.edad = 26; // Una edad
	trabajador.esEmpleadoDelMes = YES; // Y lo hacemos empleado del mes
	NSLog(@&quot;%@ %@ tiene %lu años&quot;, trabajador.nombre, trabajador.apellidos, trabajador.edad); // Imprimimos sus datos
	[NSKeyedArchiver archiveRootObject:trabajador toFile:@&quot;empleado&quot;]; // Lo guardamos en el archivo empleado
	[trabajador release]; // Liberamos memoria
	Empleado *trabajadorRecuperado = [NSKeyedUnarchiver unarchiveObjectWithFile:@&quot;empleado&quot;]; // Creamos un objeto a partir del archivo empleado
	NSLog(@&quot;%@ %@ tiene %lu años&quot;, trabajadorRecuperado.nombre, trabajadorRecuperado.apellidos, trabajadorRecuperado.edad); // Imprimimos sus datos
</pre>
<p>Así se puede guardar un objeto de cualquier clase en un archivo, de forma que puede ser recuperado en cualquier momento. Los objetos más complejos pueden necesitar métodos más complejos a la hora de archivarlos. Del mismo modo no se tienen por qué archivar todas las propiedades si no se quiere.</p>
<p>Por último <a href="http://cl.ly/140k2I3L2b1U1N0E0Z1H">dejo a vuestra disposición los archivos del proyecto que he creado mientras escribía el tutorial</a>, por si os atascáis y necesitáis un empujoncito.</p>
]]></content:encoded>
			<wfw:commentRss>http://sumolari.com/guardar-objetos-en-archivos-con-objective-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Music Maniac 2.0 en el AppStore</title>
		<link>http://sumolari.com/music-maniac-2-0-en-el-appstore/</link>
		<comments>http://sumolari.com/music-maniac-2-0-en-el-appstore/#comments</comments>
		<pubDate>Wed, 31 Aug 2011 16:08:58 +0000</pubDate>
		<dc:creator>Sumolari</dc:creator>
				<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPod Touch]]></category>
		<category><![CDATA[mis creaciones]]></category>
		<category><![CDATA[Music Maniac]]></category>

		<guid isPermaLink="false">http://sumolari.com/?p=5614</guid>
		<description><![CDATA[Ya está disponible Music Maniac 2.0 en el AppStore como una actualización de Music Maniac. Las novedades ya las resumí hace unos días, que son en definitiva nuevos modos de juego, nueva interfaz, modo multijugador online y otras mejoras que no se pueden resumir en un solo párrafo. La versión Lite de Music Maniac estará [...]]]></description>
			<content:encoded><![CDATA[<p>Ya está disponible <a title="Music Maniac 2.0 muy pronto en el App Store" href="http://sumolari.com/music-maniac-2-0-muy-pronto-en-el-app-store/">Music Maniac 2.0</a> en <a href="http://itunes.com/apps/music-maniac">el AppStore</a> como una actualización de <a href="http://musicmaniac.sumolari.com">Music Maniac</a>. Las novedades ya las resumí hace unos días, que son en definitiva nuevos modos de juego, nueva interfaz, modo multijugador online y otras mejoras que no se pueden resumir en un solo párrafo.</p>
<p>La versión Lite de Music Maniac estará disponible muy pronto.</p>
<p>Página de <a href="http://musicmaniac.sumolari.com">Music Maniac en Sumolari.com</a> | <a title="Music Maniac 2.0 muy pronto en el App Store" href="http://sumolari.com/music-maniac-2-0-muy-pronto-en-el-app-store/">Galería de imágenes de Music Maniac</a> | <a href="http://itunes.com/apps/music-maniac">Music Maniac en el AppStore</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://sumolari.com/music-maniac-2-0-en-el-appstore/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Music Maniac 2.0 muy pronto en el App Store</title>
		<link>http://sumolari.com/music-maniac-2-0-muy-pronto-en-el-app-store/</link>
		<comments>http://sumolari.com/music-maniac-2-0-muy-pronto-en-el-app-store/#comments</comments>
		<pubDate>Thu, 25 Aug 2011 10:37:43 +0000</pubDate>
		<dc:creator>Sumolari</dc:creator>
				<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPod Touch]]></category>
		<category><![CDATA[mis creaciones]]></category>
		<category><![CDATA[Music Maniac]]></category>

		<guid isPermaLink="false">http://sumolari.com/?p=5494</guid>
		<description><![CDATA[Music Maniac 2.0 ha sido aprobada en el App Store.  Estará disponible como actualización para todos los usuarios de Music Maniac cuando haya sido aprobada la versión Lite. Mientras tanto, y a falta de unos días (u horas) para que esté disponible esta nueva versión, voy a resumir las principales novedades. Reescrita desde 0 Esta [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://sumolari.com/wp-content/uploads/2011/08/music_maniac_icon.png" rel="lightbox-5494"><img class="alignleft leftimage" style="border: 0pt none;" title="Music Maniac 2.0" src="http://sumolari.com/wp-content/uploads/2011/08/music_maniac_icon.png" alt="Music Maniac 2.0" width="155" height="155" /></a><a href="http://musicmaniac.sumolari.com">Music Maniac 2.0</a> ha sido aprobada en el App Store.  Estará disponible como actualización para todos los usuarios de <a href="http://musicmaniac.sumolari.com">Music Maniac</a> cuando haya sido aprobada la versión Lite. Mientras tanto, y a falta de unos días (u horas) para que esté disponible esta nueva versión, voy a resumir las principales novedades.</p>
<h3>Reescrita desde 0</h3>
<p>Esta no es una actualización cualquiera. He comenzado desde 0 la aplicación y la he vuelto a programar al completo, eliminando cualquier error de la versión anterior y añadiendo nuevas funciones. La interfaz también ha cambiado. Ahora el jugador puede añadir concursos a <a href="http://musicmaniac.sumolari.com">Music Maniac</a>, configurando las rondas, los modos de juego y las preguntas. No hay ningún límite de concursos, y por defecto hay tres concursos (que por supuesto, pueden modificarse o eliminarse). Se pueden desplazar los concursos para ver otros.</p>
<p>En la parte inferior de la pantalla hay una serie de trucos e indicaciones. El menú de la aplicación se despliega al hacer un doble toque en la parte superior de la pantalla, e imita la forma de la barra de multitarea de iOS 4. Cada icono lleva a una sección diferente de la aplicación, generalmente para añadir, ordenar o editar concursos.</p>
<h3>Modo multijugador</h3>
<p>Se ha rediseñado el modo multijugador. A partir de ahora se podrá jugar hasta con 4 jugadores, vía Game Center o compartiendo el mismo dispositivo. La interfaz se adapta al número de jugadores para mostrar las puntuaciones de cada uno en todo momento. Además se puede pausar el juego y salir en cualquier momento.</p>
<p>Se ha mejorado el modo online. Ahora <a href="http://musicmaniac.sumolari.com">Music Maniac</a> crea una caché del Top 50 de la iTunes Store y te permite jugar tanto en solitario como con amigos con estas canciones. La primera descargar puede tardar un poco, ya que se deben descargar alrededor de 50 MB, no obstante las siguientes son más rápidas, ya que <a href="http://musicmaniac.sumolari.com">Music Maniac</a> aprovecha las canciones que ya se han descargado y siguen en el Top 50 de la iTunes Store  para agilizar la siguiente sincronización.</p>
<h3>Rendimiento mejorado</h3>
<p><a href="http://musicmaniac.sumolari.com">Music Maniac</a> es ahora más estable y más rápida. Se puede jugar en cualquier dispositivo que soporte iOS 4 y con bibliotecas grandes. El modo online ofrece además un redimiento mejorado al descargar y procesar todas las canciones para que durante las partidas el dispositivo tenga que hacer el minimo esfuerzo posible y se pueda mantaner un ritmo trepidante.</p>
<h3>Universal</h3>
<p>La aplicación sigue siendo universal, es decir, la diversión no se queda en el iPhone o iPod touch, sino que se puede jugar en el iPad con una interfaz mejorada para su pantalla. Los gráficos también están preparados para la Retina Display del iPhone 4 y los iPod touch de última generación.</p>
<p>Desde la aplicación <em>Ajustes</em> se puede cambiar el idioma de <a href="http://musicmaniac.sumolari.com">Music Maniac</a>, traducido por completo al inglés, español y catalán. Puedes jugar con <a href="http://musicmaniac.sumolari.com">Music Maniac</a> en inglés aunque tengas tu dispositivo en español&#8230; ¡o en ruso!</p>
<h3>Nuevo sistema de juego</h3>
<p>En <a href="http://musicmaniac.sumolari.com">Music Maniac</a> se pueden crear los concursos más flexibles vistos en iOS. Ya no se establece el número de rondas por concurso, sino el número de veces que quieres jugar con un modo. Así es posible crear un concurso con una sola ronda para el modo rápido y muchas más rondas para el modo estándar. Además <a href="http://musicmaniac.sumolari.com">Music Maniac</a> ofrece un nuevo modo de juego: el <strong>modo apuesta</strong>. Cuanto más puntos se arriesguen más puntos se pueden ganar.</p>
<h3>Game Center</h3>
<p>Además de soportar el modo multijugador hasta 4 jugadores a través de Game Center, <a href="http://musicmaniac.sumolari.com">Music Maniac</a> incluye logros y tablas de clasificación en las que poder lucirse, También lleva un recuento de los aciertos y al final de cada concurso online que se juegue muestra la lista de las canciones que han sonado, por si te ha gustado alguna y quieres acerte con ella.</p>
<h3>Imágenes</h3>
<p>Estas son las imágenes que aparecerán en el App Store. Hay más imágenes en <a href="http://musicmaniac.sumolari.com">la página de Music Maniac</a>.</p>

<a href='http://sumolari.com/music-maniac-2-0-muy-pronto-en-el-app-store/la-foto-1/' title='Music Maniac 2.0 - iPhone'><img width="230" height="130" src="http://sumolari.com/wp-content/uploads/2011/08/la-foto-1-230x130.png" class="attachment-thumbnail" alt="Music Maniac 2.0 - iPhone" title="Music Maniac 2.0 - iPhone" /></a>
<a href='http://sumolari.com/music-maniac-2-0-muy-pronto-en-el-app-store/la-foto-2/' title='Music Maniac 2.0 - iPhone'><img width="230" height="130" src="http://sumolari.com/wp-content/uploads/2011/08/la-foto-2-230x130.png" class="attachment-thumbnail" alt="Music Maniac 2.0 - iPhone" title="Music Maniac 2.0 - iPhone" /></a>
<a href='http://sumolari.com/music-maniac-2-0-muy-pronto-en-el-app-store/la-foto-3/' title='Music Maniac 2.0 - iPhone'><img width="230" height="130" src="http://sumolari.com/wp-content/uploads/2011/08/la-foto-3-230x130.png" class="attachment-thumbnail" alt="Music Maniac 2.0 - iPhone" title="Music Maniac 2.0 - iPhone" /></a>
<a href='http://sumolari.com/music-maniac-2-0-muy-pronto-en-el-app-store/la-foto-4/' title='Music Maniac 2.0 - iPhone'><img width="230" height="130" src="http://sumolari.com/wp-content/uploads/2011/08/la-foto-4-230x130.png" class="attachment-thumbnail" alt="Music Maniac 2.0 - iPhone" title="Music Maniac 2.0 - iPhone" /></a>
<a href='http://sumolari.com/music-maniac-2-0-muy-pronto-en-el-app-store/la-foto-5/' title='Music Maniac 2.0 - iPhone'><img width="230" height="130" src="http://sumolari.com/wp-content/uploads/2011/08/la-foto-5-230x130.png" class="attachment-thumbnail" alt="Music Maniac 2.0 - iPhone" title="Music Maniac 2.0 - iPhone" /></a>
<a href='http://sumolari.com/music-maniac-2-0-muy-pronto-en-el-app-store/la-foto-1-2/' title='Music Maniac 2.0 - iPad'><img width="230" height="130" src="http://sumolari.com/wp-content/uploads/2011/08/la-foto-11-230x130.png" class="attachment-thumbnail" alt="Music Maniac 2.0 - iPad" title="Music Maniac 2.0 - iPad" /></a>
<a href='http://sumolari.com/music-maniac-2-0-muy-pronto-en-el-app-store/la-foto-2-2/' title='Music Maniac 2.0 - iPad'><img width="230" height="130" src="http://sumolari.com/wp-content/uploads/2011/08/la-foto-21-230x130.png" class="attachment-thumbnail" alt="Music Maniac 2.0 - iPad" title="Music Maniac 2.0 - iPad" /></a>
<a href='http://sumolari.com/music-maniac-2-0-muy-pronto-en-el-app-store/la-foto-3-2/' title='Music Maniac 2.0 - iPad'><img width="230" height="130" src="http://sumolari.com/wp-content/uploads/2011/08/la-foto-31-230x130.png" class="attachment-thumbnail" alt="Music Maniac 2.0 - iPad" title="Music Maniac 2.0 - iPad" /></a>
<a href='http://sumolari.com/music-maniac-2-0-muy-pronto-en-el-app-store/la-foto-4-2/' title='Music Maniac 2.0 - iPad'><img width="230" height="130" src="http://sumolari.com/wp-content/uploads/2011/08/la-foto-41-230x130.png" class="attachment-thumbnail" alt="Music Maniac 2.0 - iPad" title="Music Maniac 2.0 - iPad" /></a>
<a href='http://sumolari.com/music-maniac-2-0-muy-pronto-en-el-app-store/la-foto-5-2/' title='Music Maniac 2.0 - iPad'><img width="230" height="130" src="http://sumolari.com/wp-content/uploads/2011/08/la-foto-51-230x130.png" class="attachment-thumbnail" alt="Music Maniac 2.0 - iPad" title="Music Maniac 2.0 - iPad" /></a>
<a href='http://sumolari.com/music-maniac-2-0-muy-pronto-en-el-app-store/itunesartwork-2/' title='Icono de Music Maniac 2.0'><img width="230" height="130" src="http://sumolari.com/wp-content/uploads/2011/08/iTunesArtwork-230x130.png" class="attachment-thumbnail" alt="Icono de Music Maniac 2.0" title="Icono de Music Maniac 2.0" /></a>
<a href='http://sumolari.com/music-maniac-2-0-muy-pronto-en-el-app-store/liteitunesartwork/' title='Icono de Music Maniac 2.0 Lite'><img width="230" height="130" src="http://sumolari.com/wp-content/uploads/2011/08/LiteiTunesArtwork-230x130.png" class="attachment-thumbnail" alt="Icono de Music Maniac 2.0 Lite" title="Icono de Music Maniac 2.0 Lite" /></a>
<a href='http://sumolari.com/music-maniac-2-0-muy-pronto-en-el-app-store/background_texture2x/' title='Pantalla de carga de Music Maniac 2.0'><img width="230" height="130" src="http://sumolari.com/wp-content/uploads/2011/08/background_texture@2x-230x130.png" class="attachment-thumbnail" alt="Pantalla de carga de Music Maniac 2.0" title="Pantalla de carga de Music Maniac 2.0" /></a>

]]></content:encoded>
			<wfw:commentRss>http://sumolari.com/music-maniac-2-0-muy-pronto-en-el-app-store/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Se buscan Beta-Testers para Music Maniac 2.0</title>
		<link>http://sumolari.com/se-buscan-beta-testers-para-music-maniac-2-0/</link>
		<comments>http://sumolari.com/se-buscan-beta-testers-para-music-maniac-2-0/#comments</comments>
		<pubDate>Mon, 08 Aug 2011 16:56:49 +0000</pubDate>
		<dc:creator>Sumolari</dc:creator>
				<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[beta]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPod Touch]]></category>
		<category><![CDATA[mis creaciones]]></category>
		<category><![CDATA[Music Maniac]]></category>

		<guid isPermaLink="false">http://sumolari.com/?p=5356</guid>
		<description><![CDATA[Nota: Ya se han registrado suficientes probadores para Music Maniac 2.0. Muchas gracias a todos por mostrar vuestro interés. El desarrollo de Music Maniac 2.0 va a buen ritmo, y ya ha llegado el momento de buscar voluntarios interesados en probar la aplicación, reportar errores y hacer sugerencias para mejorar aún más esta versión. ¿Qué [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://sumolari.com/wp-content/uploads/2011/08/trofeo.png" rel="lightbox-5356"><img class="alignleft size-medium wp-image-5366 leftimage" title="Music Maniac 2.0" src="http://sumolari.com/wp-content/uploads/2011/08/trofeo-198x300.png" alt="Music Maniac 2.0" width="198" height="300" /></a></p>
<p><strong>Nota:</strong> Ya se han registrado suficientes probadores para Music Maniac 2.0. Muchas gracias a todos por mostrar vuestro interés.</p>
<p>El desarrollo de Music Maniac 2.0 va a buen ritmo, y ya ha llegado el momento de buscar voluntarios interesados en probar la aplicación, reportar errores y hacer sugerencias para mejorar aún más esta versión.</p>
<h3>¿Qué se ofrece?</h3>
<p>Colaborar en la creación de una aplicación para iOS, ser escuchado y ver las sugerencias que sean propuestas implementadas en la la versión final de la apliación. Poder sentir que se ha sido parte del proyecto y aparecer en los créditos de la aplicación, además de recibir una copia de la aplicación, incluidas todas las futuras actualizaciones de la misma.</p>
<h3>¿Qué se necesita para ser probador?</h3>
<p>Un dispositivo que soporte y tenga instalado iOS 4.0 (iPod Touch 2G/3G/4G, iPhone 3G/3GS/4 o iPad), con conexión a Internet vía Wi-Fi o 3G (imprescindible conexión a Internet en el dispositivo para poder instalar las Betas). Los dispositivos a los que se les ha realizado el Jailbreak no están excluidos, aunque no he comprobado que se puedan instalar las Betas en ellos.</p>
<h3>¿En qué consiste la aplicación?</h3>
<p>Se trata de la reescritura desde 0 de Music Maniac, el concurso musical para iOS. Describiendo a grandes rasgos la aplicación, he reescrito todo el código desde 0, he rediseñado toda la aplicación y la he reestructurado para hacerla estable, rápida y atractiva. Pero de momento quiero guardar en secreto las novedades, hasta tener lista la versión final.</p>
<h3>¿Cómo inscribirse?</h3>
<p>Ya se han registrado suficientes probadores y no se admiten más inscripciones. ¡Gracias por mostrar tu interés!</p>
]]></content:encoded>
			<wfw:commentRss>http://sumolari.com/se-buscan-beta-testers-para-music-maniac-2-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Presentando&#8230; Music Maniac</title>
		<link>http://sumolari.com/presentando-music-maniac/</link>
		<comments>http://sumolari.com/presentando-music-maniac/#comments</comments>
		<pubDate>Wed, 19 Jan 2011 21:44:32 +0000</pubDate>
		<dc:creator>Sumolari</dc:creator>
				<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPod Touch]]></category>
		<category><![CDATA[mis creaciones]]></category>
		<category><![CDATA[Music Maniac]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://sumolari.com/?p=4765</guid>
		<description><![CDATA[Vale, pensaba que no tendría tiempo y que tendría que retrasar la aplicación hasta verano, pero no, al final con un esfuerzo extra y un par de días de completa dedicación al proyecto, he podido acabar la aplicación hace apenas un semana (el resto del tiempo ha estado en revisión). Así que hoy toca presentación [...]]]></description>
			<content:encoded><![CDATA[<p>Vale, pensaba que no tendría tiempo y que tendría que retrasar la aplicación hasta verano, pero no, al final con un esfuerzo extra y un par de días de completa dedicación al proyecto, he podido acabar la aplicación hace apenas un semana (el resto del tiempo ha estado en revisión). Así que hoy toca presentación de la aplicación.</p>
<h3>¿Qué es Music Maniac?</h3>
<p><a href="http://sumolari.com/wp-content/uploads/2011/01/iTunesArtwork.png" rel="lightbox-4765"><img class="alignleft size-medium wp-image-4754" style="margin-right: 10px; margin-left: 0px;" title="Icono de Music Maniac" src="http://sumolari.com/wp-content/uploads/2011/01/iTunesArtwork-300x300.png" alt="Icono de Music Maniac" width="150" height="150" /></a>¿Recordáis el juego del concurso musical de los antiguos iPod Video? Para los que no os suene, se trataba de un juego muy sencillo en el que  sonaba durante unos segundos una canción y se te ofrecían una serie de títulos entre los que elegir. Si acertabas el título conseguías puntos y si fallabas, no. Además, cuánto más rápido acertases más puntos ganabas, así que la velocidad era importante.</p>
<p><a href="http://itunes.com/apps/musicmaniac">Music Maniac</a> es mi idea de cómo debería haber sido ese juego llevada a iOS. ¿Y qué tiene de nuevo <a href="http://itunes.com/apps/musicmaniac">Music Maniac</a>? Para empezar, más flexibilidad: se puede jugar con sólo los títulos de las canciones, con los nombres de los álbumes, con los nombres de los artistas, con las carátulas de los álbumes o con combinaciones de los anteriores. También se puede personalizar la duración de las canciones o el número de rondas.</p>
<p>Se puede jugar tanto con canciones de nuestra biblioteca de iTunes (a las que será necesario añadirle los datos del título, artista, álbum y carátula, ya que de algún sitio tiene que sacar la información sobre la canción <a href="http://itunes.com/apps/musicmaniac">Music Maniac</a>) como con las canciones más populares de la iTunes Store. Sin embargo los modos de juego son diferentes: en el modo offline podemos jugar las rondas que queramos, hasta cansarnos o hasta fallar por primera vez, mientras que en el modo online sólo podemos jugar 10 rondas (esto es porque deben descargarse las canciones y el proceso requiere tanto tiempo para descargarlas como memoria libre para almacenarlas).</p>
<p>Como aliciente al modo offline, se puede jugar con amigos con un sólo dispositivo, pasándolo al terminar cada ronda y viendo después quién ha conseguido más puntos. Pero la competición no acaba en el modo offline, ya que <a href="http://itunes.com/apps/musicmaniac">Music Maniac</a> tiene clasificaciones y logros de Game Center, con lo cual podrás ver quién conoce mejor su música y quién los éxitos de la iTunes Store. También podrás desbloquear logros acertando rondas en pocos segundos o acumulando cierta cantidad de puntos.</p>
<p><a href="http://itunes.com/apps/musicmaniac">Music Maniac</a> estará disponible en unas horas de forma gratuita en una versión Lite, en la que sólo se puede jugar en el modo offline, sin personalizar las rondas y sin enviar las puntuaciones a Game Center y en versión completa por 0.99$ (0.79€).</p>
<p>La aplicación es universal: está adaptada tanto a iPod Touch y iPhone (también a la Retina Display del iPhone 4) como a iPad. Además está traducida al inglés, catalán y español (lo siento, no hablo más idiomas, así que lo dejo en esos tres).</p>
<h3>Próximas actualizaciones</h3>
<p>Seguramente habréis visto por la App Store muchas aplicaciones que comienzan con una versión 1.0 y al cabo de un tiempo lanzan la versión 2.0 como aplicación independiente de la anterior. Esto no va a pasar con <a href="http://itunes.com/apps/musicmaniac">Music Maniac</a>. <a href="http://itunes.com/apps/musicmaniac">Music Maniac</a> sólo habrá una, se actualizará (sí, habrá versión 2.0, me gustaría desarrollarla en verano) y sus actualizaciones serán gratuitas para todo aquel que comprase la versión anterior y tendrá el mismo precio que la aplicación original para aquellos que no la comprasen.</p>
<p>También aviso que no habrá cambios de precio, ni subidas ni bajadas. La aplicación costará siempre 0.99$ (a no ser que Apple me impida ponerle ese precio), así que no os precupéis por posibles subidas de precio futuras: no las habrá.</p>
]]></content:encoded>
			<wfw:commentRss>http://sumolari.com/presentando-music-maniac/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introducción a Objective-C: El paradigma de la POO</title>
		<link>http://sumolari.com/introduccion-a-objective-c-el-paradigma-de-la-poo/</link>
		<comments>http://sumolari.com/introduccion-a-objective-c-el-paradigma-de-la-poo/#comments</comments>
		<pubDate>Fri, 07 Jan 2011 08:02:24 +0000</pubDate>
		<dc:creator>Sumolari</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Introducción a Objective-C]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPod Touch]]></category>
		<category><![CDATA[POO]]></category>
		<category><![CDATA[xcode]]></category>

		<guid isPermaLink="false">http://sumolari.com/?p=4655</guid>
		<description><![CDATA[Siguiendo con los tutoriales de Objective-C, voy a explicar el paradigma de la Programación Orientada a Objetos. En la POO de Objective-C hay 5 conceptos clave: Objeto: Los objetos son el pilar fundamental en la POO. Los objetos contienen variables, responden a métodos, tienen una dirección de memoria en la que están almacenados, pertenecen a [...]]]></description>
			<content:encoded><![CDATA[<p>Siguiendo con los tutoriales de <a href="../category/objective-c/">Objective-C</a>, voy a explicar el paradigma de la <a href="http://sumolari.com/tag/poo/">Programación Orientada a Objetos</a>. En la POO de <a href="../category/objective-c/">Objective-C</a> hay 5 conceptos clave:</p>
<ul>
<li><strong>Objeto:</strong> Los objetos son el pilar fundamental en la POO. Los objetos contienen variables, responden a métodos, tienen una dirección de memoria en la que están almacenados, pertenecen a una clase y pueden implementar protocolos.</li>
<li><strong>Clases: </strong>Un objeto pertecen a una clase, y sólo a una. Por el contrario varios objetos pueden pertenecer a la misma clase. En otros lenguajes de programación los objetos pueden heredar de varias clases, pero en <a href="../category/objective-c/">Objective-C</a> no. Cuando un objeto pertecene a una clase, el objeto contiene todas las variables de la clase, y responde a todos los métodos de instancia a los que responde la clase (veremos qué es esto más adelante). A su vez, una clase puede heredar de otra clase (de hecho lo más común es que las clases que creemos hereden de <em>NSObject</em>, al menos a nuestro nivel), cuando esto sucede, la nueva clase responde a todos los métodos a los que respondía la clase &#8220;padre&#8221; y los objetos de esta clase también tienen las variables de instancia de la clase &#8220;padre&#8221;.</li>
<li><strong>Variables de instancia:</strong> Los objetos, a pesar de ser por sí mismos variables, pueden contener a otras variables, que pueden ser variables simples como las de C (por ejemplo, números enteros o de coma flotantes) u objetos de cualquier clase. Las variables de instancia son diferentes en cada objeto, por lo que si tenemos dos objetos de la clase <em>rueda</em> y accedemos a la variable <em>presiónDeLaRueda</em>, cada uno devolverá un valor diferente de presión.</li>
<li><strong>Métodos de instancia:</strong> Los métodos de instancia son las funciones que puede ejecutar el objeto de una clase determinada. Cada clase define unos métodos de instancia diferente. Por ejemplo, la clase coche podría tener un método que fuese <em>encenderMotor</em>, al que se accedería desde un objeto determinado.</li>
<li><strong>Métodos de clase:</strong> Los métodos de clase son funciones a las que sólo se puede acceder desde la propia clase. Un método de clase típico es <em>alloc</em>, al que sólo se puede acceder desde una case, nunca desde un objeto.</li>
</ul>
<p>Puede que no os hayan quedado claros del todo los conceptos con esta introducción, los explicaré mejor un poco más adelante.</p>
<div id="attachment_4666" class="wp-caption alignleft" style="width: 240px"><a href="http://sumolari.com/wp-content/uploads/2011/01/NuevaClase.png" rel="lightbox-4655"><img class="size-thumbnail wp-image-4666" title="Creando una nueva clase" src="http://sumolari.com/wp-content/uploads/2011/01/NuevaClase-230x130.png" alt="Creando una nueva clase" width="230" height="130" /></a><p class="wp-caption-text">Creando una nueva clase</p></div>
<div id="attachment_4667" class="wp-caption alignright" style="width: 240px"><a href="http://sumolari.com/wp-content/uploads/2011/01/NuevaClasePaso2.png" rel="lightbox-4655"><img class="size-thumbnail wp-image-4667" title="Creando una nueva clase - Paso 2" src="http://sumolari.com/wp-content/uploads/2011/01/NuevaClasePaso2-230x130.png" alt="Creando una nueva clase - Paso 2" width="230" height="130" /></a><p class="wp-caption-text">Creando una nueva clase - Paso 2</p></div>
<p>En <a href="../category/objective-c/">Objective-C</a> las clases se definen mediante dos archivos: <em>NOMBRECLASE.h</em> y <em>NOMBRECLASE.m</em>. Los archivos .h contienen la interfaz de la clase y los archivos .m su implementación. La interfaz de la clase es una especie de índice: indica todas las varibles de instancia de la clase y todos los métodos a los que responde. La implementación es donde se desarrolla el código de las funciones. No es necesario dividir las clases en dos archivos, pero es altamente recomendable para hacer más claro el código.</p>
<p>Para añadir un nuevo archivo a nuestro proyecto basta con ir al menú <em>File » New file&#8230;</em> o pulsar <em>Comando</em> + <em>N</em>. En la ventana que nos aparecerá seleccionaremos <em>Mac OS X » Cocoa Class » Objective-C Class (Subclass of NSObject)</em>. En  <em>File Name</em> introduciremos el nombre de nuestra nueva clase, en este caso <em>Coche</em>, acabado en .m. También marcaremos la casilla <em>Also create &#8220;Coche.h&#8221;</em>, para mantener más limpio el código.</p>
<p>En el archivo <em>Coche.h</em> encontraremos el siguiente código:</p>
<pre class="prettyprint linenums">
#import &lt;Cocoa/Cocoa.h&gt;
@interface Coche : NSObject {
}
@end
</pre>
<p>La primera línea ya la vimos en <a href="http://sumolari.com/?p=4633">la primera parte de los tutoriales</a>, e importa el Framework <a href="http://sumolari.com/tag/cocoa/">Cocoa</a>. En la siguiente línea comienza la interfaz de la clase. Veamos su sintaxis:</p>
<ul>
<li><strong>@interface</strong>: Inicia la interfaz</li>
<li><strong>Coche</strong>: El nombre de la clase que estamos definiendo</li>
<li><strong>: </strong>: Separado entre el nombre de la clase y la clase de la que hereda.</li>
<li><strong>NSObject</strong>: La clase de la que hereda nuestra clase.</li>
<li><strong>{</strong> : Abre el bloque donde se definen las variables de instancia.</li>
<li><strong>}</strong> : Cierra este bloque.</li>
<li><strong>@end</strong>: Indica el fin de la implementación.</li>
</ul>
<p>Como podéis ver, las clases pueden ser &#8220;hijas&#8221; de otras clases, y es algo realmente común. De hecho es muy conveniente que nuestras clases sean hijas de al menos <em>NSObject</em>. La clase <em>NSObject</em> es la clase básica e incluye las funciones esenciales de gestión de memoria (la veremos más tarde), entre otras cosas.</p>
<p>Si nuestra clase es hija de una clase que es hija de <em>NSObject</em>, esta nueva clase también tendrá acceso a los métodos de la clase <em>NSObject</em>.</p>
<p>Ahora bien, imaginemos que queremos que queremos que nuestra clase tenga alguna variable de instancia, como por ejemplo, el color del vehículo y el número de puertas. Definiremos dos variables: <em>color</em> y <em>numPuertas</em>. La primera, color, será un objeto de clase <em>NSString</em> (cadena de texto). La segunda, <em>numPuertas</em>, será una variable de tipo <em>NSUInteger</em> (a nuestro nivel, equivalente a un <em>unsigned</em> <em>int</em> de C, o en palabras llanas, un número entero sin signo).</p>
<pre class="prettyprint linenums">
#import &lt;Cocoa/Cocoa.h&gt;
@interface Coche : NSObject {
 NSString    *color;
 NSUInteger    numPuertas;
}
@end
</pre>
<p>Fijáos en la sintaxis para definir varibles de instancia:</p>
<pre class="prettyprint linenums">
NOMBRE_DE_LA_CLASE_DEL_OBJETO *NOMBRE_DEL_OBJETO;
NOMBRE_DEL_TIPO_DE_VARIABLE NOMBRE_DE_LA_VARIABLE;
</pre>
<p>Al defnir un objeto <strong>siempre</strong> antepondremos un asterisco (&#8220;*&#8221;) al nombre del objeto.</p>
<p>Y ahora, ¿cómo obtenemos el valor de estas variables? Pues bien, tendremos que crear un método de instancia para asignar este valor. Los métodos se definen entre el corchete de cierre (&#8220;}&#8221;) y el <em>@end</em>. Creemos dos métodos de instancia: <em>getColor</em> y <em>getNumPuertas</em>. Creemos otro más llamado <em>imprimirDetalles</em> que muestre en la consola los valores devueltos por <em>getColor</em> y <em>getNumPuertas</em>.</p>
<pre class="prettyprint linenums">
#import &lt;Cocoa/Cocoa.h&gt;
@interface Coche : NSObject {
 NSString    *color;
 NSUInteger    numPuertas;
}
- (NSString *)getColor;
- (NSUInteger)getNumPuertas;
- (void)imprimirDetalles;
@end
</pre>
<p>Fijáos de nuevo en la sintaxis:</p>
<pre class="prettyprint linenums">
- (CLASE_DEL_OBJETO_QUE_VAMOS_A_DEVOLVER *)NOMBRE_DE_LA_FUNCION;
- (TIPO_DE_LA_VARIABLE_QUE_SE_DEVOLVERA)NOMBRE_DE_LA_FUNCION;
- (VOID)NOMBRE_DE_LA_FUNCION_QUE_NO_DEVUELVE_NADA;
</pre>
<p>Como antes, cuando un método devuelve un objeto, se añade un asterisco al nombre de la clase del objeto que se devolverá. Cuando no es un objeto, no es necesario añadir el asterisco. Cuando una función no devuelve nada, se utiliza el valor <em>void</em> para indicárselo al compilador.</p>
<p>El guión (&#8220;-&#8221;) que precede a los métodos sirve para indicar que se trata de métodos de instancia. Si se tratase de métodos de clase (que veremos más adelante), estarían precedidos por un sigo +.</p>
<p>Pero aún nos faltan dos métodos para establecer el valor de las dos variables de instancias. Para ello definiremos dos métodos llamados <em>setColor</em> y <em>setNumPuertas</em> que acepten un parámetro que será el nuevo valor.</p>
<pre class="prettyprint linenums">
#import &lt;Cocoa/Cocoa.h&gt;
@interface Coche : NSObject {
 NSString    *color;
 NSUInteger    numPuertas;
}
- (NSString *)getColor;
- (NSUInteger)getNumPuertas;
- (void)imprimirDetalles;
- (void)setColor: (NSString *)nuevoColor;
- (void)setNumPuertas: (NSUInteger)nuevoNumPuertas;
@end
</pre>
<p>Analicemos la sintaxis de estas funciones. Como podéis ver, ninguna de las dos devuelve ningún valor, luego en el primer paréntesis escribiremos <em>void</em>. Los nombres están claros, pero al final de estos hay dos puntos (&#8220;:&#8221;). Esto indica que a continuación se encuentra un parámetro. Los parámetros tienen dos partes: la clase del objeto que es el parámetro o el tipo de la variable que es el parámetro y el nombre del mismo. La sintaxis es igual que la del tipo de valor que devuelve la función: El tipo de variable o la clase de objeto entre paréntesis (si es un objeto el parámetro se añade un asterisco) y a continuación el nombre del mismo. Las funciones pueden admitir varios parámetros, y pueden haber funciones con el mismo nombre pero diferentes parámetros. A continuación tenéis un ejemplo.</p>
<pre class="prettyprint linenums">
- (void)miFuncion;
- (void)miFuncionConUnParametro: (NSUInteger)miParametro;
- (NSString *)miFuncionConUnParametro: (NSUInteger)miParametro queAdemasDevuelveUnaCadenaDeTextoYRequiereOtroParametro: (NSUInteger)elSegundo;
</pre>
<p>Esto presenta un problema: ¿Cómo se llaman las funciones, si puede haber dos iguales hasta el primer parámetro? Pues bien, las funciones anteriores se llamarían así:</p>
<pre class="prettyprint linenums">
miFuncion
miFuncionConUnParametro:
miFuncionConUnParametro:queAdemasDevuelveUnaCadenaDeTextoYRequiereOtroParametro:
</pre>
<p>De este modo no son iguales los nombres a pesar de ser bastante parecidos (al menos en principio).</p>
<p>Con esto hemos creado la interfaz de nuestra clase: el índice de variables y métodos a los que responde. Sin embargo aún tenemos que escribir el código de estas funciones, así que vayamos al archivo <em>Coche.m</em> y comencemos a implementarlas. En el archivo .m veremos el siguiente código:</p>
<pre class="prettyprint linenums">
#import &quot;Coche.h&quot;
@implementation Coche
@end
</pre>
<p>Os suena, ¿verdad? Como en el caso anterior, vemos como se importa un archivo, en este caso la interfaz de nuestra clase. También vemos como se inicia la implementación con un código similar a la interfaz. Como podéis suponer, entre <em>@implementation Coche</em> y <em>@end</em> es donde escribiremos nuestras funciones.</p>
<p>Antes de implementar nuestras funciones, añadid el siguiente código después de <em>@implementation Coche</em>. Se trata de un método para la gestión de memoria que veremos en otro tutorial. Así de forma rápida, el método dealloc se llama cuando un objeto va a ser eliminado de la memoria. Los objetos tienen un contador interno que se aumenta con el método retain y se disminuye con el método release. Cuando el contador llega a 0, se llama automáticamente al método dealloc y se elimina el objeto de la memoria. De momento basta con que lo copiéis sin preguntar, ya lo explicaré más adelante.</p>
<pre class="prettyprint linenums">
- (void)dealloc
{
 [color release];
 [super dealloc];
}
</pre>
<p>Aprovechando este código os explicaré cómo se sobreescriben funciones ya existentes en la clase padre. Como he comentado, una clase que hereda de otra recibe las funciones de la clase padre, pero ¿qué sucede si queremos que en la clase hija la función heredada sea diferente? Pues nada, escribimos la nueva función como cualquier otra. La sintaxis es sencilla:</p>
<pre class="prettyprint linenums">
- (TIPO_DE_VALOR_QUE_SE_DEVUELVE)NOMBRE_DE_LA_FUNCION
{
// Código de la función
}
</pre>
<p>¿Qué ocurre si queremos que además de ejecutarse nuestro código se ejecute también el método (por si no os habéis dado cuenta, utilizo método y función para referirme a lo mismo, tal vez no es lo más correcto, pero estoy más acostumbrado a hablar de función y no de método, así que me sale sin pensar) de la clase padre que estamos sobreescribiendo? Pues añadimos<em> [super NOMBRE_DE_LA_FUNCION]; </em>en el lugar en el que queramos que se ejecute.</p>
<pre class="prettyprint linenums">
- (TIPO_DE_VALOR_QUE_SE_DEVUELVE)NOMBRE_DE_LA_FUNCION
 {
// Podemos ejecutar el método de la clase padre antes que nuestro código
[super NOMBRE_DE_LA_FUNCION];
// Código de la función
// O después
[super NOMBRE_DE_LA_FUNCION];
}
</pre>
<p>Veamos ahora cómo quedaría la implementación de nuestra clase tras añadir todos los métodos que hemos definido en la interfaz:</p>
<pre class="prettyprint linenums">
#import &quot;Coche.h&quot;
@implementation Coche
- (void)dealloc
{
 [color release];
 [super dealloc];
}
- (NSString *)getColor
{
}
- (NSUInteger)getNumPuertas
{
}
- (void)imprimirDetalles
{
}
- (void)setColor: (NSString *)colorNuevo
{
}
- (void)setNumPuertas: (NSUInteger)nuevoNumeroDePuertas
{
}
@end
</pre>
<p>Fijáos en que he cambiado el nombre de las variables de los argumentos de las dos últimas funciones. Las variables de los argumentos no tienen por qué tener el mismo nombre en la interfaz y en la implementación, pero tampoco pasa nada porque tengan el mismo nombre.</p>
<p>La función <em>getColor</em> y <em>getNumPuertas </em>tan sólo devuelven el valor de las variables correspondientes, así que añadiremos <em>return VARIABLE; </em>para que el método devuelva el valor de la variable. <em>return </em>no requiere asterisco si se devuelven objetos, se usa exactamente igual con objetos que con variables sencillas.</p>
<p>En la función <em>imprimirDetalles</em> utilizaremos la función <em>NSLog</em> para imprimir en la consola los valores de las variables. La función <em>NSLog</em> admite varios parámetros. El primero siempre es una cadena de texto (<em>@&#8221;"</em>), pero esta cadena admite combinaciones de caracteres específicas que indican que se deben reemplazar por otro valor. Así un <em>%d </em>se reemplazará por un número entero, un <em>%f</em> por un número decimal y un <em>%@</em> por otra cadena de texto (se puede usar tranquilamente un objeto también, lo veremos más adelante). Si usamos estas combinaciones, tras la cadena de caracteres, y separadas por comas (&#8220;,&#8221;) debemos introducir las variables o los objetos que reemplazarán las combinaciones. A continuación tenéis las tres funciones que hemos explicado:</p>
<pre class="prettyprint linenums">
- (NSString *)getColor
{
 return color;
}
- (NSUInteger)getNumPuertas
{
 return numPuertas;
}
- (void)imprimirDetalles
{
 NSLog(@&quot;Este coche es de color %@ y tiene %d puertas&quot;, [self getColor], [self getNumPuertas]);
}
</pre>
<p>Fijáos en la última función, concretamente en <em>[self getColor]</em> y <em>[self getNumPuertas]</em>. Esta es la sintaxis para enviar mensajes a los objetos. Enviar un mensaje a un objeto es, básicamente, pedirle a un objeto que ejecute el método con ese nombre. Así, cuando escribimos <em>[self funcion]</em> le pedimos al objeto <em>self</em> que ejecute el método <em>funcion</em>. El objeto <em>self</em> es un objeto especial y hace referencia al objeto actual, de modo que lo que hacemos en esta última función es pedirle al objeto de clase <em>Coche</em> que ejecuta el método <em>imprimirDetalles</em> que ejecute el método <em>getColor </em>y <em>getNumPuertas</em>.</p>
<p>Las funciones <em>setColor</em> y <em>setNumPuertas</em> son bastante sencillas. Simplemente asignaremos (mediante &#8220;=&#8221;) el valor que se pasa como parámetro (o argumento) a la variable correspondiente. Aquí los tenéis completos:</p>
<pre class="prettyprint linenums">
- (void)setColor: (NSString *)colorNuevo
{
 color = colorNuevo;
}
- (void)setNumPuertas: (NSUInteger)nuevoNumeroDePuertas
{
 numPuertas = nuevoNumeroDePuertas;
}
</pre>
<p>Y este es el aspecto final de la implementación de nuestra clase <em>Coche</em>:</p>
<pre class="prettyprint linenums">
#import &quot;Coche.h&quot;
@implementation Coche
- (void)dealloc
{
 [color release];
 [super dealloc];
}
- (NSString *)getColor
{
 return color;
}
- (NSUInteger)getNumPuertas
{
 return numPuertas;
}
- (void)imprimirDetalles
{
 NSLog(@&quot;Este coche es de color %@ y tiene %d puertas&quot;, [self getColor], [self getNumPuertas]);
}
- (void)setColor: (NSString *)colorNuevo
{
 color = colorNuevo;
}
- (void)setNumPuertas: (NSUInteger)nuevoNumeroDePuertas
{
 numPuertas = nuevoNumeroDePuertas;
}
@end
</pre>
<p>Ahora modificaremos nuestra aplicación para que cree un objeto de clase coche, establezca su color en azul y su número de puertas en 5 y que a continuación imprima en la consola la información sobre el mismo.</p>
<p>Vamos al archivo <em>NOMBREPROYECTO.m</em>, que debería tener el siguiente código:</p>
<pre class="prettyprint linenums">
#import &lt;Foundation/Foundation.h&gt;
int main (int argc, const char * argv[]) {
 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
 // insert code here&#8230;
 NSLog(@&quot;Hello, World!&quot;);
 [pool drain];
 return 0;
}
</pre>
<p>E importamos el archivo <em>Coche.h</em> justo después de importarse Foundation:</p>
<pre class="prettyprint linenums">#import &quot;Coche.h&quot;</pre>
<p>A continuación añadimos, entre <em>NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; </em>y <em>[pool drain];</em>:</p>
<pre class="prettyprint linenums">
Coche *miCoche = [[Coche alloc] init];
 [miCoche setColor:@&quot;Azul&quot;];
 [miCoche setNumPuertas:5];
 [miCoche imprimirDetalles];
 [miCoche release];
</pre>
<p>Vayamos línea a línea:</p>
<pre class="prettyprint linenums">Coche *miCoche = [[Coche alloc] init];</pre>
<p>En esta línea creamos el objeto <em>miCoche</em>, de clase <em>Coche</em>. Fijáos como se le envía a  la clase <em>Coche</em> el mensaje <em>alloc</em> y al objeto resultante de ese mensaje se le envía el mensaje <em>init</em>. Los mensajes se pueden encadenar tanto como se quiera, aunque esto hace más complicado de leer el código, así que no es muy recomendable.</p>
<pre class="prettyprint linenums">
[miCoche setColor:@&quot;Azul&quot;];
[miCoche setNumPuertas:5];
</pre>
<p>En estas dos líneas se envía el método <em>setColor:</em> y <em>setNumPuertas:</em> al objeto <em>miCoche</em>, con el parámetro <em>@&#8221;Azul&#8221;</em> como nuevo color y <em>5</em> como número de puertas.</p>
<pre class="prettyprint linenums">
[miCoche imprimirDetalles];
</pre>
<p>En esta línea se le manda al objeto el mensaje <em>imprimirDetalles</em>, lo que hará que muestre por terminal los valores de las variables.</p>
<pre class="prettyprint linenums">
 [miCoche release];
</pre>
<p>Por último esta línea elimina el objeto. En realidad es algo más complejo, y lo explicaré más adelante en otro tutorial. De momento con saber que se elimina el objeto nos vale.</p>
<p>El código resultante de<em> MIPROYECTO.m</em> será:</p>
<pre class="prettyprint linenums">
#import &lt;Foundation/Foundation.h&gt;
#import &quot;Coche.h&quot;
int main (int argc, const char * argv[]) {
 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
 // insert code here&#8230;
 NSLog(@&quot;Hello, World!&quot;);
 Coche *miCoche = [[Coche alloc] init];
 [miCoche setColor:@&quot;Azul&quot;];
 [miCoche setNumPuertas:5];
 [miCoche imprimirDetalles];
 [miCoche release];
 [pool drain];
 return 0;
}
</pre>
<p>Y si compilamos y ejecutamos la aplicación veremos el siguiente resultado:</p>
<p><a href="http://sumolari.com/wp-content/uploads/2011/01/Resultado.png" rel="lightbox-4655"><img class="aligncenter size-full wp-image-4668" title="Resultado de la segunda aplicación" src="http://sumolari.com/wp-content/uploads/2011/01/Resultado.png" alt="Resultado de la segunda aplicación" width="797" height="483" /></a></p>
<p>Esto no está mal, pero, ¿para qué llamar a dos métodos para establecer las variables y otro más para iniciar el objeto (<em>init</em>)? ¿No podríamos juntar esos tres métodos en uno? Sí, podemos. Vayamos al archivo <em>Coche.h</em> y añadamos el siguiente método:</p>
<pre class="prettyprint linenums">- (Coche *)initWithColor: (NSString *)nuevoColor andNumPuertas: (NSUInteger)nuevoNumPuertas;</pre>
<p>Quedando así la interfaz:</p>
<pre class="prettyprint linenums">
#import &lt;Cocoa/Cocoa.h&gt;
@interface Coche : NSObject {
 NSString    *color;
 NSUInteger    numPuertas;
}
- (Coche *)initWithColor: (NSString *)nuevoColor andNumPuertas: (NSUInteger)nuevoNumPuertas;
- (NSString *)getColor;
- (NSUInteger)getNumPuertas;
- (void)imprimirDetalles;
- (void)setColor: (NSString *)nuevoColor;
- (void)setNumPuertas: (NSUInteger)nuevoNumPuertas;
@end
</pre>
<p>En la implementación añadiremos lo siguiente:</p>
<pre class="prettyprint linenums">
- (Coche *)initWithColor: (NSString *)nuevoColor andNumPuertas: (NSUInteger)nuevoNumPuertas
{
 if (self = [super init])
 {
 [self setColor:nuevoColor];
 [self setNumPuertas:nuevoNumPuertas];
 }
 return self;
}
</pre>
<p>Analicemos este código. La primera línea de la función, <em>if (self = [super init])</em> sirve para comprobar que el objeto se ha creado correctamente. Es posible (aunque raro) que por algún motivo el objeto no pueda crearse correctamente (por ejemplo, por falta de memoria), así que en caso de que no se cree correctamente, no estableceremos el valor de ninguna variable (pues de otra manera haríamos fallar la aplicación). Dentro de la condición se envía los mensajes que ya conocemos al objeto y finalmente se devuelve el objeto <em>self</em>. Como podéis ver, esta función devuelve un objeto de clase <em>Coche</em>.</p>
<p>El código final de nuestra implementación será:</p>
<pre class="prettyprint linenums">
#import &quot;Coche.h&quot;
@implementation Coche
- (Coche *)initWithColor: (NSString *)nuevoColor andNumPuertas: (NSUInteger)nuevoNumPuertas
{
 if (self = [super init])
 {
 [self setColor:nuevoColor];
 [self setNumPuertas:nuevoNumPuertas];
 }
 return self;
}
- (void)dealloc
{
 [color release];
 [super dealloc];
}
- (NSString *)getColor
{
 return color;
}
- (NSUInteger)getNumPuertas
{
 return numPuertas;
}
- (void)imprimirDetalles
{
 NSLog(@&quot;Este coche es de color %@ y tiene %d puertas&quot;, [self getColor], [self getNumPuertas]);
}
- (void)setColor: (NSString *)colorNuevo
{
 color = colorNuevo;
}
- (void)setNumPuertas: (NSUInteger)nuevoNumeroDePuertas
{
 numPuertas = nuevoNumeroDePuertas;
}
@end
</pre>
<p>¿Cómo aplicamos estos cambios a nuestra aplicación? Vayamos al archivo <em>NOMBREPROYECTO.m</em> y reemplacemos el siguiente código:</p>
<pre class="prettyprint linenums">
Coche *miCoche = [[Coche alloc] init];
 [miCoche setColor:@&quot;Azul&quot;];
 [miCoche setNumPuertas:5];
</pre>
<p>Por este otro:</p>
<pre class="prettyprint linenums">Coche *miCoche = [[Coche alloc] initWithColor:@&quot;Azul&quot; andNumPuertas:5];</pre>
<p>Como veis, hemos convertido tres líneas de código en sólo una, y el resultado es idéntico.</p>
<p>Esto tan sólo es una breve introducción al paradigma de la programación orientada a objetos. Espero que os haya aclarado un poco los conceptos. En los próximos tutoriales iremos viendo más características de la POO en <a href="../category/objective-c/">Objective-C</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://sumolari.com/introduccion-a-objective-c-el-paradigma-de-la-poo/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Introducción a Objective-C: Nuestra primera aplicación</title>
		<link>http://sumolari.com/introduccion-a-objective-c-nuestra-primera-aplicacion/</link>
		<comments>http://sumolari.com/introduccion-a-objective-c-nuestra-primera-aplicacion/#comments</comments>
		<pubDate>Sat, 01 Jan 2011 18:46:06 +0000</pubDate>
		<dc:creator>Sumolari</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Introducción a Objective-C]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPod Touch]]></category>
		<category><![CDATA[POO]]></category>
		<category><![CDATA[xcode]]></category>

		<guid isPermaLink="false">http://sumolari.com/?p=4633</guid>
		<description><![CDATA[¿Qué es Objective-C? ¿Qué es Cocoa? ¿Qué es la Programacion Orientada a Objetos (POO)? ¿Y la arquitectura de Modelo Vista Controlador (MVC)? Dar los primeros pasos en la programación para Mac OS X, iPhone y iPad puede ser algo complicado si no sabes dónde buscar la información (y aún más difícil si no sabes inglés, [...]]]></description>
			<content:encoded><![CDATA[<p>¿Qué es <a href="http://sumolari.com/category/objective-c/">Objective-C</a>? ¿Qué es <a href="http://sumolari.com/tag/cocoa/">Cocoa</a>? ¿Qué es la <a href="http://sumolari.com/tag/poo">Programacion Orientada a Objetos</a> (POO)? ¿Y la arquitectura de Modelo Vista Controlador (MVC)? Dar los primeros pasos en la programación para <a href="http://sumolari.com/category/mac-os-x/">Mac OS X</a>, <a href="http://sumolari.com/tag/iphone/">iPhone</a> y <a href="http://sumolari.com/tag/ipad">iPad</a> puede ser algo complicado si no sabes dónde buscar la información (y aún más difícil si no sabes inglés, imprescindible en el mundo de la informática). Hace año y medio, cuando yo comencé a aprender a programar para el <a href="../tag/iphone/">iPhone</a> (no tengáis prisa, sigo haciéndolo y me queda para mucho rato), el primer problema que tuve fue encontrar fuentes de información para dar los primeros pasos, así que he decido escribir esta serie de tutoriales para facilitar la tarea a aquellos que, como yo, quieran aprender a programar para el <a href="../tag/iphone/">iPhone</a> (extensible a <a href="../category/mac-os-x/">Mac OS X</a> y <a href="../tag/ipad">iPad</a>). Tampoco esperéis ser unos maestros de <a href="../category/objective-c/">Objective-C</a> después de haber leído esta serie de tutoriales (que iré publicando cuando vaya teniendo tiempo para redactarlos), pues mis conocimientos son fruto del autodidactismo y seguramente no utilice los términos adecuados ni profundice del todo en los conceptos que trate. Sin embargo espero que os sirva para dar el primer paso y poder continuar después con textos mejor redactados, más exactos y más profundos.<span id="more-4633"></span></p>
<p>En este serie de tutoriales voy a suponer que se tienen unos conocimientos básicos de programación, que se entiende el significado de términos como &#8220;código fuente&#8221;, &#8220;función&#8221; o &#8220;variable&#8221;. Cualquiera que haya programado antes en cualquier lenguaje de programación conocerá su significado. El único término nuevo que puede que no conozcan aquellos que sólo han programado en lenguajes interpretados (como <a href="http://sumolari.com/category/php">PHP</a>) es el de &#8220;compilar&#8221;. Para simplificar, podríamos decir que compilar un programa es traducir el código que nosotros escribimos en un código que la máquina pueda entender.</p>
<p>Ahora bien, queda diferenciar cuatro conceptos:</p>
<ul>
<li><strong>Objective-C: </strong>Es el lenguaje de programación que se suele usar en <a href="../category/mac-os-x/">Mac OS X</a>. Digo se suele usar porque también se pueden programar aplicaciones en C, C++, Objective-C++, etc.</li>
<li><strong>Cocoa:</strong> Es un Framework, un conjunto de funciones que facilitan la tarea al programador. Tareas como modificar una cadena de caracteres, descargar archivos de Internet, gestionar matrices o la memoria se hacen mucho más sencillas con este Framework. De hecho programar en <a href="../category/objective-c/">Objective-C</a> sin usar <a href="../tag/cocoa/">Cocoa</a> es algo poco usual y no lo veremos en este tutorial (yo, por ejemplo, no he programado nada en <a href="../category/objective-c/">Objective-C</a> sin tener vinculado <a href="../tag/cocoa/">Cocoa</a>). Cocoa Touch es la versión de <a href="../tag/cocoa/">Cocoa</a> para <a href="../tag/iphone/">iPhone</a>, <a href="http://sumolari.com/tag/ipod-touch/">iPod Touch</a> y <a href="../tag/ipad">iPad</a>.</li>
<li><strong>Programación Orientada a Objetos: </strong>Es un paradigma de programación del que hablaremos más adelante. <a href="../category/objective-c/">Objective-C</a> es un lenguaje de Programación Orientada a Objetos. En <a href="../category/objective-c/">Objective-C</a> prácticamente todo es un objeto, cosa que veremos más adelante.</li>
<li><strong>Modelo Vista y Controlador:</strong> Es una arquitectura en la que se separa la parte lógica de la aplicación de la interfaz y de los datos que se gestionan. Realmente no es imprescindible hacer uso de esta arquitectura, pero hacerlo es una buena idea, simplifica la tarea y hace las aplicación más fáciles de extender. En nuestros primeros pasos no haremos uso de esta arquitectura, pero a medida que vayamos avanzando iremos viendo en qué consiste y qué beneficios aporta.</li>
</ul>
<p><a href="http://sumolari.com/wp-content/uploads/2010/12/Captura-de-pantalla-2010-12-31-a-las-23.07.24.png" rel="lightbox-4633"><img class="alignnone size-large wp-image-4637" title="Menú de la aplicación de Xcode" src="http://sumolari.com/wp-content/uploads/2010/12/Captura-de-pantalla-2010-12-31-a-las-23.07.24-848x14.png" alt="Menú de la aplicación de Xcode" width="848" height="14" /></a></p>
<div id="attachment_4636" class="wp-caption alignright" style="width: 240px"><a href="http://sumolari.com/wp-content/uploads/2010/12/Captura-de-pantalla-2010-12-31-a-las-23.07.17.png" rel="lightbox-4633"><img class="size-thumbnail wp-image-4636" title="Menú Archivo" src="http://sumolari.com/wp-content/uploads/2010/12/Captura-de-pantalla-2010-12-31-a-las-23.07.17-230x130.png" alt="Menú Archivo" width="230" height="130" /></a><p class="wp-caption-text">Menú Archivo</p></div>
<div id="attachment_4634" class="wp-caption alignleft" style="width: 240px"><a href="http://sumolari.com/wp-content/uploads/2010/12/Captura-de-pantalla-2010-12-31-a-las-22.59.54.png" rel="lightbox-4633"><img class="size-thumbnail wp-image-4634" title="Plantillas del proyecto de Xcode" src="http://sumolari.com/wp-content/uploads/2010/12/Captura-de-pantalla-2010-12-31-a-las-22.59.54-230x130.png" alt="Plantillas del proyecto de Xcode" width="230" height="130" /></a><p class="wp-caption-text">Plantillas del proyecto de Xcode</p></div>
<p>Dicho esto, pasemos a presentar a los sospechosos habituales. Cuando programemos en <a href="../category/mac-os-x/">Mac OS X</a> trabajeros con <a href="../tag/xcode/">Xcode</a>, el Entorno de Desarrollo Integrado de Apple. <a href="http://sumolari.com/tag/xcode/">Xcode</a> viene en los discos de instalación de <a href="../category/mac-os-x/">Mac OS X</a>, y se puede descargar de forma gratuita (previo registro) <a href="http://developer.apple.com/technologies/xcode.html">desde la web de Apple</a>. Durante estos tutoriales usaremos como plantilla del proyecto la plantilla de aplicación para la línea de comandos, ya que así evitamos tener que preocuparnos de elementos más complejos como la interfaz gráfica de la aplicación. Crear un nuevo proyecto es sencillo: Basta con ir al menú <em>File » New project&#8230;</em> . Aparecerá una ventana en la que podremos seleccionar la plantilla para el proyecto que vamos a crear. En estos tutoriales elegiremos la plantilla <em>Mac OS X » Application » Command Line Tool</em>.</p>
<p><a href="http://sumolari.com/wp-content/uploads/2010/12/Captura-de-pantalla-2010-12-31-a-las-23.00.20.png" rel="lightbox-4633"><img class="size-thumbnail wp-image-4635 alignleft leftimage" title="Nuestro primer proyecto" src="http://sumolari.com/wp-content/uploads/2010/12/Captura-de-pantalla-2010-12-31-a-las-23.00.20-230x130.png" alt="Nuestro primer proyecto" width="121" height="68" /></a> Veremos una ventana como la que tenéis en la izquierda. En la parte izquierda de la ventana tenemos acceso a los archivos del proyecto. De los archivos que se pueden ver en la imagen, el que nos interesa ahora es NOMBREPROYECTO.m. Veréis un código como el siguiente:</p>
<pre class="prettyprint linenums">
#import &lt;Foundation/Foundation.h&gt;
int main (int argc, const char * argv[]) {
 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
 // insert code here&#8230;
 NSLog(@&quot;Hello, World!&quot;);
 [pool drain];
 return 0;
}
</pre>Vayamos línea a línea. La primera línea importa el Framework <em>Foundation</em> en nuestra aplicación. El Framework <a href="../tag/cocoa/">Cocoa</a> está compuesto por dos Frameworks diferentes: <em>Foundation</em> y <em>Application Kit</em>. <em>Foundation</em> incluye las funciones que trabajan en la trastienda sin que el usuario lo vea, pero que al desarrollador le vienen fenomenal. Por su parte, <em>Application Kit</em> se encarga de la parte visual de la aplicación (como comprenderéis, esto es una versión resumida de lo que realmente hacen, así que tampoco lo toméis al pie de la letra). Si os fijáis en la sintaxis, podéis ver tres partes: La almohadilla (#), los signos menor y mayor que (<>) y el nombre del Framework.</p>
<p>La almohadilla introduce instrucciones para el preprocesador. Las que más comúnmente se usan con <em>#import</em> y <em>#define</em>. <em>#import</em> incluye otros archivos y Frameworks en el archivo actual. <em>#define </em>permite declarar constantes. Las constantes sirven para definir un valor que es fijo en toda la aplicación, pero que si nos interesa cambiar, podemos hacerlo modificando una sóla línea. Imaginad, por ejemplo, que queremos definir nuestra edad. Si sólo la ponemos en una línea no hay ningún problema, pero ¿y si la incluímos en 5, 10, 200 ó 5000 líneas? Es una faena tener que ir buscando cada lugar en el que hemos puesto ese valor. Con las constantes basta con poner la constante en lugar de nuestra edad, y definir el valor de la constante con el valor de nuestra edad. Cuando queramos modificar el valor de nuestra edad, sólo lo cambiaremos una vez, en lugar de tantas veces como uso se haga de ella.</p>
<p>A la hora de importar archivos, hay dos tipos de archivos que podemos importar: Frameworks del sistema y otros archivos de nuestro proyecto. Cuando importamos Frameworks del sistema, usamos los signos mayor e igual que (<>). Si importamos archivos de nuestro proyecto, usamos comillas (&#8220;).</p>
<p>La siguiente línea define la función main. La función main es la función principal de la aplicación, la única función que <strong>siempre</strong> se ejecuta. La estructura de la función es la misma estructura que C, sin embargo en <a href="../category/objective-c/">Objective-C</a> la mayoría de las funciones (métodos) se definen con una sintaxis diferente, así que no me voy a parar a explicarla.</p>
<p>Centrémonos en el siguiente bloque:</p>
<p><pre class="prettyprint linenums">
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
 // insert code here&#8230;
 NSLog(@&quot;Hello, World!&quot;);
 [pool drain];
 return 0;
</pre>En este bloque vemos unas cuantas líneas curiosas. Vayamos a la primera:</p>
<p><pre class="prettyprint linenums">
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
</pre>Esta es la sintaxis para crear un objeto en <a href="../category/objective-c/">Objective-C</a>. El primer <em>NSAutoreleasePool</em> es la clase del objeto que vamos a crear. El asterisco (&#8220;*&#8221;) indica que a continuación se presenta un objeto (lo veremos más adelante). <em>pool</em> es el nombre de la variable (objeto) que estamos creando. La segunda parte del código: <em>[[NSAutoreselasePool alloc] init]</em>, se trata de un mensaje enviado a una clase, que es a su vez el valor del objeto que estamos creando. Los mensajes se pueden enviar tanto a clases como a objetos, lo veremos más adelante, no os preocupéis.</p>
<p>A continuación vemos una línea que comienza con dos barras (//). Cuando una línea va introducida por dos barras, se trata de un comentario. Los comentarios se eliminan de la aplicación al compilarla: son sólo una ayuda al programador durante la programación, para saber qué hace cada cosa o para qué se usa una variable. Los comentarios también se pueden introducir con /* Comentario */.</p>
<p>[c]</p>
<p>// Con dos barras el comentario ocupa toda la línea</p>
<p>/* Con barra y asterisco es necesario terminar el comentario con asterisco barra, así que el comentario</p>
<p>aún no ha acabado en esta línea,</p>
<p>sino que acaba en esta otra */</p>
<p>[/c]</p>
<p>La siguiente línea es la llamada a una función.</p>
<pre class="prettyprint linenums">
NSLog(@&quot;Hello, World!&quot;);
</pre>
<p><a href="../category/objective-c/">Objective-C</a> es un superconjunto de C, con lo cual comparte algunas características con el anterior. Esta forma de llamar a la función es típica de C. Las funciones tienen dos partes: La primera (<em>NSLog</em> en este caso) es el nombre de la función. La segunda, que se encuentra entre paréntesis (&#8220;()&#8221;), son los argumentos de la función. En este caso, el argumento es: <em>@&#8221;Hello, World!&#8221;</em>. Cuando unas comillas están precedidas por un arroba (@), sabemos que se trata de una cadena de texto, un objeto de clase <em>NSString</em> (lo trataremos más adelante). Tras los paréntesis encontramos un punto y coma (;). Esto indica el final de una instrucción (todas las instrucciones en C y <a href="../category/objective-c/">Objective-C</a> van sucedidas por un punto y coma (;), a excepción de aquellas instrucciones que son argumentos de funciones (como el <em>@&#8221;Hello, World!&#8221;</em>)  o de mensajes (lo veremos más adelante).</p>
<p>La función <em>NSLog() </em>muestra el texto que se le envía como argumento en la terminal. Durante el desarrollo de la aplicaciones es una función muy útil, como veréis a medida que avancemos en los tutoriales, para saber el valor de una variable en cada momento o para recibir un aviso cuando se ejecuta un método.</p>
<pre class="prettyprint linenums">
[pool drain];
</pre>
<p>Esta línea le envía el mensaje <em>drain</em> al objeto <em>pool</em>, creado anteriormente. Veremos más adelante todo esto, en otro tutorial de esta serie. A continuación vemos:</p>
<pre class="prettyprint linenums">
return 0;
</pre>
<p>Esta línea le devuelve el valor 0 al Sistema Operativo. La función <em>main</em> tiene que devolver un valor que indica si la aplicación se ha ejecutado correctamente o si ha encontrado errores durante su ejecución. El valor 0 indica que todo ha ido bien.</p>
<div id="attachment_4643" class="wp-caption alignleft" style="width: 240px"><a href="http://sumolari.com/wp-content/uploads/2011/01/Captura-de-pantalla-2011-01-01-a-las-00.04.38.png" rel="lightbox-4633"><img class="size-thumbnail wp-image-4643" title="Nuestra primera aplicación ejecutándose" src="http://sumolari.com/wp-content/uploads/2011/01/Captura-de-pantalla-2011-01-01-a-las-00.04.38-230x130.png" alt="Nuestra primera aplicación ejecutándose" width="230" height="130" /></a><p class="wp-caption-text">Nuestra primera aplicación ejecutándose</p></div>
<p>Para probar la aplicación hay que pulsar el botón <em>Build and Run</em>, o pulsar <em>Comando</em> + <em>Enter</em>. La aplicación se compilará y se ejecutará. Como la aplicación no tiene interfaz, se ejecutará sin ver nosotros nada. Para poder ver el texto enviado por nuestra aplicación (<em>Hello, World!</em>), tenemos que mostrar la consola (Menú <em>Run » Console</em> o <em>Comando</em> + <em>Mayus</em> + <em>R</em>). Veremos algo como la imagen de la izquierda.</p>
<p>Y esto es todo por este primer tutorial. En los próximos comenzaré a tratar la Programación Orientada a Objetos en <a href="../category/objective-c/">Objective-C</a> e introduciré los conceptos de clase, objeto y método.</p>
]]></content:encoded>
			<wfw:commentRss>http://sumolari.com/introduccion-a-objective-c-nuestra-primera-aplicacion/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Hasta luego y gracias por el pescado</title>
		<link>http://sumolari.com/hasta-luego-y-gracias-por-el-pescado/</link>
		<comments>http://sumolari.com/hasta-luego-y-gracias-por-el-pescado/#comments</comments>
		<pubDate>Mon, 13 Sep 2010 07:14:02 +0000</pubDate>
		<dc:creator>Sumolari</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Chuck Facts]]></category>
		<category><![CDATA[Cocoa Touch]]></category>
		<category><![CDATA[imágenes]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPod Touch]]></category>
		<category><![CDATA[mis creaciones]]></category>

		<guid isPermaLink="false">http://sumolari.com/?p=4609</guid>
		<description><![CDATA[Tal día como hoy, hace dos años, decidí transformar lo que entonces era un proyecto de portal de videojuegos en un blog sobre informática, y tras estos dos años escribiendo prácticamente a diario me ha quedado claro que no era tan mala idea, y que era la mejor forma de continuar con Sumolari.com. Estas últimas [...]]]></description>
			<content:encoded><![CDATA[<p>Tal día como hoy, hace dos años, decidí transformar lo que entonces era un proyecto de portal de videojuegos en un blog sobre informática, y tras estos dos años escribiendo prácticamente a diario me ha quedado claro que no era tan mala idea, y que era la mejor forma de continuar con <a href="http://sumolari.com">Sumolari.com</a>. Estas últimas semanas he vuelto a pensar sobre el futuro de <a href="http://sumolari.com">Sumolari.com</a> y me he dado cuenta de que no puedo mantener el ritmo que he llevado durante estos dos últimos años (94 artículos cada 100 días son muchos artículos).</p>
<h3>El futuro del blog</h3>
<p>Si en un mes como agosto, que tenía todo el día libre, tan sólo he llegado a publicar 20 artículos, no quiero ni imaginarme los pocos que habría publicado en un mes como junio, que además de tener los exámenes finales, este año para mí tendría un nuevo reto más: la <em>Prueba de Acceso a la Universidad</em>. Sin lugar a dudas, habría publicado muy pocos artículos y de una calidad muy pobre (sí, más aún que los que publico ahora mismo). Seguramente el principal motivo por el que cada vez escribo más artículos es que el tiempo libre del que dispongo (que cada vez es menos) tengo que compartirlo con cada proyecto en el que trabajo, lanzando nuevas versiones de mis proyectos según va siendo necesario, y lanzando proyectos nuevos de vez en cuando.</p>
<p>Así que he decidido darle un nuevo enfoque a <a href="http://sumolari.com">Sumolari.com</a>. Si en un principio el blog fue el centro de la página y mis proyectos eran algo accesorio, ahora será al contrario: mis proyectos pasarán a ser el centro de <a href="http://sumolari.com">Sumolari.com</a> y el blog estará en segundo plano. Dejaré de publicar noticias en el blog, y tan sólo publicaré tutoriales y reseñas de cosas que me parezcan interesantes. Es decir, a partir de ahora cabe esperar muchos menos artículos al mes, pero más útiles y menos repetitivos.</p>
<p>De todos modos, el blog tampoco ha sido un gran éxito dentro de lo que cabe. Mi principal plugin para <a href="http://sumolari.com/category/wordpress/">WordPress</a>, <a href="http://sumolari.com/wp-carousel/">WP Carousel</a> consiguió superar ayer las 16.000 descargas, superando a razón de casi 16:1 a los comentarios del blog. Creo que es mucho mejor que dedique el tiempo que tengo a proyectos como <a href="http://sumolari.com/wp-carousel/">WP Carousel</a> y publique de vez en cuando tutoriales útiles. Curiosamente, los artículos más comentados no son ni de lejos los que he publicando más recientemente, como por ejemplo <a href="http://sumolari.com/crea-un-carrusel-con-jquery/">el tutorial de cómo crear un carrusel con jQuery</a> o  <a href="http://sumolari.com/como-evitar-conflictos-entre-mootools-y-jquery/">el truco para evitar conflictos entre jQuery y Mootools</a> o <a href="http://sumolari.com/crear-dos-o-mas-sidebars-en-wordpress/"> la explicación de cómo crear varias sidebars en WordPress</a> o <a href="http://sumolari.com/valida-formularios-con-jquery/">la forma de validar formularios con jQuery</a>, ninguno de ellos publicado en 2010.</p>
<p>La calidad del blog, definitivamente, ha ido decayendo durante estos 2 años, y me parece que en esta ocasión es mejor calidad que cantidad, de modo que, en resumen, el blog pasará a segundo plano, los proyectos serán el centro de <a href="http://sumolari.com">Sumolari.com</a> y publicaré menos artículos pero de más calidad y centrados en la temática que quise tratar originalmente en el blog: tutoriales de informática.</p>
<h3>Presentando&#8230; Chuck Facts</h3>
<p>Y hasta aquí llega la parte &#8220;triste&#8221; del artículo, ahora toca presentar el proyecto en el que he trabajo durante este verano. Creo que lo he dicho en varias ocasiones, pero desde junio del año pasado, cuando me pasé a Mac, he estado intentando aprender a programar para Mac y para el iPhone / iPod Touch (y de paso iPad, aunque cuando comencé aún no existía). Ese verano me aventuré a comprar un libro de programación para el iPhone para torpes. Lamentablemente acabó el verano, septiembre y parte de octubre antes de que llegase a casa, así que no pude aprender nada.</p>
<p>A lo largo de este año he estado recopilando libros para aprender programación en Objective-C y orientada al iPhone / iPod Touch, y finalmente, tras dos meses veraniegos de dedicar todo el día a leer y estudiar diversos libros de programación, he aprendido lo básico para crear una aplicación para el iPhone (aún me quedan muchos libros muy interesantes por leer, pero me temo que se quedarán para el verano que viene). Tras rescatar la lista de proyectos que me gustaría llevar a cabo para el iPhone / iPod Touch y revisar los que tenía conocimientos suficientes para llevar a cabo, decidí comenzar a desarrollar mi primera aplicación y la primera de la App Store sobre Hechos de Chuck Norris.</p>
<p>Ya está terminada y desde ayer enviada para que la revisen y la aprueben (espero) o no en la App Store. No sé si la aprobarán finalmente o no, así que voy a explicar en qué consiste la aplicación en este artículo, por si finalmente resulta rechazada. Se trata de una aplicación que permite ver hechos de Chuck Norris almacenados en el servidor de <a href="http://sumolari.com">Sumolari.com</a>. Los hechos se encuentran organizados por categorías y pueden localizarse tanto hechos individuales como categorías desde el buscador de la aplicación (hay un buscador en cada lista de hechos de Chuck Norris). La cosa no acaba ahí ya que la gracia reside en que todos los usuarios pueden enviar sus propios hechos de Chuck Norris, que aparecerán en la aplicación tras mi aprobación (para evitar hechos duplicados u ofensivos).</p>
<p>El contenido de la aplicación se obtiene de internet, pero está siempre disponible offline. Además también dispone de un mapa donde ver desde qué lugares se han enviado más contribuciones (para mantener la privacidad de los usuarios, tan sólo se muestra el recuento de hechos de Chuck Norris enviados desde el lugar, además las coordenadas se redondean para más privacidad, y es imposible saber desde la aplicación el lugar desde el que se ha enviado un hecho de Chuck Norris). Aunque claro, siempre se puede contribuir sin compartir tu posición simplemente seleccionando la opción de &#8220;no permitir&#8221; que aparece la primera vez que se contribuye.</p>
<p>No es una aplicación del nivel de otras de la App Store, pero es realmente divertida, y viene genial para distraerse en algunos momentos: con tan sólo agitar el dispositivo la aplicación nos mostrará un hecho escogido al azar, de modo que no hace falta revisar listas ni seleccionar nada, tan sólo agitar y leer. Por supuesto, todo esto de forma totalmente gratuita (y preparada para definición estándar y Retina Display), tan sólo hay unos anuncios (iAd) en la parte superior de la pantalla pero no molestan nada y en general son distraídos.</p>
<p>También me gustaría desarrollar una versión para el iPad, pero por falta de tiempo y por la inseguridad sobre el proceso de aprobación de Apple lo dejaré para más adelante. La aplicación también tiene lista una pequeña página mostrando sus virtudes, pero hasta que no la aprueben no haré la página pública. Podéis ver las capturas de la aplicación que he enviado a Apple a continuación:</p>

<a href='http://sumolari.com/hasta-luego-y-gracias-por-el-pescado/attachment/1/' title='Lista de hechos de Chuck Facts'><img width="230" height="130" src="http://sumolari.com/wp-content/uploads/2010/09/1-230x130.png" class="attachment-thumbnail" alt="Lista de hechos de Chuck Facts" title="Lista de hechos de Chuck Facts" /></a>
<a href='http://sumolari.com/hasta-luego-y-gracias-por-el-pescado/2-2/' title='Lista de categorías de Chuck Facts'><img width="230" height="130" src="http://sumolari.com/wp-content/uploads/2010/09/2-230x130.png" class="attachment-thumbnail" alt="Lista de categorías de Chuck Facts" title="Lista de categorías de Chuck Facts" /></a>
<a href='http://sumolari.com/hasta-luego-y-gracias-por-el-pescado/attachment/3/' title='Pestaña de contribuciones de Chuck Facts'><img width="230" height="130" src="http://sumolari.com/wp-content/uploads/2010/09/3-230x130.png" class="attachment-thumbnail" alt="Pestaña de contribuciones de Chuck Facts" title="Pestaña de contribuciones de Chuck Facts" /></a>
<a href='http://sumolari.com/hasta-luego-y-gracias-por-el-pescado/attachment/4/' title='Mapa de Chuck Facts'><img width="230" height="130" src="http://sumolari.com/wp-content/uploads/2010/09/4-230x130.png" class="attachment-thumbnail" alt="Mapa de Chuck Facts" title="Mapa de Chuck Facts" /></a>
<a href='http://sumolari.com/hasta-luego-y-gracias-por-el-pescado/attachment/5/' title='Enviando un nuevo hecho en Chuck Facts'><img width="230" height="130" src="http://sumolari.com/wp-content/uploads/2010/09/5-230x130.png" class="attachment-thumbnail" alt="Enviando un nuevo hecho en Chuck Facts" title="Enviando un nuevo hecho en Chuck Facts" /></a>
<a href='http://sumolari.com/hasta-luego-y-gracias-por-el-pescado/attachment/6/' title='Vista detallada de un hecho de Chuck Norris de Chuck Facts'><img width="230" height="130" src="http://sumolari.com/wp-content/uploads/2010/09/6-230x130.png" class="attachment-thumbnail" alt="Vista detallada de un hecho de Chuck Norris de Chuck Facts" title="Vista detallada de un hecho de Chuck Norris de Chuck Facts" /></a>
<a href='http://sumolari.com/hasta-luego-y-gracias-por-el-pescado/attachment/7/' title='Hecho aleatorio de Chuck Facts'><img width="230" height="130" src="http://sumolari.com/wp-content/uploads/2010/09/7-230x130.png" class="attachment-thumbnail" alt="Hecho aleatorio de Chuck Facts" title="Hecho aleatorio de Chuck Facts" /></a>

<p>Y esto es todo, bastante para un sólo artículo. Ha sido un placer escribir aquí casi a diario durante estos dos últimos años, y estoy muy contento de los más de 1100 regalos que habéis hecho algunos de los lectores del blog durante este tiempo. Espero poder publicar algún tutorial interesante de aquí a final de año, pero como de costumbre, no voy a prometer nada. En cuanto a los usuarios de mis proyectos, estoy realmente sorprendido de la cantidad de gente que ha llegado a usarlos, he visto algunos de mis themes en los lugares más insospechados. Esto no es un adiós, es un &#8220;Hsata luego y gracias por el pescado&#8221;.</p>
]]></content:encoded>
			<wfw:commentRss>http://sumolari.com/hasta-luego-y-gracias-por-el-pescado/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Evita que UISearchDisplayController oculte una UINavigationBar</title>
		<link>http://sumolari.com/evita-que-uisearchdisplaycontroller-oculte-una-uinavigationbar/</link>
		<comments>http://sumolari.com/evita-que-uisearchdisplaycontroller-oculte-una-uinavigationbar/#comments</comments>
		<pubDate>Sun, 05 Sep 2010 15:55:47 +0000</pubDate>
		<dc:creator>Sumolari</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Cocoa Touch]]></category>
		<category><![CDATA[Interface Builder]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[UIKit]]></category>
		<category><![CDATA[xcode]]></category>

		<guid isPermaLink="false">http://sumolari.com/?p=4591</guid>
		<description><![CDATA[El funcionamiento estándar de UISearchDisplayController es ocultar la barra de navegación (UINavigationBar) cuando se inicia una búsqueda. Este comportamiento nos puede parecer adecuado, pero en ciertas ocasiones puede que no queramos que se superponga y queramos tener visible la barra de navegación (UINavigationBar). Actualmente cuando se activa la barra de búsqueda se ejecuta el método [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://sumolari.com/wp-content/uploads/2010/09/Captura-de-pantalla-2010-09-05-a-las-16.11.21.png" rel="lightbox-4591"><br />
</a></p>
<p style="text-align: center;">
<p style="text-align: center;"><a href="http://sumolari.com/wp-content/uploads/2010/09/Captura-de-pantalla-2010-09-05-a-las-16.11.211.png" rel="lightbox-4591"><img class="size-full wp-image-4599 aligncenter" title="UISearchDisplayControllerWithoutAnimation: Subclase de UISearchDisplayController" src="http://sumolari.com/wp-content/uploads/2010/09/Captura-de-pantalla-2010-09-05-a-las-16.11.211.png" alt="UISearchDisplayControllerWithoutAnimation: Subclase de UISearchDisplayController" width="649" height="448" /></a></p>
<p>El funcionamiento estándar de <em>UISearchDisplayController</em> es ocultar la barra de navegación (<em>UINavigationBar</em>) cuando se inicia una búsqueda. Este comportamiento nos puede parecer adecuado, pero en ciertas ocasiones puede que no queramos que se superponga y queramos tener visible la barra de navegación (<em>UINavigationBar</em>).</p>
<p>Actualmente cuando se activa la barra de búsqueda se ejecuta el método privado <em>setActive:animated:</em>. La única manera de evitar que se oculte la barra de navegación es crear una subclase de <em>UISearchDisplayController</em> y reemplazar dicho método por el siguiente, que anima la barra de búsqueda sin ocultar la barra de navegación (realmente oculta primero la barra de navegación y luego la muestra, de modo que a efectos prácticos parece que siempre está ahí):</p>
<pre class="prettyprint linenums">
- (void)setActive:(BOOL)visible animated:(BOOL)animated;
{
    if (self.active == visible) return;
    [self.searchContentsController.navigationController setNavigationBarHidden:YES animated:NO];
    [super setActive:visible animated:animated];
    [self.searchContentsController.navigationController setNavigationBarHidden:NO animated:NO];
    if (visible)
	{
        [self.searchBar becomeFirstResponder];
    }
	else
	{
        [self.searchBar resignFirstResponder];
    }
}
</pre>
<p>La nueva clase puede llamarse, por ejemplo, <em>UISearchDisplayControllerWithoutAnimation</em> (aunque realmente sí que tiene animación). Su interfaz será algo así (recordad que lo heredamos todo de UISearchDisplayController así que no necesitamos declarar ningún método más ni ninguna propiedad, tan sólo reemplazar el método <em>setActive:animated:</em>, que haremos en la implementación):</p>
<pre class="prettyprint linenums">#import &lt;UIKit/UIKit.h&gt;
@interface UISearchDisplayControllerWithoutAnimation : UISearchDisplayController
{
}
@end
</pre>
<p>Y la implementación:</p>
<pre class="prettyprint linenums">
#import &quot;UISearchDisplayControllerWithoutAnimation.h&quot;
@implementation UISearchDisplayControllerWithoutAnimation
- (void)setActive:(BOOL)visible animated:(BOOL)animated;
{
 if (self.active == visible) return;
 [self.searchContentsController.navigationController setNavigationBarHidden:YES animated:NO];
 [super setActive:visible animated:animated];
 [self.searchContentsController.navigationController setNavigationBarHidden:NO animated:NO];
 if (visible)
 {
 [self.searchBar becomeFirstResponder];
 }
 else
 {
 [self.searchBar resignFirstResponder];
 }
}
@end
</pre>
<div id="attachment_4594" class="wp-caption alignleft" style="width: 240px"><a href="http://sumolari.com/wp-content/uploads/2010/09/Captura-de-pantalla-2010-09-05-a-las-16.23.28.png" rel="lightbox-4591"><img class="size-thumbnail wp-image-4594" title="Añadiendo un UISearchDisplayController en Interface Builder" src="http://sumolari.com/wp-content/uploads/2010/09/Captura-de-pantalla-2010-09-05-a-las-16.23.28-230x130.png" alt="Añadiendo un UISearchDisplayController en Interface Builder" width="230" height="130" /></a><p class="wp-caption-text">Añadiendo un UISearchDisplayController en Interface Builder</p></div>
<div id="attachment_4593" class="wp-caption alignright" style="width: 240px"><a href="http://sumolari.com/wp-content/uploads/2010/09/Captura-de-pantalla-2010-09-05-a-las-16.11.36.png" rel="lightbox-4591"><img class="size-thumbnail wp-image-4593" title="Cambiando la clase del UISearchDisplayController" src="http://sumolari.com/wp-content/uploads/2010/09/Captura-de-pantalla-2010-09-05-a-las-16.11.36-230x130.png" alt="Cambiando la clase del UISearchDisplayController" width="230" height="130" /></a><p class="wp-caption-text">Cambiando la clase del UISearchDisplayController</p></div>
<p>Ahora sólo queda usar <em>UISearchDisplayControllerWithoutAnimation</em> en lugar de <em>UISearchDisplayController</em>. Si hemos añadido la barra de búsqueda directamente desde Xcode, sin usar Interface Builder, no hay ningún problema, y si hemos usado Interface Builder basta con cambiar la clase del <em>UISearchDisplayController </em>a <em>UISearchDisplayControllerWithoutAnimation</em>. Si queremos añadir una nueva barra de búsqueda que no oculte la barra de navegación basta con añadir desde la librería un <em>UISearchDisplayController</em>, como de costumbre, y una vez añadido cambiarle la clase a <em>UISearchDisplayControllerWithoutAnimation.</em></p>
<p>La única pega de este sistema es que tal vez en alguna nueva versión de iOS cambien el método privado <em>setActive:animated:</em>, con lo cual habría que revisar este nuevo método y actualizar nuestra clase personalizada. De todas maneras, parece algo poco probable, al menos en un futuro inmediato. Este método nuevo funciona sin problemas en iOS 4 y iOS 4.1, aunque seguramente funcione también en versiones anteriores (yo sólo he probado estas dos).</p>
]]></content:encoded>
			<wfw:commentRss>http://sumolari.com/evita-que-uisearchdisplaycontroller-oculte-una-uinavigationbar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

