<?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>ZenBrains &#187; Howto</title>
	<atom:link href="http://www.zenbrains.com/blog/category/howto/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.zenbrains.com/blog</link>
	<description>IPhone Development Team</description>
	<lastBuildDate>Tue, 17 May 2011 21:06:43 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Mostrar la tabla de contenidos en la documentación de Xcode 4</title>
		<link>http://www.zenbrains.com/blog/2011/05/mostrar-la-tabla-de-contenidos-en-xcode-4/</link>
		<comments>http://www.zenbrains.com/blog/2011/05/mostrar-la-tabla-de-contenidos-en-xcode-4/#comments</comments>
		<pubDate>Sun, 08 May 2011 22:35:11 +0000</pubDate>
		<dc:creator>Aram Julhakyan</dc:creator>
				<category><![CDATA[Howto]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Documentación]]></category>
		<category><![CDATA[XCode]]></category>

		<guid isPermaLink="false">http://www.zenbrains.com/blog/?p=657</guid>
		<description><![CDATA[Al pasar de la versión 3 a la 4 de Xcode una de las cosas más molestas que nos hemos encontrado fue la forma de mostrar la documentación. Antes, al abrir la documentación de una clase, en el lado izquierdo de la ventana podíamos ver una especie de índice que nos permitía visualizar directamente la [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.zenbrains.com%2Fblog%2F2011%2F05%2Fmostrar-la-tabla-de-contenidos-en-xcode-4%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.zenbrains.com%2Fblog%2F2011%2F05%2Fmostrar-la-tabla-de-contenidos-en-xcode-4%2F&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Al pasar de la versión 3 a la 4 de Xcode una de las cosas más molestas que nos hemos encontrado fue la forma de mostrar la documentación. Antes, al abrir la documentación de una clase, en el lado izquierdo de la ventana podíamos ver una especie de índice que nos permitía visualizar directamente la lista de métodos de clase y de instancia que tenía esa clase concreta y podíamos saltar directamente a ver la info de un método determinado, etc.</p>
<p>Con la salida del Xcode 4 esa tabla de contenidos desapareció (con el tiempo que nos ahorraba).</p>
<p>Resumiendo, para volver a mostrar esa tabla de contenidos en la documentación hay que ejecutar el siguiente comando en la terminal (recomiendo hacer un backup de los docsets por si algo sale mal):</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">sudo egrep <span style="color: #339933;">-</span>lRZ <span style="color: #ff0000;">&quot;Prototype.Browser.Xcode4OrNewer=Prototype.Browser.XcodeVersion&amp;lt;1000;&quot;</span> <span style="color: #339933;">/</span>Library<span style="color: #339933;">/</span>Developer<span style="color: #339933;">/</span>Documentation<span style="color: #339933;">/</span>DocSets <span style="color: #339933;">|</span> xargs <span style="color: #339933;">-</span><span style="color: #0000dd;">0</span> <span style="color: #339933;">-</span>L <span style="color: #339933;">%</span> sudo sed <span style="color: #339933;">-</span>i <span style="color: #ff0000;">''</span> <span style="color: #339933;">-</span>e <span style="color: #ff0000;">'s/Prototype\.Browser\.Xcode4OrNewer\=Prototype\.Browser\.XcodeVersion\&amp;lt;1000\;/Prototype\.Browser\.Xcode4OrNewer\=false\;/g'</span></pre></div></div>

<p>Esta información se ha obtenido de <a href="http://stackoverflow.com/questions/5408329/xcode-4-documentation-how-to-show-the-table-of-contents">este hilo</a> de stackoverflow.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zenbrains.com/blog/2011/05/mostrar-la-tabla-de-contenidos-en-xcode-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reproductor youtube para el iPad (iOS)</title>
		<link>http://www.zenbrains.com/blog/2011/03/reproductor-youtube-para-el-ipad-ios/</link>
		<comments>http://www.zenbrains.com/blog/2011/03/reproductor-youtube-para-el-ipad-ios/#comments</comments>
		<pubDate>Mon, 28 Mar 2011 16:01:31 +0000</pubDate>
		<dc:creator>Aram Julhakyan</dc:creator>
				<category><![CDATA[Howto]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Open source]]></category>
		<category><![CDATA[youtube]]></category>

		<guid isPermaLink="false">http://www.zenbrains.com/blog/?p=650</guid>
		<description><![CDATA[En muchas ocasiones necesitamos incrustrar vídeos youtube en nuestras apps. Aquí les presentamos una clase que hemos programado que nos hace de reproductor de youtube. Básicamente es una UIWebView con el html necesario para mostrar el vídeo. Y se usuaría de la siguiente manera: ZBYouTubeView *vid = [[ZBYouTubeView alloc] initWithFrame:self.bounds andUrl:@&#8221;http://www.youtube.com/watch?v=nmwIgF2gekY&#38;feature=feedf&#8221;]; Es otra vista más [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.zenbrains.com%2Fblog%2F2011%2F03%2Freproductor-youtube-para-el-ipad-ios%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.zenbrains.com%2Fblog%2F2011%2F03%2Freproductor-youtube-para-el-ipad-ios%2F&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>En muchas ocasiones necesitamos incrustrar vídeos youtube en nuestras apps.</p>
<p>Aquí les presentamos una clase que hemos programado que nos hace de reproductor de youtube.</p>
<p>Básicamente es una UIWebView con el html necesario para mostrar el vídeo.</p>
<p>Y se usuaría de la siguiente manera:</p>
<p>ZBYouTubeView *vid = [[ZBYouTubeView alloc] initWithFrame:self.bounds andUrl:@&#8221;http://www.youtube.com/watch?v=nmwIgF2gekY&amp;feature=feedf&#8221;];</p>
<p>Es otra vista más que podemos añadir en cualquier sitio.</p>
<p>El tamaño del vídeo se adapta automáticamente si cambiamos el tamaño de la vista.</p>
<p>También se encarga de mostrar un UIActivityIndicatorView mientras carga el vídeo.</p>
<p>Cómo nos recuerdan en el primer comentario sólo funciona en el dispositivo por lo que si no véis nada en el simulador no os preocupéis.</p>
<p>Espero que les sea útil.</p>
<p><a title="Descargar código" href="http://www.zenbrains.com/blog/wp-content/uploads/2011/03/ZBYoutubePlayer.zip">Descargar código</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.zenbrains.com/blog/2011/03/reproductor-youtube-para-el-ipad-ios/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cuidado al usar MFMailComposeViewController para enviar emails en el iPhone/iPod</title>
		<link>http://www.zenbrains.com/blog/2010/10/cuidado-al-usar-mfmailcomposeviewcontroller-para-enviar-emails-en-el-iphoneipod/</link>
		<comments>http://www.zenbrains.com/blog/2010/10/cuidado-al-usar-mfmailcomposeviewcontroller-para-enviar-emails-en-el-iphoneipod/#comments</comments>
		<pubDate>Thu, 07 Oct 2010 18:30:47 +0000</pubDate>
		<dc:creator>Aram Julhakyan</dc:creator>
				<category><![CDATA[Howto]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.zenbrains.com/blog/?p=643</guid>
		<description><![CDATA[Hace unos minutos descubri un error en una de mis aplicaciones y pensé que estaría bien comentarlo con el resto de la gente para que no cometan el mismo error. Cuando intentamos enviar emails desde nuestras aplicaciones usando el MFMailComposeViewController podemos tener un problema si los usuarios no tienen configurada ninguna cuenta. mail = &#91;&#91;MFMailComposeViewController [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.zenbrains.com%2Fblog%2F2010%2F10%2Fcuidado-al-usar-mfmailcomposeviewcontroller-para-enviar-emails-en-el-iphoneipod%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.zenbrains.com%2Fblog%2F2010%2F10%2Fcuidado-al-usar-mfmailcomposeviewcontroller-para-enviar-emails-en-el-iphoneipod%2F&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Hace unos minutos descubri un error en una de mis aplicaciones y pensé que estaría bien comentarlo con el resto de la gente para que no cometan el mismo error.</p>
<p>Cuando intentamos enviar emails desde nuestras aplicaciones usando el MFMailComposeViewController podemos tener un problema si los usuarios no tienen configurada ninguna cuenta.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">mail <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>MFMailComposeViewController alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>mail setMessageBody<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Texto del cuerpo&quot;</span><span style="color: #002200;">&#93;</span>  isHTML<span style="color: #002200;">:</span><span style="color: #a61390;">YES</span><span style="color: #002200;">&#93;</span>;
mail.mailComposeDelegate <span style="color: #002200;">=</span> self;
<span style="color: #002200;">&#91;</span>self presentModalViewController<span style="color: #002200;">:</span>mail animated<span style="color: #002200;">:</span><span style="color: #a61390;">YES</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>mail release<span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>El problema con el código de arriba consiste en que si el usuario no tienen ninguna cuenta configurada por lo que el init del MFMailComposeViewController devolverá nil y al intentar mostrar la vista de mail ([self presentModalViewController:mail animated:YES]) la aplicación se cerrará.</p>
<p>Para evitar eso tenemos que comprobar que el mail no es nil antes de hacer nada. El código buenos sería este:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">mail <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>MFMailComposeViewController alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>mail setMessageBody<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Texto del cuerpo&quot;</span><span style="color: #002200;">&#93;</span>  isHTML<span style="color: #002200;">:</span><span style="color: #a61390;">YES</span><span style="color: #002200;">&#93;</span>;
mail.mailComposeDelegate <span style="color: #002200;">=</span> self;
<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>mail <span style="color: #002200;">!=</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span>
    <span style="color: #002200;">&#91;</span>self presentModalViewController<span style="color: #002200;">:</span>mail animated<span style="color: #002200;">:</span><span style="color: #a61390;">YES</span><span style="color: #002200;">&#93;</span>;
<span style="color: #a61390;">else</span>
   <span style="color: #11740a; font-style: italic;">//Informar al usuario o lanzar la aplicación mail.</span>
<span style="color: #002200;">&#91;</span>mail release<span style="color: #002200;">&#93;</span>;</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.zenbrains.com/blog/2010/10/cuidado-al-usar-mfmailcomposeviewcontroller-para-enviar-emails-en-el-iphoneipod/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Evitar el autobloqueo en nuestra aplicación</title>
		<link>http://www.zenbrains.com/blog/2010/08/evitar-el-autobloqueo-en-nuestra-aplicacion/</link>
		<comments>http://www.zenbrains.com/blog/2010/08/evitar-el-autobloqueo-en-nuestra-aplicacion/#comments</comments>
		<pubDate>Tue, 31 Aug 2010 16:05:39 +0000</pubDate>
		<dc:creator>Marcos</dc:creator>
				<category><![CDATA[Apps]]></category>
		<category><![CDATA[Howto]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Objective-C]]></category>

		<guid isPermaLink="false">http://www.zenbrains.com/blog/?p=625</guid>
		<description><![CDATA[Según la aplicación que estamos desarrollando, puede ser interesante o incluso necesario evitar que el iPhone se autobloquee mientras nuestra aplicación esta en marcha. Por suerte tenemos una manera muy sencilla de conseguirlo y con sólo una instrucción. [UIApplication sharedApplication].idleTimerDisabled = YES; Eso es todo lo que necesitamos para que el iPhone permanezca todo el [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.zenbrains.com%2Fblog%2F2010%2F08%2Fevitar-el-autobloqueo-en-nuestra-aplicacion%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.zenbrains.com%2Fblog%2F2010%2F08%2Fevitar-el-autobloqueo-en-nuestra-aplicacion%2F&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Según la aplicación que estamos desarrollando, puede ser interesante o incluso necesario evitar que el iPhone se autobloquee mientras nuestra aplicación esta en marcha. Por suerte tenemos una manera muy sencilla de conseguirlo y con sólo una instrucción.</p>

<div class="wp_syntax"><div class="code"><pre class="obj-c" style="font-family:monospace;">[UIApplication sharedApplication].idleTimerDisabled = YES;</pre></div></div>

<p>Eso es todo lo que necesitamos para que el iPhone permanezca todo el tiempo encendido, un buen lugar para ponerlo es en el método applicationDidFinishLaunch: en nuestro UIApplication delegate.</p>
<p>Tened cuidado porque si el usuario sale corriendo y deja su iPhone solo, durante mucho tiempo, al dejar la pantalla encendida todo el rato, lo dejaremos sin batería.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zenbrains.com/blog/2010/08/evitar-el-autobloqueo-en-nuestra-aplicacion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Weak Linking</title>
		<link>http://www.zenbrains.com/blog/2010/07/weak-linking/</link>
		<comments>http://www.zenbrains.com/blog/2010/07/weak-linking/#comments</comments>
		<pubDate>Sun, 25 Jul 2010 13:32:33 +0000</pubDate>
		<dc:creator>Aram Julhakyan</dc:creator>
				<category><![CDATA[Howto]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[XCode]]></category>

		<guid isPermaLink="false">http://www.zenbrains.com/blog/?p=588</guid>
		<description><![CDATA[Hoy vamos a ver qué es &#8220;weak linking&#8221; (linkado débil?), para qué sirve y como usarlo en nuestros proyecto. Una de las decisiones a tomar cuando empezamos un nuevo proyecto es la de decidir cuál es el dispositivo y/o sistema básico que soportorá nuestra app (iPhone 2G con IOS 2.0? , sólo iPhone 4.0 con [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.zenbrains.com%2Fblog%2F2010%2F07%2Fweak-linking%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.zenbrains.com%2Fblog%2F2010%2F07%2Fweak-linking%2F&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Hoy vamos a ver qué es &#8220;weak linking&#8221; (linkado débil?), para qué sirve y como usarlo en nuestros proyecto.</p>
<p>Una de las decisiones a tomar cuando empezamos un nuevo proyecto es la de decidir cuál es el dispositivo y/o sistema básico que soportorá nuestra app (iPhone 2G con IOS 2.0? , sólo iPhone 4.0 con iOS4, ipad? o todos?).</p>
<p>Esta claro que cuanto más dispositivos y versiones de SO soportemos a más gente podremos llegar pero para eso tendremos que hacer esfuerzos extra.</p>
<p>El problema consiste en que de una versión a otra se introducen nuevos frameworks, se modifican funciones, se añaden nuevas funcionalidades, etc. A priori si usamos esos nuevos frameworks entonces nuestras apps no funcionarán en las versiones anteriores. Aquí es donde entra weak linking (entre otros) para ayudarnos.</p>
<p>Entonces, vamos a ver un caso práctico donde el &#8220;weak linking&#8221; nos puede ser útil.</p>
<p>Por ejemplo en iOS 3.0 se introdujo el framework llamado MessageUI que nos permite enviar emails ( y ahora con iOS 4 también SMSes) desde nuestra aplicación. Se encarga de mostrar la interfa de edición de email y permite enviarlo directamente desde nuestra app.</p>
<p>Entonces, que pasa si quieres usar ese nueve framework pero al mismo tiempo queremos que nuestra app siga siendo compatible con las versiones anteriores de iOS?</p>
<p>Muy simple, al incluir este nueva framework en nuestro proyecto lo tenemos que marcar como &#8220;weak&#8221;.</p>
<p>Para marcar el framework como weak tenemos que hacer click derecho en el Target  para el que queremos hacer el &#8220;weak linking&#8221; y en el menú desplegable seleccionar &#8220;Get Info&#8221;:</p>
<p><a href="http://www.zenbrains.com/blog/wp-content/uploads/2010/07/target.jpg"><img class="aligncenter size-full wp-image-589" title="target" src="http://www.zenbrains.com/blog/wp-content/uploads/2010/07/target.jpg" alt="" width="451" height="373" /></a></p>
<p>Luego en la ventana que se abre nos vamos a la pestaña General y abajo de todo veremos el listado de frameworks que se usan para el target seleccionado. En ese listado marcamos el MessageUI.framework como &#8220;weak&#8221;.</p>
<p>Y está con esto hemos hecho el &#8220;weak linking&#8221; y ahora el programa se ejecutará tanto en iOS 2,0 (que no tiene MessageUI) como en iOS 3.</p>
<p>He dicho que se ejecutará ahora porque hemos añadido el framework pero por ahora no hems usando ninguna de las clases o funcionces de ese framework.</p>
<p>Si en alguna parte de nuestra app queremos mostrar la vista de edición de email (proporcionado por MessageUI) pondríamos un código parecido a este:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">MFMailComposeViewController <span style="color: #002200;">*</span>mail <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>MFMailComposeViewController alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>mail setMessageBody<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;mi mensaje&quot;</span>  isHTML<span style="color: #002200;">:</span><span style="color: #a61390;">NO</span><span style="color: #002200;">&#93;</span>;
mail.mailComposeDelegate <span style="color: #002200;">=</span> self;
<span style="color: #002200;">&#91;</span>self presentModalViewController<span style="color: #002200;">:</span>mail animated<span style="color: #002200;">:</span><span style="color: #a61390;">YES</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>mail release<span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>Después de poner este código la aplicación funcionará bien en iOS3 pero petará en iOS2. Entonces, a parte del weak linking tenemos que de alguna manera preguntar si durante la ejecución están disponibles las clases (también funcionar, métodos, etc) que necesitamos (en este caso tenemos que asegurarnos que el MFMailComposeViewController está disponible).</p>
<p>En el caso de ejemplo tendríamos que hacer lo siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>NSClassFromString<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;MFMailComposeViewController&quot;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">!=</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
&nbsp;
	MFMailComposeViewController <span style="color: #002200;">*</span>mail <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>MFMailComposeViewController alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>mail setMessageBody<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;mi mensaje&quot;</span>  isHTML<span style="color: #002200;">:</span><span style="color: #a61390;">NO</span><span style="color: #002200;">&#93;</span>;
	mail.mailComposeDelegate <span style="color: #002200;">=</span> self;
	<span style="color: #002200;">&#91;</span>self presentModalViewController<span style="color: #002200;">:</span>mail animated<span style="color: #002200;">:</span><span style="color: #a61390;">YES</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>mail release<span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #002200;">&#125;</span><span style="color: #a61390;">else</span><span style="color: #002200;">&#123;</span>
		<span style="color: #11740a; font-style: italic;">//Hacer algo pensado para las versiones anteriores</span>
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Con esto si que conseguiremos que la app se ejecute sin problemas tanto en iOS3 como en iOS2.</p>
<p>Pero en este caso todavía podemos rizar más el rizo. La presencia de un framework en el sistema no significa que este puede usarlo. Por ejemplo en el iOS 4 tenemos el MFMessageComposeViewController que sirve para enviar SMS. Si tenemos un iPod touch con iOS4 instalado tendremos ese framework disponible pero eso no significa que vayamos a poder enviar SMSes desde el iPod.</p>
<p>Volviendo al ejemplo anterior, la versión con aun más seguridad/compatibilidad sería este:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>NSClassFromString<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;MFMailComposeViewController&quot;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">!=</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>MFMailComposeViewController canSendMail<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#123;</span>
		MFMailComposeViewController <span style="color: #002200;">*</span>mail <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>MFMailComposeViewController alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
		<span style="color: #002200;">&#91;</span>mail setMessageBody<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;mi mensaje&quot;</span>  isHTML<span style="color: #002200;">:</span><span style="color: #a61390;">NO</span><span style="color: #002200;">&#93;</span>;
		mail.mailComposeDelegate <span style="color: #002200;">=</span> self;
		<span style="color: #002200;">&#91;</span>self presentModalViewController<span style="color: #002200;">:</span>mail animated<span style="color: #002200;">:</span><span style="color: #a61390;">YES</span><span style="color: #002200;">&#93;</span>;
		<span style="color: #002200;">&#91;</span>mail release<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #002200;">&#125;</span><span style="color: #a61390;">else</span><span style="color: #002200;">&#123;</span>
		<span style="color: #11740a; font-style: italic;">//hacer algo pensado para un dispositivo de donde no podemos enviar emails</span>
	<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">&#125;</span><span style="color: #a61390;">else</span><span style="color: #002200;">&#123;</span>
	<span style="color: #11740a; font-style: italic;">//Hacer algo pensado para las versiones anteriores</span>
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Esto que acabamos de ver se llama programación condicional que básicamente nos permite asegurarnos que determinados recursos existen en el sistema antes de usarlos.<br />
Apple recomienda hacer estas comprobaciones a nivel más abajo (funciones y clases) y no a nivel de dispositivo. Es decir, no se recomienda comprobar que estamos ejecutando en un iPhone y dar por seguro que ciertas funciones existen.</p>
<p>En los ejemplos hemos visto cómo comprobar si una clase existe usando la función NSClassFromString() que nos devuelve nul si la clase no existe.<br />
Para comprobar si un método existe o no podemos usar los métodos instancesRespondToSelector y respondsToSelector.<br />
En el caso de funciones podemos comprobar su existencia comparando el nombre de la función con NULL:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>miFuncion<span style="color: #002200;">==</span><span style="color: #a61390;">NULL</span><span style="color: #002200;">&#41;</span>
     NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;La función miFunción no existe&quot;</span><span style="color: #002200;">&#41;</span>;</pre></div></div>

<p>Para más detalles sobre este tema podéis consultar la <a href="https://developer.apple.com/iphone/prerelease/library/documentation/DeveloperTools/Conceptual/cross_development/Introduction/Introduction.html">SDK Compatibility Guide</a> (está en inglés y tenéis que estar registrados apra verlo) de Apple.</p>
<p>Y como siempre, si tenéis dudas, consultas, sugerencias, correcciones no dudéis un usar los comentarios o nuestro foro.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zenbrains.com/blog/2010/07/weak-linking/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Seguir cambios o eventos con notificaciones</title>
		<link>http://www.zenbrains.com/blog/2010/07/seguir-cambios-o-eventos-con-notificaciones/</link>
		<comments>http://www.zenbrains.com/blog/2010/07/seguir-cambios-o-eventos-con-notificaciones/#comments</comments>
		<pubDate>Thu, 15 Jul 2010 09:30:09 +0000</pubDate>
		<dc:creator>Marcos</dc:creator>
				<category><![CDATA[Howto]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[How_to]]></category>
		<category><![CDATA[Objective-C]]></category>

		<guid isPermaLink="false">http://www.zenbrains.com/blog/?p=565</guid>
		<description><![CDATA[Hace algún tiempo os comenté como detectar cambios en propiedades mediante el KVO (Key-Value Observing) hoy veremos como hacer lo mismo con notificaciones. La idea del ejemplo es la siguiente: Tenemos un objeto A de una clase X, del que queremos ser avisados cuando una propiedad sea modificada, para ello avisaremos a otro objeto B, para que éste [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.zenbrains.com%2Fblog%2F2010%2F07%2Fseguir-cambios-o-eventos-con-notificaciones%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.zenbrains.com%2Fblog%2F2010%2F07%2Fseguir-cambios-o-eventos-con-notificaciones%2F&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Hace algún tiempo os comenté como detectar cambios en propiedades mediante el KVO (Key-Value Observing) hoy veremos como hacer lo mismo con notificaciones.</p>
<p>La idea del ejemplo es la siguiente: Tenemos un objeto A de una clase X, del que queremos ser avisados cuando una propiedad sea modificada, para ello avisaremos a otro objeto B, para que éste último realize alguna acción. Para ello usaremos notificaciones, el objeto A enviará una notificación cuando cambie su propiedad y el objeto B estará pendiente de dichas notificaciones.</p>
<p>Veamos como hacer esto desde el código, primero nos creamos una función que será la encargada de enviar las notificaciones. Usamos el centro de notificaciones por defecto de nuestra aplicación y el método <strong>postNotificationName:object:</strong> para enviar la notificación. Los parámetros son un string para el nombre de la notificación y el objeto que envía la notificación.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#pragma mark -</span>
<span style="color: #6e371a;">#pragma mark Notification methods</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>sendNumberPadPressedNotification <span style="color: #002200;">&#123;</span>
     <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSNotificationCenter</span> defaultCenter<span style="color: #002200;">&#93;</span> postNotificationName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;number pad pressed&quot;</span> 
                                                         object<span style="color: #002200;">:</span>self<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Después sólo tenemos que llamar a esta función cada vez que queramos notificar del evento o cambio producido, por ejemplo si pulsamos un botón.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#pragma mark -</span>
<span style="color: #6e371a;">#pragma mark Notification methods</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>ceroButtonPushed<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>sender <span style="color: #002200;">&#123;</span>
     <span style="color: #002200;">&#91;</span>input setString<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>numberFormater stringFromNumber<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSNumber</span> numberWithFloat<span style="color: #002200;">:</span><span style="color: #2400d9;">0.00</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
     coma <span style="color: #002200;">=</span> <span style="color: #a61390;">NO</span>;
     decimal <span style="color: #002200;">=</span> <span style="color: #2400d9;">1</span>;
     <span style="color: #002200;">&#91;</span>self sendNumberPadPressedNotification<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>En la última línea llamamos a nuestro método y la notificación es enviada, en este ejemplo se usa para avisar de que<em> input</em> fue cambiado.</p>
<p>Esto es todo lo que necesita nuestro objeto A (el que avisa del cambio o evento). Veamos ahora el código para el objeto B (el que quiere ser avisado).</p>
<p>Lo primero que tenemos que hacer es registrar el objeto B en el centro de notificaciones para poder recibirlas, obviamente nos tenemos que registrar en el mismo centro de notificaciones que el objeto A, en este caso el centro por defecto.</p>
<p>Usamos para ello el método <strong>addObserver:selector:name:object:</strong> los parámetros son: el objeto a registrar, un selector del método que queremos ejecutar al recibir la notificación, el nombre de la notificación para la que queremos ser avisados y el objeto sobre el que queremos ser avisado, éste último puede ser nil o el objeto en concreto, para poder diferenciar quien manda la notificación en caso de tener más de un objeto enviando la misma notificación.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"> <span style="color: #11740a; font-style: italic;">// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.</span>
 <span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>viewDidLoad <span style="color: #002200;">&#123;</span>
     <span style="color: #002200;">&#91;</span>super viewDidLoad<span style="color: #002200;">&#93;</span>;
     numberPadController <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>GenericNumberPad alloc<span style="color: #002200;">&#93;</span> initWithNibName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;GenericNumberPad&quot;</span>
     	  						      bundle<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSBundle</span> mainBundle<span style="color: #002200;">&#93;</span>
							       frame<span style="color: #002200;">:</span>CGRectMake<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">20</span>, <span style="color: #2400d9;">190</span>, <span style="color: #2400d9;">280</span>, <span style="color: #2400d9;">216</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
     <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSNotificationCenter</span> defaultCenter<span style="color: #002200;">&#93;</span> addObserver<span style="color: #002200;">:</span>self 
                                              selector<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>numberPadPressed<span style="color: #002200;">&#41;</span>
						  name<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;number pad pressed&quot;</span> object<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
     <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>self view<span style="color: #002200;">&#93;</span> addSubview<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>numberPadController view<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
 <span style="color: #002200;">&#125;</span></pre></div></div>

<p>Cómo veis en el código, el nombre de la notificación es el mismo que se usó en el objeto A. Ya sólo queda que realiceis vuestras acciones en el método que indicasteis a la hora de registrar el objeto B.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#pragma mark -</span>
<span style="color: #6e371a;">#pragma mark Notification methods</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>numberPadPressed <span style="color: #002200;">&#123;</span>
     <span style="color: #002200;">&#91;</span>importLabel setText<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>numberPadController input<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>En este ejemplo se ha usado para actualizar una etiqueta con el valor de la variable input, cada vez que ésta era cambiado.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zenbrains.com/blog/2010/07/seguir-cambios-o-eventos-con-notificaciones/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Obtener archivos creados en ejecución por nuestra aplicación</title>
		<link>http://www.zenbrains.com/blog/2010/07/obtener-archivos-creados-en-ejecucion-por-nuestra-aplicacion/</link>
		<comments>http://www.zenbrains.com/blog/2010/07/obtener-archivos-creados-en-ejecucion-por-nuestra-aplicacion/#comments</comments>
		<pubDate>Mon, 05 Jul 2010 16:02:20 +0000</pubDate>
		<dc:creator>Marcos</dc:creator>
				<category><![CDATA[Howto]]></category>
		<category><![CDATA[Sin categoria]]></category>
		<category><![CDATA[How_to]]></category>

		<guid isPermaLink="false">http://www.zenbrains.com/blog/?p=546</guid>
		<description><![CDATA[En este post veremos como podemos obtener archivos que nuestra aplicación cree durante su ejecución, ésto nos puede ser útil cuando queremos comprobar que se han creado correctamente o cuando queremos obtener la base de datos que estemos creando desde la aplicación. Para ello usaremos Xcode desde la ventana &#8220;organizer&#8221;, que podéis abrir desde el [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.zenbrains.com%2Fblog%2F2010%2F07%2Fobtener-archivos-creados-en-ejecucion-por-nuestra-aplicacion%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.zenbrains.com%2Fblog%2F2010%2F07%2Fobtener-archivos-creados-en-ejecucion-por-nuestra-aplicacion%2F&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>En este post veremos como podemos obtener archivos que nuestra aplicación cree durante su ejecución, ésto nos puede ser útil cuando queremos comprobar que se han creado correctamente o cuando queremos obtener la base de datos que estemos creando desde la aplicación.</p>
<p>Para ello usaremos Xcode desde la ventana &#8220;organizer&#8221;, que podéis abrir desde el menú ventana. Desde el organizer y con vuestro iPhone conectado tendremos acceso a las aplicaciones instaladas en éste, sólo tendremos acceso a nuestras aplicaciones. Localizamos nuestra aplicación y pulsamos sobres el triángulo de la izquierda para ver su contenido.</p>
<p>Ahora deveríamos estar viendo un icono de una caja, el típico icono de package de las instalaciones.</p>
<p><a href="http://www.zenbrains.com/blog/wp-content/uploads/2010/07/appData.png"><img src="http://www.zenbrains.com/blog/wp-content/uploads/2010/07/appData.png" alt="" title="appData" width="455" height="186" class="aligncenter size-full wp-image-557" /></a></p>
<p>Sólo nos queda arrastrar este icono al escritorio y obtendremos una carpeta con el contenido de las carpetas <em>Documents</em>, <em>Library</em> y <em>tmp</em> de nuestra aplicación y los archivos que contienen.</p>
<p><a href="http://www.zenbrains.com/blog/wp-content/uploads/2010/07/foldersApp.png"><img src="http://www.zenbrains.com/blog/wp-content/uploads/2010/07/foldersApp.png" alt="" title="foldersApp" width="424" height="217" class="aligncenter size-full wp-image-558" /></a></p>
<p>Con esto y el post anterior que nos mostraba como copiar un archivo a la carpeta documents, ya podemos acceder a cualquier archivo que creemos en nuestra aplicación.</p>
<p>Otra cosa a tener en cuenta es que si añadimos o modificamos archivos de esta carpeta, y arrastramos la carpeta de vuelta a nuestra aplicación en la ventana organizer, podremos meter cualquier archivo que queramos en las carpetas de la aplicación.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zenbrains.com/blog/2010/07/obtener-archivos-creados-en-ejecucion-por-nuestra-aplicacion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Copiar un archivo de nuestro proyecto a la carpeta documentos de nuestra aplicación</title>
		<link>http://www.zenbrains.com/blog/2010/07/copiar-un-archivo-de-nuestro-proyecto-a-la-carpeta-documentos-de-nuestra-aplicacion/</link>
		<comments>http://www.zenbrains.com/blog/2010/07/copiar-un-archivo-de-nuestro-proyecto-a-la-carpeta-documentos-de-nuestra-aplicacion/#comments</comments>
		<pubDate>Mon, 05 Jul 2010 09:07:55 +0000</pubDate>
		<dc:creator>Marcos</dc:creator>
				<category><![CDATA[Howto]]></category>
		<category><![CDATA[iPhoneSimulator]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[How_to]]></category>
		<category><![CDATA[Objective-C]]></category>

		<guid isPermaLink="false">http://www.zenbrains.com/blog/?p=549</guid>
		<description><![CDATA[Con este post mostraré como podemos copiar un archivo, que previamente hemos añadido a nuestro proyecto, a la carpeta documentos de nuestra aplicación. La idea es la de poder inicializar de una manera rápida y cómoda la base de datos, algún archivo de configuración que tengamos o cosas por el estilo que tenemos que guardar [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.zenbrains.com%2Fblog%2F2010%2F07%2Fcopiar-un-archivo-de-nuestro-proyecto-a-la-carpeta-documentos-de-nuestra-aplicacion%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.zenbrains.com%2Fblog%2F2010%2F07%2Fcopiar-un-archivo-de-nuestro-proyecto-a-la-carpeta-documentos-de-nuestra-aplicacion%2F&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Con este post mostraré como podemos copiar un archivo, que previamente hemos añadido a nuestro proyecto, a la carpeta documentos de nuestra aplicación. La idea es la de poder inicializar de una manera rápida y cómoda la base de datos, algún archivo de configuración que tengamos o cosas por el estilo que tenemos que guardar en la carpeta documentos de la aplicación porque durante ejecución sufrirán cambios realizados por el usuario, evitando así tener que crearlos desde el código de la aplicación.</p>
<p>Primero, lo que tenemos que hacer es añadir ese archivo al proyecto para tener acceso a él desde el código cuando se ejecuta la aplicación. Añadid el archivo a la carpeta &#8220;Resources&#8221; del proyecto.</p>
<p>Una vez tenemos el archivo en el proyecto, podemos añadir el código para copiar el archivo a la carpeta documentos, añadid el siguiente código en vuestro AppDelegate, podéis crearos una función nueva para inicializar los archivos que necesiteis, o añadirlo directamente al init del AppDelegate.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// Copy init.sqlite from resources to the Documents folder in bundle</span>
<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>storePath <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>self applicationDocumentsDirectory<span style="color: #002200;">&#93;</span> stringByAppendingPathComponent<span style="color: #002200;">:</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;data.sqlite&quot;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">!</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSFileManager</span> defaultManager<span style="color: #002200;">&#93;</span> fileExistsAtPath<span style="color: #002200;">:</span>storePath<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>
<span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>filePath <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSBundle</span> mainBundle<span style="color: #002200;">&#93;</span> pathForResource<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;init&quot;</span> ofType<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;sqlite&quot;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #400080;">NSData</span> <span style="color: #002200;">*</span>myData <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSData</span> dataWithContentsOfFile<span style="color: #002200;">:</span>filePath<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">!</span><span style="color: #002200;">&#91;</span>myData writeToFile<span style="color: #002200;">:</span>storePath atomically<span style="color: #002200;">:</span><span style="color: #a61390;">YES</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
		NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;ERROR writting the starting database&quot;</span><span style="color: #002200;">&#41;</span>;
	<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>En el ejemplo anterior usamos un archivo,<em> init.sqlite</em>, como base de datos inicial para nuestra aplicación y guardamos el mismo archivo bajo el nombre de <em>data.sqlite</em> en el directorio documentos de nuestra aplicación. Daos cuenta también de que usamos un if para comprobar si el archivo existe o no, de forma que sólo se ejecutará la primera vez que ejecutemos la aplicación, ésto es así, para que cuando nuestro usuario vaya añadiendo datos no se los borremos y carguemos siempre la base de datos inicial. Si durante las pruebas queréis volver a obtener el archivo original, eliminad la aplicación del iPhone o del iPhone Simulator.</p>
<p>El método <strong>applicationDocumentsDirectory</strong> es la siguiente función que nos devuelve la ruta a la carpeta.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">/**
 Returns the path to the application's Documents directory.
 */</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>applicationDocumentsDirectory <span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>NSSearchPathForDirectoriesInDomains<span style="color: #002200;">&#40;</span>NSDocumentDirectory, NSUserDomainMask, <span style="color: #a61390;">YES</span><span style="color: #002200;">&#41;</span> lastObject<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.zenbrains.com/blog/2010/07/copiar-un-archivo-de-nuestro-proyecto-a-la-carpeta-documentos-de-nuestra-aplicacion/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Los inicializadores en Objective-C</title>
		<link>http://www.zenbrains.com/blog/2010/06/los-inicializadores-en-objective-c/</link>
		<comments>http://www.zenbrains.com/blog/2010/06/los-inicializadores-en-objective-c/#comments</comments>
		<pubDate>Sat, 19 Jun 2010 17:50:19 +0000</pubDate>
		<dc:creator>Aram Julhakyan</dc:creator>
				<category><![CDATA[Howto]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Objective-C]]></category>

		<guid isPermaLink="false">http://www.zenbrains.com/blog/?p=526</guid>
		<description><![CDATA[En este artículo vamos explicar los métodos de inicialización de objetos en Objective-C. Veremos cómo sobrecargarlos correctamente y como crear nuestros propios de la forma más correcta. Antes que nada vamos a ver cómo solemos sobrecargar el método init en nuestras clases que heredan del NSObject y entender el porque lo hacemos así. -&#40;id&#41;init&#123; &#160; [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.zenbrains.com%2Fblog%2F2010%2F06%2Flos-inicializadores-en-objective-c%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.zenbrains.com%2Fblog%2F2010%2F06%2Flos-inicializadores-en-objective-c%2F&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>En este artículo vamos explicar los métodos de inicialización de objetos en Objective-C. Veremos cómo sobrecargarlos correctamente y como crear nuestros propios de la forma más correcta.</p>
<p>Antes que nada vamos a ver cómo solemos sobrecargar el método init en nuestras clases que heredan del NSObject y entender el porque lo hacemos así.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>init<span style="color: #002200;">&#123;</span>
&nbsp;
    <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>self <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>super init<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#123;</span>
&nbsp;
      <span style="color: #11740a; font-style: italic;">// Aquí incializamos nuestros variables</span>
&nbsp;
    <span style="color: #002200;">&#125;</span>
    <span style="color: #a61390;">return</span> self;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Con el [super init] inicializamos las variables de la clase padre. Esta inicialización está en un if para no inicializar nuestro código y devolver un objeto corrupto con variables a medio inicializar ya que si el [super init] devuelve un nil ya no entraremos dentro del if. De esta forma o retornamos un objeto completo o nil. Dentro del if al inicializar nuestras variables si se produce algún error tenemos que retornar nil.</p>
<p><strong>Regla</strong>: antes de incializar nuestras variables SIEMPRE tenemos que incializar la clase padre. Siempre vamos de arriba hacía abajo en la jerarquía.</p>
<p>Vamos a suponer que tenemos una clase Alumno definido de la siguiente manera:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> Alumno <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span> <span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>nombre;
	<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>apellido;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>nombre;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>apellido;
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>Y su implementación es la siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@implementation</span> Alumno
<span style="color: #a61390;">@synthesize</span> nombre, apellido;
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>Entonces, usaríamos esta clase de la siguiente manera:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">Alumno <span style="color: #002200;">*</span>a <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>Alumno alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
a.nombre <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Pepe&quot;</span>;
a.apellido <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Garcia&quot;</span>;
NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Nombre de alumno: %@ y  apellido: %@&quot;</span>, a.nombre, a.apellido<span style="color: #002200;">&#41;</span>;</pre></div></div>

<p>Fijaros que para inicializar llamamos el init que no está definido en nuestra clase pero viene heredada de la clase padre (NSObject) por lo que al hacer esta llamada las variables nombre y apellido no se inicializan pero si se inicializan las variables de la clase padre.<br />
Es natural querer que nuestra clase Alumno tenga un inicializador tipo &#8220;initConNombre:(NSString *)n yApellido:(NSString *)a&#8221;  que nos permita poner directamente el nombre y el apellido del alumno.</p>
<p>También puede que queramos un inicializador que sólo acepte el nombre del alumno tipo &#8220;initConNombre:(NSString *)n&#8221;.</p>
<p>Entonces, para organizar bien nuestros inicializadores, no duplicar código y asegurarnos que todas las variables se inicializan correctamente independientemente del incializador usado se usan los inicializadores designados (designed initializators).</p>
<p><strong>Inicializadores designados</strong></p>
<p>Cada clase ha de tener un inicializador designado y será este el único inicializador que llamara a [super init] y se encargará de inicializar todas las variables usados por nuestra clase. El resto de los inicializadores tendrán que llamar a este inicializador.</p>
<p>Volviendo a nuestra clase alumno. ¿Cuál es su inicializador designado?<br />
Lo tenemos que decidir nosotros. Casi siempre es el inicializador con más parámetros. En nuestro caso el inicializador por defecto sera este: -(id)initConNombre:(NSString *)n yApellido:(NSString *)a<br />
A continuación vamos a ver como implementaríamos los inicializadores de nuestra clase.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &quot;Alumno.h&quot;</span>
&nbsp;
<span style="color: #6e371a;">#define NOMRE_POR_DEFECTO @&quot;&quot;</span>
<span style="color: #6e371a;">#define APELLIDO_POR_DEFECTO @&quot;&quot;</span>
&nbsp;
<span style="color: #a61390;">@implementation</span> Alumno
<span style="color: #a61390;">@synthesize</span> nombre, apellido;
&nbsp;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>initConNombre<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>n yApellido<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>a
<span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>self <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>super init<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>
    <span style="color: #002200;">&#123;</span>
&nbsp;
    <span style="color: #002200;">&#125;</span>
    <span style="color: #a61390;">return</span> self;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>initConNombre<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>n<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>self initConNombre<span style="color: #002200;">:</span>n yApellido<span style="color: #002200;">:</span>APELLIDO_POR_DEFECTO<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>init<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>self initConNombre<span style="color: #002200;">:</span>NOMRE_POR_DEFECTO<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>Fijaros como desde el init llamamos al siguiente inicializador pasándole el valor por defecto, a su vez el siguiente inicializador llama al inicializador por defecto quien es el único en hacer el [super init] e incializar las variables del Alumno. Esto en la jerga de Objective-C se llama &#8220;initialization chain&#8221;. Usar cadenas de inicialización reduce la probabilidad de que cometamos errores y facilita el mantenimiento del código.</p>
<p>También es muy importante darse cuenta del porque definimos nuestro propio init sobreescribiendo el init (que es el init designado) del NSObject. Si no lo hubieramos hecho al hacer [[Alumno alloc] init] inicializaríamos las variables del NSObject pero no las de Alumno. Al sobreescribirlo conseguimos inicializar tanto nuestras variables como las de la clase padre. Siempre, al heredar de una clase tenemos que sobreescribir el inicializador designado de esa clase.</p>
<p><strong>Resumen de las tres reglas (recomendaciones)</strong></p>
<p><strong>Regla 1</strong>: antes de incializar nuestras variables SIEMPRE tenemos que incializar la clase padre. Siempre vamos de arriba hacía abajo en la jerarquía.</p>
<p><strong>Regla 2</strong>: los inicializadores de nuestras clases siempre tienen que acabar llamando al inicializador designado de nuestra clase.</p>
<p><strong>Regla 3</strong>: siempre tenemos que sobreescribir el inicializador designado de la clase de la que heredamos.</p>
<p>Podéis descargar el código con el ejemplo que hemos visto en este artículo.<br />
<a href="http://www.zenbrains.com/blog/wp-content/uploads/2010/06/Inicializadores1.zip">Inicializadores</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.zenbrains.com/blog/2010/06/los-inicializadores-en-objective-c/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Color de fondo de celdas vacías</title>
		<link>http://www.zenbrains.com/blog/2010/06/color-de-fondo-de-celdas-vacias/</link>
		<comments>http://www.zenbrains.com/blog/2010/06/color-de-fondo-de-celdas-vacias/#comments</comments>
		<pubDate>Sun, 13 Jun 2010 21:14:16 +0000</pubDate>
		<dc:creator>Marcos</dc:creator>
				<category><![CDATA[Howto]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[How_to]]></category>
		<category><![CDATA[Objective-C]]></category>

		<guid isPermaLink="false">http://www.zenbrains.com/blog/?p=516</guid>
		<description><![CDATA[Cuando trabajamos con tablas (UITableView), podemos crear celdas personalizadas a través de Interface Builder o crearlas directamente desde el código, el problem aparece cuando cambiamos el color de fondo por otro que no sea blanco y sólo creamos la celda cuando vamos a mostrar datos, pero no hacemos nada para las celdas vacías. Nos encontramos [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.zenbrains.com%2Fblog%2F2010%2F06%2Fcolor-de-fondo-de-celdas-vacias%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.zenbrains.com%2Fblog%2F2010%2F06%2Fcolor-de-fondo-de-celdas-vacias%2F&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Cuando trabajamos con tablas (UITableView), podemos crear celdas personalizadas a través de Interface Builder o crearlas directamente desde el código, el problem aparece cuando cambiamos el color de fondo por otro que no sea blanco y sólo creamos la celda cuando vamos a mostrar datos, pero no hacemos nada para las celdas vacías.</p>
<p>Nos encontramos con algo como esto</p>
<p><a href="http://www.zenbrains.com/blog/wp-content/uploads/2010/06/tabla1.png"><img src="http://www.zenbrains.com/blog/wp-content/uploads/2010/06/tabla1.png" alt="" title="Tabla1" width="320" height="480" class="aligncenter size-full wp-image-517" /></a></p>
<p>Esto nos pasa porque sólo creamos la celda con fondo cuando tenemos datos para rellenar, tenemos dos opciones para solucionarlo:</p>
<ul>
<li> Programar nuestro código de forma que cuando rellenamos la tabla se consideren los casos en que no hay datos, es decir cargar una celda pero sin las etiquetas o imágenes.</li>
<li>Poner a todas las celdas el mismo color de fondo antes de mirar nada.</li>
</ul>
<p>Con esta segunda opción, es la más rápida, podemos darle el mismo color a todas las celdas, la única manera de hacerlo sin crearnos una celda personalizada, sin nada más que el fondo para celdas vacías desde Interface Builder, es hacerlo dentro del código:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// Customize the appearance of table view cells.</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>UITableViewCell <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITableView <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>tableView cellForRowAtIndexPath<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSIndexPath</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>indexPath <span style="color: #002200;">&#123;</span>
&nbsp;
    <span style="color: #a61390;">static</span> <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>CellIdentifier <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Cell&quot;</span>;
&nbsp;
    UITableViewCell <span style="color: #002200;">*</span>cell <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>tableView dequeueReusableCellWithIdentifier<span style="color: #002200;">:</span>CellIdentifier<span style="color: #002200;">&#93;</span>;
    <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>cell <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
        cell <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UITableViewCell alloc<span style="color: #002200;">&#93;</span> initWithStyle<span style="color: #002200;">:</span>UITableViewCellStyleDefault reuseIdentifier<span style="color: #002200;">:</span>CellIdentifier<span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#125;</span>
&nbsp;
    <span style="color: #11740a; font-style: italic;">// Configure the cell.</span>
    <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>cell contentView<span style="color: #002200;">&#93;</span> setBackgroundColor<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>UIColor colorWithRed<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span> green<span style="color: #002200;">:</span><span style="color: #2400d9;">128</span><span style="color: #002200;">/</span>255.f blue<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span> alpha<span style="color: #002200;">:</span><span style="color: #2400d9;">1</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;    
    <span style="color: #a61390;">return</span> cell;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>La linea que nos interesa es la que llama al método <em>setBackgroundColor:</em>, con esta linea es la que le damos el color que queremos. Daros cuanta de que usamos<em> [cell contentView]</em>, tenemos que cambiar el color de la contentView, esta es la clave de que no se pueda hacer desde Interface Builder directamente cuando añadimos una tabla, desde la tabla no podemos acceder al contenido de la celda sin añadir explicitamente las celdas.</p>
<p>Con esa linea obtendremos algo cómo esto<br />
<a href="http://www.zenbrains.com/blog/wp-content/uploads/2010/06/tabla2.png"><img src="http://www.zenbrains.com/blog/wp-content/uploads/2010/06/tabla2.png" alt="" title="tabla2" width="320" height="480" class="aligncenter size-full wp-image-518" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.zenbrains.com/blog/2010/06/color-de-fondo-de-celdas-vacias/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

