<?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>Mindbike</title>
	<atom:link href="http://www.mindbike.com.br/blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.mindbike.com.br/blog</link>
	<description>Mobile Developers</description>
	<lastBuildDate>Thu, 14 Oct 2010 19:32:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.5</generator>
		<item>
		<title>Apostila iPhone &#8211; Distribuição AdHoc &#8211; Parte II</title>
		<link>http://www.mindbike.com.br/blog/?p=434</link>
		<comments>http://www.mindbike.com.br/blog/?p=434#comments</comments>
		<pubDate>Thu, 14 Oct 2010 19:32:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Mindbike]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[XCode]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://www.mindbike.com.br/blog/?p=434</guid>
		<description><![CDATA[Compilando aplicação com o Provisioning Depois de efetuar o download deste provisioning, arraste este provisioning até o XCode. Isto fará com que o provisioning seja instalado no XCode automaticamente. Após esta instalação você precisa gerar uma versão de distribuição dentro do XCode para a sua aplicação. Selecione o nome do projeto e click em cima [...]]]></description>
			<content:encoded><![CDATA[<p><span><strong>Compilando aplicação com o Provisioning</strong></span></p>
<p><span><span> </span>Depois de efetuar o download deste provisioning, arraste este provisioning até o XCode. Isto fará com que o provisioning seja instalado no XCode automaticamente. Após esta instalação você precisa gerar uma versão de distribuição dentro do XCode para a sua aplicação. Selecione o nome do projeto e click em cima do botão “info” na barra de menu.</span></p>
<p><img class="alignleft size-large wp-image-435" title="figura-65" src="http://www.mindbike.com.br/blog/wp-content/uploads/2010/10/figura-65-1024x640.png" alt="figura-65" width="614" height="384" /></p>
<p><span>Vá até a opção <em>Configurations</em> e duplique a versão <em>Release</em>. Para isso, de um click em cima dela e selecione <em>Duplicate</em> na parte de baixo da tela.</span></p>
<p><span><span> </span>Após este passo, vamos relacionar o provisioning com a aplicação. Na pasta target, de um click no arquivo e novamente selecione “info” na barra de menu.</span></p>
<p><img class="alignleft size-large wp-image-436" title="figura-66" src="http://www.mindbike.com.br/blog/wp-content/uploads/2010/10/figura-66-1024x640.png" alt="figura-66" width="614" height="384" /></p>
<p><span>Selecione a pasta <em>Build</em> e selecione o provisioning adequado (aquele que você arrastou para o XCode) na opção <em>Any iPhone OS Device</em>. Agora selecione a pasta <em>Properties</em>.</span></p>
<div><span><img class="alignleft size-large wp-image-437" title="figura-67" src="http://www.mindbike.com.br/blog/wp-content/uploads/2010/10/figura-67-1024x640.png" alt="figura-67" width="614" height="384" /><br />
</span></div>
<p><span>Na opção <em>Identifier</em> você deve colocar exatamente o <strong>App ID</strong> que você criou no portal para a sua aplicação. Outra forma de fazer isso é modificar o arquivo info.plist.</span></p>
<p><img class="alignleft size-large wp-image-438" title="figura-68" src="http://www.mindbike.com.br/blog/wp-content/uploads/2010/10/figura-68-1024x640.png" alt="figura-68" width="614" height="384" /></p>
<p><span>Repare que o nome descrito no App ID é o mesmo da aplicação, no caso myShow. Agora é só compilar e instalar sua aplicação nos devices que você cadastrou no Portal. Lembre-se que junto com a sua aplicação você deve instalar junto o provisioning, para tanto arraste tanto a aplicação como o provisioning para o iTunes. Assim que o iTunes sincronizar com o device ele irá instalar a sua aplicação. Existe um pequeno tutorial dentro do Portal que explica minuciosamente os passos para gerar cada tipo de distribuição.</span></p>
<p><span><strong>Distribuição Apple Store</strong></span></p>
<p><span><span> </span>Para a distribuição via Apple Store, temos que fazer quase todos os procedimentos descritos anteriormente, a diferença está que ao invés de criar um provisioning do tipo AdHoc, nós criamos para Apple Store. Isto fará com que você não necessite informar em qual devices pretende instalar a sua aplicação visto que na verdade você deseja que qualquer device que acesse o iTunes possa fazer o download da sua aplicação.</span></p>
<p><span><span> </span>Depois de fazer o download da seu provisioning você irá seguir os mesmos passos para compilar o seu novo provisioning com sua aplicação. A grande diferença está no fato de você ter que submeter sua aplicação depois de compilada no iTunes Connect.</span></p>
<div style="text-align: right;"><span><em>(@Ademar Varela)</em></span></div>
<div style="text-align: right;"><span><br />
</span></div>
]]></content:encoded>
			<wfw:commentRss>http://www.mindbike.com.br/blog/?feed=rss2&#038;p=434</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apostile iPhone &#8211; Distribuição de Aplicações / Adhoc</title>
		<link>http://www.mindbike.com.br/blog/?p=430</link>
		<comments>http://www.mindbike.com.br/blog/?p=430#comments</comments>
		<pubDate>Sat, 02 Oct 2010 13:53:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Mindbike]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[XCode]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://www.mindbike.com.br/blog/?p=430</guid>
		<description><![CDATA[Existe duas possibilidades de distribuir nossas aplicações, AdHoc e Apple Store. Porém vale lembrar que para qualquer uma delas é necessário ter uma licença de desenvolvimento. Esta licença você obtém no site da Apple e convém ler atentamente toda a documentação antes de entrar com as suas informções. Muitas pessoas me perguntam se o envio [...]]]></description>
			<content:encoded><![CDATA[<p><span><span> </span>Existe duas possibilidades de distribuir nossas aplicações, <em>AdHoc</em> e <em>Apple</em> <em>Store</em>. Porém vale lembrar que para qualquer uma delas é necessário ter uma licença de desenvolvimento. Esta licença você obtém no site da Apple e convém ler atentamente toda a documentação antes de entrar com as suas informções. Muitas pessoas me perguntam se o envio de informações delicadas, como cartão de crédito, é confiável. Eu sempre respondo que nunca ouvi falar que qualquer problema tenha ocorrido com estas informações. A própria Apple não tem interesse que profissionais ligados a ela através de uma plano de desenvolvimento sejam prejudicados de alguma forma. Mas vale cautela em qualquer operação financeira, e esta no final das contas não deixa de ser mais uma.</span></p>
<p><span><span> </span>Antes de começarmos a explicação de como fazer uma licença de distribuição, é importante falar que antes de tudo é necessário criar um certificado para a máquina em que você está desenvolvendo. Estes passos estão descritos no Portal do Desenvolvedor, que você irá acessar assim que tiver a sua licença liberada.</span></p>
<p><span><strong>Distribuição AdHoc</strong></span></p>
<p><span><span> </span>Uma das formas mais tradicionais para você testar a sua aplicação é utilizar uma distribuição do tipo AdHoc. Esta distribuição permite também que você distribua sua aplicação para um determinado número de devices (iPhones ou iPods Touch). Este número varia de acordo com a licença que você adquiriu. Mas vamos ao que interessa, como colocar uma aplicação em um device. Este tipo de distribuição é muito dependente do Portal do Desenvolvedor, ao contrário da distribuição pela Apple Store (que utiliza somente o essêncial do Portal).</span></p>
<p><strong>iPhone Developer Program Portal</strong></p>
<p><span><span> </span>Vamos conhecer o Portal do Desenvolvedor. Como dito anteriormente, você só tem acesso ao portal depois que tem a sua licença liberada pela Apple. Para acessar o Portal, vá até o link: <a href="http://developer.apple.com/iphone/program/"><span>http://developer.apple.com/iphone/program/</span></a></span></p>
<p><img class="alignleft size-large wp-image-431" title="figura-63" src="http://www.mindbike.com.br/blog/wp-content/uploads/2010/10/figura-63-1024x640.png" alt="figura-63" width="614" height="384" /></p>
<p><span>Na parte superior da página, existe um pequeno menu, selecione <em>Dev Centers</em> / <em>iPhone Dev Center</em>. Faça o login normalmente.</span></p>
<p><span><span> </span>Neste Dev Center, você tem diversas informações, tais como referências, códigos fontes, downloads, fórum, ferramentas, etc.</span></p>
<p><span><span> </span>Use este Dev Center, ele é muito útil no nosso dia a dia.</span></p>
<p><span><span> </span>Do lado direito encontramos um pequeno menu, onde podemos selecionar:</span></p>
<ul>
<li>
<ul>
<li><span><em></em></span><span><em>iPhone Developer Program Portal;</em></span></li>
<li><span><em></em></span><span><em>iTunes Connect;</em></span></li>
<li><span><em></em></span><span><em>Apple Developer Forums;</em></span></li>
<li><span><em></em></span><span><em>Developer Support Center;</em></span></li>
<li><span><em></em></span><span><em>Marketing Resources.</em></span></li>
</ul>
</li>
</ul>
<p><span><span> </span>De um click na primeira opção, iPhone Developer Program Portal.</span></p>
<div><img class="alignleft size-large wp-image-432" title="figura-64" src="http://www.mindbike.com.br/blog/wp-content/uploads/2010/10/figura-64-1024x640.png" alt="figura-64" width="614" height="384" /></div>
<div></div>
<div></div>
<div></div>
<div><span><br />
</span></div>
<p><span><span><span><span> </span>Do lado esquerdo temos outro pequeno menu com as opções, <em>Home</em>, <em>Team</em>, <em>Certificates</em>, <em>Devices</em>, <em>App</em> <em>IDs</em>, <em>Provisioning</em> e <em>Distribution</em>.</span></p>
<ul>
<li>
<ul>
<li><span><strong>Home</strong>: Como o próprio nome diz, toda vez que você clicar nesta opção, a página que será exibida é exatamente esta tela inicial que estamos vendo neste momento. Geralmente encontramos algumas dicas interessantes nesta página, ela é dinâmica e muda com uma certa freqüência.</span></li>
<li><span><strong>Team</strong>: É a página onde você irá informar quais são os desenvolvedores que fazer parte do seu time. Para quem usa uma licença individual, basta informar o nome do único desenvolvedor do seu time, no caso você mesmo.</span></li>
<li><span><strong>Certificates</strong>: Como dito no início deste estudo, é necessário gerar um certificado da sua máquina de desenvolvimento. Depois de criado este certificado, você irá fazer um upload deste certificado para dentro do Portal. Depois de fazer este upload, a Apple vai gerar um arquivo de certificação que você irá fazer o download e instalar na sua máquina de desenvolvimento.</span></li>
<li><span><strong>Devices</strong>: É a página aonde você irá cadastrar o Identificador do iPhone e/ou iPod Touch. Para conseguir mais facilmente este identificador, entre no <em>iTunes</em> com o device conectado e de um click em cima da opção <em>Serial</em> <em>Number</em>, isto fará com que o label mude para <em>Identifier</em> (<em>UDID</em>). Este número tem 40 dígitos e deve ser informado no momento que você estiver cadastrando o seu device (ou o device de um amigo).</span></li>
<li><span><strong>App IDs</strong>: Nesta página vamos gerar um identificador para a nossa aplicação. Note, que este momento não é adequado para você ter uma crise artística e inventar um nome mirabolante para a sua aplicação. Isto deve ser feito quando você estiver codificando e o nome da aplicação que você irá informar aqui, deve ser exatamente igual ao nome que você utilizou para criar a sua aplicação. Quando falo exatamente, é exatamente, inclusive respeitando letras maiúsculas e minúsculas.</span></li>
<li><span><strong>Provisioning</strong>: Esta é a página mais importante no processo de distribuição. É nela que vamos criar um arquivo do tipo provisioning que será usado na nossa aplicação. É nesta página que definimos se vamos criar uma distribuição <em>AdHoc</em> ou <em>Apple Store</em>. Se você escolher uma AdHoc, você irá informar em quais devices (aqueles que você cadastrou na opção Device) irão receber a aplicação.</span></li>
<li><span><strong>Distribution</strong>: Nesta página temos diversas informações sobre distribuição de aplicações. Nesta página também temos um link direto com o <em>iTunes Connect</em> onde podemos colocar uma aplicação na Apple Store.</span></li>
</ul>
</li>
</ul>
<p><span><span> </span>Não fique preocupado, cada uma dessas opções tem um pequeno tutorial que explica detalhadamente como você deve usar o Portal.</span></p>
<p><span><span> </span>Como estamos estudando a forma de gerar uma distribuição AdHoc, vamos ter que passar por quase todas estas etapas que foram mostradas acima. Quando entrarmos na opção Provisioning, vamos escolher AdHoc e informar quais os devices que pretendemos rodar a nossa aplicação. Depois disso, o Portal vai liberar um download que é um provision que será usado na nossa aplicação.</span></p>
<div style="text-align: right;"><span><em>(@AdemarVarela)</em></span></div>
<div style="text-align: right;"><span><br />
</span></div>
<p></span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mindbike.com.br/blog/?feed=rss2&#038;p=430</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Apostila iPhone &#8211; Webservice</title>
		<link>http://www.mindbike.com.br/blog/?p=428</link>
		<comments>http://www.mindbike.com.br/blog/?p=428#comments</comments>
		<pubDate>Sun, 26 Sep 2010 11:26:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Mindbike]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[XCode]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://www.mindbike.com.br/blog/?p=428</guid>
		<description><![CDATA[Uma forma de acessar informações sem usar a base de dados do próprio iPhone é acessá-las através de um  webservice. Para fazermos este tipo de acesso é necessário criar uma estrutura XML e aplicar em um link hospedado em um servidor de dados. Montando uma estrutura XML Vamos supor que você precise acessar um webservice [...]]]></description>
			<content:encoded><![CDATA[<p><span>Uma forma de acessar informações sem usar a base de dados do próprio iPhone é acessá-las através de um  webservice. Para fazermos este tipo de acesso é necessário criar uma estrutura XML e aplicar em um link hospedado em um servidor de dados.</span></p>
<p><span><strong>Montando uma estrutura XML</strong></span></p>
<p><span><span> </span>Vamos supor que você precise acessar um webservice informando qual a sua localização de GPS, para isto vamos montar uma estrutura XML que receba os parâmetros de latitude e longitude.</span></p>
<p><span><span> </span></span><span>NSString</span><span> *soapMessage = [</span><span>NSString</span><span> </span><span>stringWithFormat</span><span>:</span></p>
<p><span><span> </span></span><span>@"&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\n"</span></p>
<p><span><span> </span></span><span>"&lt;soap:Envelope xmlns:xsi=\"<a href="http://www.w3.org/2001/XMLSchema-instance"><span>http://www.w3.org/2001/XMLSchema-instance</span></a>\" xmlns:xsd=\"<a href="http://www.w3.org/2001/XMLSchema"><span>http://www.w3.org/2001/XMLSchema</span></a>\" xmlns:soap=\"<a href="http://schemas.xmlsoap.org/soap/envelope/"><span>http://schemas.xmlsoap.org/soap/envelope/</span></a>\"&gt;\n"</span></p>
<p><span><span> </span></span><span>"&lt;soap:Body&gt;\n"</span></p>
<p><span><span> </span></span><span>"&lt;GetAllOffers xmlns=\"AcessoFacil.OfertaFacil\"&gt;\n"</span></p>
<p><span><span> </span></span><span>"&lt;latitude&gt;%@&lt;/latitude&gt;\n"</span></p>
<p><span><span> </span></span><span>"&lt;longitude&gt;%@&lt;/longitude&gt;\n"</span></p>
<p><span><span> </span></span><span>"&lt;/GetAllOffers&gt;"</span></p>
<p><span><span> </span></span><span>"&lt;/soap:Body&gt;\n"</span></p>
<p><span><span> </span></span><span>"&lt;/soap:Envelope&gt;\n"</span><span>,</span><span>latitudeString</span><span>, </span><span>longitudeString</span><span>];</span></p>
<p><span><span> </span>Na estrutura acima, criamos uma variável do tipo NSString chamada soapMessage. Nesta variável, colocamos uma string que na verdade é uma estrutura XML, repare que deixamos nas tags de latitude e longitude a possibilidade de atribuição de conteúdo, pois usamos “%@”, no final da estrutura estamos informando a latitude e longitude. Claro que estas variáveis já foram carregadas da maneira correta e usando as premissas do uso do GPS.</span></p>
<p><strong>Evocando o webservice</strong></p>
<p><span><span> </span>Depois de montada a estrutura XML que usaremos para usar no webservice, vamos executa-lo:</span></p>
<p><span>NSURL</span><span> *url = [</span><span>NSURL</span><span> </span><span>URLWithString</span><span>:</span><span>@"<a href="http://201.28.113.4/ofertafacil_dev/AcessoFacilOfertaFacil.asmx"><span>http://201.28.113.4/ofertafacil_dev/AcessoFacilOfertaFacil.asmx</span></a>"</span><span>];</span></p>
<p><span>NSMutableURLRequest</span><span> *theRequest = [</span><span>NSMutableURLRequest</span><span> </span><span>requestWithURL</span><span>:url];</span></p>
<p><span>NSString</span><span> *msgLength = [</span><span>NSString</span><span> </span><span>stringWithFormat</span><span>:</span><span>@"%d"</span><span>, [soapMessage </span><span>length</span><span>]];</span></p>
<p><span>[theRequest </span><span>addValue</span><span>: cookieSessionID </span><span>forHTTPHeaderField</span><span>:</span><span>@"Cookie"</span><span>];</span></p>
<p><span>[theRequest </span><span>addValue</span><span>: </span><span>@"text/xml; charset=utf-8"</span><span> </span><span>forHTTPHeaderField</span><span>:</span><span>@"Content-Type"</span><span>];</span></p>
<p><span>[theRequest </span><span>addValue</span><span>: </span><span>@"AcessoFacil.OfertaFacil/GetAllOffers"</span><span> </span><span>forHTTPHeaderField</span><span>:</span><span>@"SOAPAction"</span><span>];</span></p>
<p><span>[theRequest </span><span>addValue</span><span>: msgLength </span><span>forHTTPHeaderField</span><span>:</span><span>@"Content-Length"</span><span>];</span></p>
<p><span>[theRequest </span><span>setHTTPMethod</span><span>:</span><span>@"POST"</span><span>];</span></p>
<p><span>[theRequest </span><span>setHTTPBody</span><span>: [soapMessage </span><span>dataUsingEncoding</span><span>:</span><span>NSUTF8StringEncoding</span><span>]];</span></p>
<p><span>NSURLConnection</span><span> *theConnection = [[</span><span>NSURLConnection</span><span> </span><span>alloc</span><span>] </span><span>initWithRequest</span><span>:theRequest </span><span>delegate</span><span>:</span><span>self</span><span>];</span></p>
<p><span><span> </span>Primeiramente criamos uma variável do tipo URL, fazemos isto para poder criar um componente compatível com o necessário para acessar o serviço. É neste momento que vamos informar o link aonde contém o serviço que pretendemos usar. Depois criamos a requisição do serviço com o componente NSMutableURLRequest. Observe que na inicialização deste componente, estamos usando a URL anteriormente declarada. </span></p>
<p><span><span> </span>Toda vez que precisamos executar um webservice, nós precisamos informar qual o tamanho da estrutura que vamos submeter, por esta razão precisamos definir o tamanho da estrutura com a função length. Depois disso, precisamos passar o que chamamos de cookies do serviço. Para terminar informamos qual o método que usaremos para executar o serviço, o corpo da requisição e por fim, fazemos a conexão.</span></p>
<p><span><strong>Informando Headers</strong></span></p>
<p><span><span> </span>Em algumas situações precisamos acrescentar o que chamamos de header no webservice, para isso, antes de executar o serviço, precisamos usar o seguinte código:</span></p>
<p><span><span> </span></span><span>NSString</span><span> *headerCookie = </span><span>@&#8221;ASP.NET_SessionId=&#8221;</span><span>;</span></p>
<p><span><span> </span></span><span>NSString</span><span> *cookieSessionID = [</span><span>NSString</span><span> </span><span>stringWithFormat</span><span>:headerCookie];</span></p>
<p><span><span> </span>cookieSessionID = [cookieSessionID </span><span>stringByAppendingString</span><span>:</span><span>sessionID</span><span>];</span></p>
<p><span><span> </span>No exemplo acima, estamos criando uma variável do tipo NSString, que inicializamos com a variável que pretendemos passar pelo header do serviço. Depois é só concatenar o conteúdo da variável à string e executar no momento que chamamos o webservice:</span></p>
<p><span><span> </span>[theRequest </span><span>addValue</span><span>: cookieSessionID </span><span>forHTTPHeaderField</span><span>:</span><span>@"Cookie"</span><span>];</span></p>
<div style="text-align: right;"><span><em>(@AdemarVarela)</em></span></div>
<div style="text-align: right;"><span><br />
</span></div>
]]></content:encoded>
			<wfw:commentRss>http://www.mindbike.com.br/blog/?feed=rss2&#038;p=428</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apostila iPhone &#8211; Acelerômetro</title>
		<link>http://www.mindbike.com.br/blog/?p=426</link>
		<comments>http://www.mindbike.com.br/blog/?p=426#comments</comments>
		<pubDate>Mon, 20 Sep 2010 11:28:42 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Mindbike]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[XCode]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://www.mindbike.com.br/blog/?p=426</guid>
		<description><![CDATA[Vamos agora conhecer outro grande astro do mundo do iPhone, o acelerômetro. Esta implementação causou grande agito quando o iPhone foi lançado, e hoje com todas as operadoras implementando esta feature nos seus celulares, perdeu um pouco do encanto, mas continua com o seu charme. Para usarmos esta feature, não é necessário nenhum grande conhecimento [...]]]></description>
			<content:encoded><![CDATA[<p><span><span> </span>Vamos agora conhecer outro grande astro do mundo do iPhone, o acelerômetro. Esta implementação causou grande agito quando o iPhone foi lançado, e hoje com todas as operadoras implementando esta feature nos seus celulares, perdeu um pouco do encanto, mas continua com o seu charme.</span></p>
<p><span><span> </span>Para usarmos esta feature, não é necessário nenhum grande conhecimento de Física ou Geometria. Para dizer a verdade é muito simples usar este conceito, pois na verdade a sua implementação já vem com o SDK, o que vamos fazer é apenas informar o que desejamos fazer quando movimentarmos o iPhone.</span></p>
<p><span><span> </span>Para implementarmos o uso do acelerômetro na nossa programação basta implementarmos o seguinte método:</span></p>
<p><span>- (</span><span>void</span><span>)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {</span></p>
<p><span>}</span></p>
<p><span><span> </span>Este método já está declarado n SDK e por esta razão não é necessário declara-lo novamente. Para configurarmos a tolerância do movimento que pretendemos dar à aplicação trabalhamos com a função fabsf. Passamos como parâmetro para esta função a aceleração que está sendo efetuada no aparelho. Se ajudar você, aceleração seria o quão brusco está sendo o movimento exercido no iPhone. Estes parâmetros também já estão configurados para os 3 eixos: x, y e z. No caso, os valores contidos em acceleration.x, acceleration.y e acceleration.z trazem a variação causada pelo usuário no iPhone.</span></p>
<p><span><span> </span>Portanto, se você deseja configurar que uma determinada ação só ocorra caso o usuário faça um determinado movimento, você pode usar o seguinte código:</span></p>
<p><span><span> </span></span></p>
<p><span>- (</span><span>void</span><span>)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {</span></p>
<p><span><span> </span></span><span>if</span><span> (fabsf(acceleration.x) &gt; </span><span>kAccelerationThreshold</span><span> || fabsf(acceleration.y) &gt; </span><span>kAccelerationThreshold</span><span> || fabsf(acceleration.z) &gt; </span><span>kAccelerationThreshold</span><span>) {</span></p>
<p><span> &#8230;.</span></p>
<p><span><span> </span>}<span> </span></span></p>
<p><span>}</span></p>
<p><span><span> </span>Observem que dentro do método accelerometer, estamos limitando o movimento do usuário dentro do comando if. No caso estamos verificando se os eixos sofreram um movimento dentro do parâmetro </span><span>kAccelerationThreshold</span><span>. Neste caso específico, nós deveríamos ter definido o valor desta variável anteriormente, geralmente em um .h, por exemplo: </span><span>#define kAccelerationThreshold </span><span>1.2</span><span>. Completando o estudo, quanto menos este número mais sensível é o movimento captado pelo código.</span></p>
<p style="text-align: right;"><em>(@AdemarVarela)</em></p>
<p style="text-align: right;">
]]></content:encoded>
			<wfw:commentRss>http://www.mindbike.com.br/blog/?feed=rss2&#038;p=426</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Apostila iPhone &#8211; GPS</title>
		<link>http://www.mindbike.com.br/blog/?p=423</link>
		<comments>http://www.mindbike.com.br/blog/?p=423#comments</comments>
		<pubDate>Thu, 16 Sep 2010 20:10:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Mindbike]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[XCode]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://www.mindbike.com.br/blog/?p=423</guid>
		<description><![CDATA[Agora vamos ver algo um pouco mais divertido, e que faz um grande sucesso no mundo do iPhone, o famoso GPS. Vamos lembrar porém, que no simulador, o GPS segue parâmetros fixos, pois o computador não possui GPS. Ele mantém estes valores fixos, apenas com a intenção de ajudar no nosso desenvolvimento. Com o GPS [...]]]></description>
			<content:encoded><![CDATA[<p><span>Agora vamos ver algo um pouco mais divertido, e que faz um grande sucesso no mundo do iPhone, o famoso GPS. Vamos lembrar porém, que no simulador, o GPS segue parâmetros fixos, pois o computador não possui GPS. Ele mantém estes valores fixos, apenas com a intenção de ajudar no nosso desenvolvimento.</span></p>
<p><span><span> </span>Com o GPS podemos ter acesso às seguintes informações:</span></p>
<ul>
<li>
<ul>
<li><span><strong>Ponto</strong> <strong>Inicial</strong>: Podemos marcar um ponto inicial do uso do GPS. Este ponto inicial pode ser útil caso precisemos saber qual uma distância percorrida, por exemplo.</span></li>
<li><span><strong>Latitude</strong>: Como o nome diz, informa a Latitude da sua localização em graus.</span></li>
<li><span><strong>Longitude</strong>: Adivinha? Informa a Longitude da sua localização em graus.</span></li>
<li><span><strong>Altitude</strong>: Informa a Altitude que você se encontra.</span></li>
</ul>
</li>
</ul>
<p><span><span> </span>Para usarmos o GPS do iPhone, é necessário acrescentar um framework no nosso projeto. No caso vamos adicionar o framework <em>CoreLocation</em>. Este framework já possui uma série de métodos prontos para serem usados, o que torna a nossa vida mais tranquila. Perceba que vamos chamar apenas métodos prontos para conseguir as nossas coordenadas GPS.</span></p>
<p><span><span> </span></span></p>
<p><span><span> </span>Antes de iniciarmos, vale uma informação importante. Quando o local aonde você se encontra não consegue receber o sinal GPS (isto ocorre muito em ambientes fechados), ele parte para o sistema de triangulação de antenas. Este sistema de triangulação não é uma localização precisa. Para manter um sistema preciso usando GPS mesmo, é necessário fazer algumas implementações para consistir a perda de sinal GPS e projetar a falta do mesmo. Mas isso poderemos aprender em outra ocasião.</span></p>
<p><span><span> </span>Vamos criar um projeto chamado iGPS.</span></p>
<p><strong>Adicionando o CoreLocation</strong></p>
<p><span><span> </span>Vamos agora adicionar o framework CoreLocation. Depois de criado o projeto, de um click na pasta Frameworks. Vá até o Menu <em>Project</em> / <em>Add</em> <em>to</em> <em>Project</em>:</span></p>
<p><img class="alignleft size-large wp-image-424" title="figura-581" src="http://www.mindbike.com.br/blog/wp-content/uploads/2010/09/figura-581-1024x640.png" alt="figura-581" width="614" height="384" /></p>
<p><span>Ao escolher Add to Project, selecione o seguinte caminho:</span></p>
<ul>
<li>
<ul>
<li><span>HD;</span></li>
<li><span>Developer;</span></li>
<li><span>Platforms</span></li>
<li><span>iPhone Simulator;</span></li>
<li><span>Developer;</span></li>
<li><span>SDK;</span></li>
<li><span>iPhoneSimulator 3.0 (ou 3.1);</span></li>
<li><span>System;</span></li>
<li><span>Library;</span></li>
<li><span>Frameworks;</span></li>
</ul>
</li>
</ul>
<p><span><span> </span>Ao chegar neste caminho selecione CoreLocation.framework.</span></p>
<p><span><span> </span>No arquivo MainViewController.h, implemente o seguinte código:</span></p>
<p><span>#import </span><span>&#8220;FlipsideViewController.h&#8221;</span></p>
<p><span>#import </span><span>&lt;CoreLocation/CoreLocation.h&gt;</span></p>
<p><span>@interface</span><span> MainViewController : UIViewController &lt;FlipsideViewControllerDelegate, CLLocationManagerDelegate&gt; {</span></p>
<p><span><span> </span>CLLocationManager    *locationManager;</span></p>
<p><span><span> </span>CLLocation           *startingPoint;</span></p>
<p><span><span> </span></span><span>UILabel</span><span> *latitudeLabel;</span></p>
<p><span><span> </span></span><span>UILabel</span><span> *longitudeLabel;</span></p>
<p><span><span> </span></span><span>UILabel</span><span> *horizontalAccuracyLabel;</span></p>
<p><span><span> </span></span><span>UILabel</span><span> *altitudeLabel;</span></p>
<p><span><span> </span></span><span>UILabel</span><span> *verticalAccuracyLabel;</span></p>
<p><span><span> </span></span><span>UILabel</span><span> *distanceTraveledLabel;</span></p>
<p><span>}</span></p>
<p><span>@property</span><span> (</span><span>retain</span><span>, </span><span>nonatomic</span><span>) CLLocationManager *locationManager;</span></p>
<p><span>@property</span><span> (</span><span>retain</span><span>, </span><span>nonatomic</span><span>) CLLocation *startingPoint;</span></p>
<p><span>@property</span><span> (</span><span>retain</span><span>, </span><span>nonatomic</span><span>) </span><span>IBOutlet</span><span> </span><span>UILabel</span><span> *latitudeLabel;</span></p>
<p><span>@property</span><span> (</span><span>retain</span><span>, </span><span>nonatomic</span><span>) </span><span>IBOutlet</span><span> </span><span>UILabel</span><span> *longitudeLabel;</span></p>
<p><span>@property</span><span> (</span><span>retain</span><span>, </span><span>nonatomic</span><span>) </span><span>IBOutlet</span><span> </span><span>UILabel</span><span> *horizontalAccuracyLabel;</span></p>
<p><span>@property</span><span> (</span><span>retain</span><span>, </span><span>nonatomic</span><span>) </span><span>IBOutlet</span><span> </span><span>UILabel</span><span> *altitudeLabel;</span></p>
<p><span>@property</span><span> (</span><span>retain</span><span>, </span><span>nonatomic</span><span>) </span><span>IBOutlet</span><span> </span><span>UILabel</span><span> *verticalAccuracyLabel;</span></p>
<p><span>@property</span><span> (</span><span>retain</span><span>, </span><span>nonatomic</span><span>) </span><span>IBOutlet</span><span> </span><span>UILabel</span><span> *distanceTraveledLabel;</span></p>
<p><span>- (</span><span>IBAction</span><span>)showInfo;</span></p>
<p><span>@end</span></p>
<p><span><span> </span>Observe que estamos importando o framework CoreLocation na segunda linha, e na declaração da interface existe uma delegação </span><span>CLLocationManagerDelegate</span><span>. Na declaração das variáveis foram usados dois tipos de componentes específicos do novo framework, </span><span>CLLocationManager</span><span> e </span><span>CLLocation</span><span>. Eles serão a base para montar os cálculos do GPS.</span></p>
<p><span><span> </span>No arquivo MainViewController.m, implemente o seguinte código:</span></p>
<p><span>#import </span><span>&#8220;MainViewController.h&#8221;</span></p>
<p><span>#import </span><span>&#8220;MainView.h&#8221;</span></p>
<p><span>@implementation</span><span> MainViewController</span></p>
<p><span>@synthesize</span><span> locationManager;</span></p>
<p><span>@synthesize</span><span> startingPoint;</span></p>
<p><span>@synthesize</span><span> latitudeLabel;</span></p>
<p><span>@synthesize</span><span> longitudeLabel;</span></p>
<p><span>@synthesize</span><span> horizontalAccuracyLabel;</span></p>
<p><span>@synthesize</span><span> altitudeLabel;</span></p>
<p><span>@synthesize</span><span> verticalAccuracyLabel;</span></p>
<p><span>@synthesize</span><span> distanceTraveledLabel;</span></p>
<p><span>- (</span><span>id</span><span>)initWithNibName:(</span><span>NSString</span><span> *)nibNameOrNil bundle:(</span><span>NSBundle</span><span> *)nibBundleOrNil {</span></p>
<p><span><span> </span></span><span>if</span><span> (</span><span>self</span><span> = [</span><span>super</span><span> </span><span>initWithNibName</span><span>:nibNameOrNil </span><span>bundle</span><span>:nibBundleOrNil]) {</span></p>
<p><span><span> </span></span><span>// Custom initialization</span></p>
<p><span><span> </span>}</span></p>
<p><span><span> </span></span><span>return</span><span> </span><span>self</span><span>;</span></p>
<p><span>}</span></p>
<p><span>- (</span><span>void</span><span>)viewDidLoad {</span></p>
<p><span><span> </span></span><span>self</span><span>.locationManager = [[CLLocationManager </span><span>alloc</span><span>] </span><span>init</span><span>];</span></p>
<p><span><span> </span>locationManager.</span><span>delegate</span><span> = </span><span>self</span><span>;</span></p>
<p><span><span> </span>locationManager.desiredAccuracy = kCLLocationAccuracyBest;</span></p>
<p><span><span> </span>[locationManager startUpdatingLocation];</span></p>
<p><span>}</span></p>
<p><span>- (</span><span>void</span><span>)flipsideViewControllerDidFinish:(</span><span>FlipsideViewController</span><span> *)controller {</span></p>
<p><span><span> </span>[</span><span>self</span><span> </span><span>dismissModalViewControllerAnimated</span><span>:</span><span>YES</span><span>];</span></p>
<p><span>}</span></p>
<p><span>- (</span><span>IBAction</span><span>)showInfo {</span></p>
<p><span><span> </span></span><span>FlipsideViewController</span><span> *controller = [[</span><span>FlipsideViewController</span><span> </span><span>alloc</span><span>] </span><span>initWithNibName</span><span>:</span><span>@&#8221;FlipsideView&#8221;</span><span> </span><span>bundle</span><span>:</span><span>nil</span><span>];</span></p>
<p><span><span> </span>controller.</span><span>delegate</span><span> = </span><span>self</span><span>;</span></p>
<p><span><span> </span>controller.modalTransitionStyle = </span><span>UIModalTransitionStyleFlipHorizontal</span><span>;</span></p>
<p><span><span> </span>[</span><span>self</span><span> </span><span>presentModalViewController</span><span>:controller </span><span>animated</span><span>:</span><span>YES</span><span>];</span></p>
<p><span><span> </span>[controller </span><span>release</span><span>];</span></p>
<p><span>}</span></p>
<p><span>- (</span><span>void</span><span>)didReceiveMemoryWarning {</span></p>
<p><span><span> </span>[</span><span>super</span><span> </span><span>didReceiveMemoryWarning</span><span>];</span></p>
<p><span>}</span></p>
<p><span>- (</span><span>void</span><span>)viewDidUnload {</span></p>
<p><span><span> </span></span><span>self</span><span>.locationManager = </span><span>nil</span><span>;</span></p>
<p><span><span> </span></span><span>self</span><span>.latitudeLabel = </span><span>nil</span><span>;</span></p>
<p><span><span> </span></span><span>self</span><span>.longitudeLabel = </span><span>nil</span><span>;</span></p>
<p><span><span> </span></span><span>self</span><span>.horizontalAccuracyLabel = </span><span>nil</span><span>;</span></p>
<p><span><span> </span></span><span>self</span><span>.altitudeLabel = </span><span>nil</span><span>;</span></p>
<p><span><span> </span></span><span>self</span><span>.verticalAccuracyLabel = </span><span>nil</span><span>;</span></p>
<p><span><span> </span></span><span>self</span><span>.distanceTraveledLabel = </span><span>nil</span><span>;</span></p>
<p><span><span> </span>[</span><span>super</span><span> </span><span>viewDidUnload</span><span>];</span></p>
<p><span>}</span></p>
<p><span>- (</span><span>void</span><span>)dealloc {</span></p>
<p><span><span> </span>[locationManager </span><span>release</span><span>];</span></p>
<p><span><span> </span>[startingPoint </span><span>release</span><span>];</span></p>
<p><span><span> </span>[latitudeLabel </span><span>release</span><span>];</span></p>
<p><span><span> </span>[longitudeLabel </span><span>release</span><span>];</span></p>
<p><span><span> </span>[horizontalAccuracyLabel </span><span>release</span><span>];</span></p>
<p><span><span> </span>[altitudeLabel </span><span>release</span><span>];</span></p>
<p><span><span> </span>[verticalAccuracyLabel </span><span>release</span><span>];</span></p>
<p><span><span> </span>[distanceTraveledLabel </span><span>release</span><span>]; </span></p>
<p><span><span> </span>[</span><span>super</span><span> </span><span>dealloc</span><span>];</span></p>
<p><span>}</span></p>
<p><span>- (</span><span>void</span><span>)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {</span></p>
<p><span><span> </span></span><span>if</span><span> (startingPoint == </span><span>nil</span><span>)</span></p>
<p><span><span> </span></span><span>self</span><span>.startingPoint = newLocation;</span></p>
<p><span><span> </span></span><span>NSString</span><span> *latitudeString = [[</span><span>NSString</span><span> </span><span>alloc</span><span>] </span><span>initWithFormat</span><span>:</span><span>@&#8221;%g°&#8221;</span><span>, newLocation.coordinate.latitude];</span></p>
<p><span><span> </span>latitudeLabel.text = latitudeString;</span></p>
<p><span><span> </span>[latitudeString </span><span>release</span><span>];</span></p>
<p><span><span> </span></span><span>NSString</span><span> *longitudeString = [[</span><span>NSString</span><span> </span><span>alloc</span><span>] </span><span>initWithFormat</span><span>:</span><span>@&#8221;%g°&#8221;</span><span>, newLocation.coordinate.longitude];</span></p>
<p><span><span> </span>longitudeLabel.text = longitudeString;</span></p>
<p><span><span> </span>[longitudeString </span><span>release</span><span>];</span></p>
<p><span><span> </span></span><span>NSString</span><span> *horizontalAccuracyString = [[</span><span>NSString</span><span> </span><span>alloc</span><span>] </span><span>initWithFormat</span><span>:</span><span>@&#8221;%gm&#8221;</span><span>, newLocation.horizontalAccuracy];</span></p>
<p><span><span> </span>horizontalAccuracyLabel.text = horizontalAccuracyString;</span></p>
<p><span><span> </span>[horizontalAccuracyString </span><span>release</span><span>];</span></p>
<p><span><span> </span></span><span>NSString</span><span> *altitudeString = [[</span><span>NSString</span><span> </span><span>alloc</span><span>] </span><span>initWithFormat</span><span>:</span><span>@&#8221;%gm&#8221;</span><span>, newLocation.altitude];</span></p>
<p><span><span> </span>altitudeLabel.text = altitudeString;</span></p>
<p><span><span> </span>[altitudeString </span><span>release</span><span>];</span></p>
<p><span><span> </span></span><span>NSString</span><span> *verticalAccuracyString = [[</span><span>NSString</span><span> </span><span>alloc</span><span>] </span><span>initWithFormat</span><span>:</span><span>@&#8221;%gm&#8221;</span><span>, newLocation.verticalAccuracy];</span></p>
<p><span><span> </span>verticalAccuracyLabel.text = verticalAccuracyString;</span></p>
<p><span><span> </span>[verticalAccuracyString </span><span>release</span><span>];</span></p>
<p><span><span> </span>CLLocationDistance distance = [newLocation  getDistanceFrom:startingPoint];</span></p>
<p><span><span> </span></span><span>NSString</span><span> *distanceString = [[</span><span>NSString</span><span> </span><span>alloc</span><span>] </span><span>initWithFormat</span><span>:</span><span>@&#8221;%gm&#8221;</span><span>, distance];</span></p>
<p><span><span> </span>distanceTraveledLabel.text = distanceString;</span></p>
<p><span><span> </span>[distanceString </span><span>release</span><span>];</span></p>
<p><span>}</span></p>
<p><span>- (</span><span>void</span><span>)locationManager:(CLLocationManager *)manager didFailWithError:(</span><span>NSError</span><span> *)error {</span></p>
<p><span><span> </span></span><span>NSString</span><span> *errorType = (error.code == kCLErrorDenied) ? </span><span>@&#8221;Access Denied&#8221;</span><span> : </span><span>@&#8221;Unknown Error&#8221;</span><span>;</span></p>
<p><span><span> </span></span><span>UIAlertView</span><span> *alert = [[</span><span>UIAlertView</span><span> </span><span>alloc</span><span>] </span><span>initWithTitle</span><span>:</span><span>@&#8221;Error getting Location&#8221;</span><span> </span><span>message</span><span>:errorType </span><span>delegate</span><span>:</span><span>nil</span><span> </span><span>cancelButtonTitle</span><span>:</span><span>@&#8221;Okay&#8221;</span><span> </span><span>otherButtonTitles</span><span>:</span><span>nil</span><span>];</span></p>
<p><span><span> </span>[alert </span><span>show</span><span>];</span></p>
<p><span><span> </span>[alert </span><span>release</span><span>];</span></p>
<p><span>}</span></p>
<p><span>@end</span></p>
<p><span><span> </span>Observe no código que existem variáveis pré definidas, que aparentemente não declaramos, por exemplo </span><span>kCLLocationAccuracyBest</span><span>. Na verdade esta variável está declarada no framework CoreLocation e por isto não precisamos declarar explicidamente no nosso código.</span></p>
<p><span><span> </span>Rode o aplicativo e divirta-se.</span></p>
<div style="text-align: right;"><span><em>(@AdemarVarela)</em></span></div>
<div style="text-align: right;"><span><br />
</span></div>
<p><span><br />
</span></p>
<div><span><br />
</span></div>
]]></content:encoded>
			<wfw:commentRss>http://www.mindbike.com.br/blog/?feed=rss2&#038;p=423</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apostila iPhone &#8211; Persistência de Dados &#8211; Archiving</title>
		<link>http://www.mindbike.com.br/blog/?p=420</link>
		<comments>http://www.mindbike.com.br/blog/?p=420#comments</comments>
		<pubDate>Sun, 12 Sep 2010 21:34:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Mindbike]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[XCode]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://www.mindbike.com.br/blog/?p=420</guid>
		<description><![CDATA[A última forma de persistir uma informação é usando archiving. Na verdade vamos criar um arquivo binário para armazenar nossas informações. A forma de gravar informações é muito similar com o que acabamos de ver no SQLite3. Vamos criar um projeto chamado iArch, para estudar este formato de gravação. Da mesma forma que criamos uma [...]]]></description>
			<content:encoded><![CDATA[<p>A última forma de persistir uma informação é usando archiving. Na verdade vamos criar um arquivo binário para armazenar nossas informações. A forma de gravar informações é muito similar com o que acabamos de ver no SQLite3.</p>
<p><span><span> </span>Vamos criar um projeto chamado iArch, para estudar este formato de gravação.</span></p>
<p><span><span> </span>Da mesma forma que criamos uma classe para controlar nossa base de dados, vamos criar uma classe com o mesmo propósito neste projeto. Crie uma classe chamada Fields.</span></p>
<p><img class="alignleft size-large wp-image-421" title="figura-62" src="http://www.mindbike.com.br/blog/wp-content/uploads/2010/09/figura-62-1024x640.png" alt="figura-62" width="614" height="384" /></p>
<p><span><span> </span>No arquivo Fields.h, digite o seguinte código:</span></p>
<p><span>#define    kField1Key    @</span><span>&#8220;Field1&#8243;</span></p>
<p><span>#define    kField2Key    @</span><span>&#8220;Field2&#8243;</span></p>
<p><span>#define    kField3Key    @</span><span>&#8220;Field3&#8243;</span></p>
<p><span>#define    kField4Key    @</span><span>&#8220;Field4&#8243;</span></p>
<p><span>@interface</span><span> Fields : NSObject &lt;NSCoding, NSCopying&gt; {</span></p>
<p><span> </span><span>NSString</span><span> *field1;</span></p>
<p><span> </span><span>NSString</span><span> *field2;</span></p>
<p><span> </span><span>NSString</span><span> *field3;</span></p>
<p><span> </span><span>NSString</span><span> *field4; </span></p>
<p><span>}</span></p>
<p><span>@property</span><span> (</span><span>nonatomic</span><span>, </span><span>retain</span><span>) </span><span>NSString</span><span> *field1;</span></p>
<p><span>@property</span><span> (</span><span>nonatomic</span><span>, </span><span>retain</span><span>) </span><span>NSString</span><span> *field2;</span></p>
<p><span>@property</span><span> (</span><span>nonatomic</span><span>, </span><span>retain</span><span>) </span><span>NSString</span><span> *field3;</span></p>
<p><span>@property</span><span> (</span><span>nonatomic</span><span>, </span><span>retain</span><span>) </span><span>NSString</span><span> *field4;</span></p>
<p><span>@end</span></p>
<p><span><span> </span>Como podemos observar, nada diferente do que já havíamos feito no exemplo do SQLite3. No arquivo Fields.m, digite o seguinte código:</span></p>
<p><span>#import </span><span>&#8220;Fields.h&#8221;</span></p>
<p><span>@implementation</span><span> Fields</span></p>
<p><span>@synthesize</span><span> field1;</span></p>
<p><span>@synthesize</span><span> field2;</span></p>
<p><span>@synthesize</span><span> field3;</span></p>
<p><span>@synthesize</span><span> field4;</span></p>
<p><span>- (</span><span>void</span><span>)encodeWithCoder:(</span><span>NSCoder</span><span> *)encoder {</span></p>
<p><span> [encoder </span><span>encodeObject</span><span>:field1 </span><span>forKey</span><span>:kField1Key];</span></p>
<p><span> [encoder </span><span>encodeObject</span><span>:field2 </span><span>forKey</span><span>:kField2Key];</span></p>
<p><span> [encoder </span><span>encodeObject</span><span>:field3 </span><span>forKey</span><span>:kField3Key];</span></p>
<p><span> [encoder </span><span>encodeObject</span><span>:field4 </span><span>forKey</span><span>:kField4Key];</span></p>
<p><span>}</span></p>
<p><span>- (</span><span>id</span><span>)initWithCoder:(</span><span>NSCoder</span><span> *)decoder {</span></p>
<p><span> </span><span>if</span><span> (</span><span>self</span><span> = [</span><span>super</span><span> </span><span>init</span><span>]) {</span></p>
<p><span> </span><span>self</span><span>.field1 = [decoder </span><span>decodeObjectForKey</span><span>:kField1Key];</span></p>
<p><span> </span><span>self</span><span>.field2 = [decoder </span><span>decodeObjectForKey</span><span>:kField2Key];</span></p>
<p><span> </span><span>self</span><span>.field3 = [decoder </span><span>decodeObjectForKey</span><span>:kField3Key];</span></p>
<p><span> </span><span>self</span><span>.field4 = [decoder </span><span>decodeObjectForKey</span><span>:kField4Key];</span></p>
<p><span> }</span></p>
<p><span> </span><span>return</span><span> </span><span>self</span><span>;</span></p>
<p><span>}</span></p>
<p><span>- (</span><span>id</span><span>)copyWithZone:(</span><span>NSZone</span><span> *)zone {</span></p>
<p><span> </span><span>Fields</span><span> *copy = [[[</span><span>self</span><span> </span><span>class</span><span>] </span><span>allocWithZone</span><span>: zone] </span><span>init</span><span>];</span></p>
<p><span> copy.field1 = [[</span><span>self</span><span>.field1 </span><span>copyWithZone</span><span>:zone] </span><span>autorelease</span><span>];</span></p>
<p><span> copy.field2 = [[</span><span>self</span><span>.field2 </span><span>copyWithZone</span><span>:zone] </span><span>autorelease</span><span>];</span></p>
<p><span> copy.field3 = [[</span><span>self</span><span>.field3 </span><span>copyWithZone</span><span>:zone] </span><span>autorelease</span><span>];</span></p>
<p><span> copy.field4 = [[</span><span>self</span><span>.field4 </span><span>copyWithZone</span><span>:zone] </span><span>autorelease</span><span>];</span></p>
<p><span> </span><span>return</span><span> copy;</span></p>
<p><span>}</span></p>
<p><span>@end</span></p>
<p><span><span> </span>Percebemos que esta classe, assim como a anterior é idêntica a classe criada no estudo anterior. Para facilitar a compreensão usaremos o mesmo esquema proposto nos estudos anteriores.</span></p>
<p><span><span> </span>No arquivo MainViewController.h, digite o seguinte código:</span></p>
<p><span>#import </span><span>&#8220;FlipsideViewController.h&#8221;</span></p>
<p><span>#define kFilename        @</span><span>&#8220;archive&#8221;</span></p>
<p><span>#define kDataKey         @</span><span>&#8220;Data&#8221;</span></p>
<p><span>@interface</span><span> MainViewController : UIViewController &lt;FlipsideViewControllerDelegate&gt; {</span></p>
<p><span> </span><span>UITextField</span><span> *field1;</span></p>
<p><span> </span><span>UITextField</span><span> *field2;</span></p>
<p><span> </span><span>UITextField</span><span> *field3;</span></p>
<p><span> </span><span>UITextField</span><span> *field4; </span></p>
<p><span>}</span></p>
<p><span>@property</span><span> (</span><span>nonatomic</span><span>, </span><span>retain</span><span>) </span><span>IBOutlet</span><span> </span><span>UITextField</span><span> *field1;</span></p>
<p><span>@property</span><span> (</span><span>nonatomic</span><span>, </span><span>retain</span><span>) </span><span>IBOutlet</span><span> </span><span>UITextField</span><span> *field2;</span></p>
<p><span>@property</span><span> (</span><span>nonatomic</span><span>, </span><span>retain</span><span>) </span><span>IBOutlet</span><span> </span><span>UITextField</span><span> *field3;</span></p>
<p><span>@property</span><span> (</span><span>nonatomic</span><span>, </span><span>retain</span><span>) </span><span>IBOutlet</span><span> </span><span>UITextField</span><span> *field4;</span></p>
<p><span>- (</span><span>NSString</span><span> *)dataFilePath;</span></p>
<p><span>- (</span><span>void</span><span>)applicationWillTerminate:(</span><span>NSNotification</span><span> *)notification;</span></p>
<p><span>- (</span><span>IBAction</span><span>)showInfo;</span></p>
<p><span>@end</span></p>
<p><span><span> </span>Aqui encontramos a primeira diferença do estudo anterior e deste atual, observe os defines que estamos usando agora, </span><span>kFilename</span><span> determina o nome do arquivo, já </span><span>kDataKey</span><span> a chave que será usada para manipular este arquivo. Lembre-se, vamos criar um arquivo binário e por esta razão vamos precisar de uma chave para poder navegar por ele.</span></p>
<p>No arquivo MainViewController.m, digite o seguinte código:</p>
<p><span>#import </span><span>&#8220;MainViewController.h&#8221;</span></p>
<p><span>#import </span><span>&#8220;MainView.h&#8221;</span></p>
<p><span>#import </span><span>&#8220;Fields.h&#8221;</span></p>
<p><span>@implementation</span><span> MainViewController</span></p>
<p><span>@synthesize</span><span> field1;</span></p>
<p><span>@synthesize</span><span> field2;</span></p>
<p><span>@synthesize</span><span> field3;</span></p>
<p><span>@synthesize</span><span> field4;</span></p>
<p><span>- (</span><span>NSString</span><span> *)dataFilePath {</span></p>
<p><span> </span><span>NSArray</span><span> *paths = </span><span>NSSearchPathForDirectoriesInDomains</span><span>(</span></p>
<p><span> </span><span>NSDocumentDirectory</span><span>, </span><span>NSUserDomainMask</span><span>, </span><span>YES</span><span>);</span></p>
<p><span> </span><span>NSString</span><span> *documentsDirectory = [paths </span><span>objectAtIndex</span><span>:</span><span>0</span><span>];</span></p>
<p><span> </span><span>return</span><span> [documentsDirectory </span><span>stringByAppendingPathComponent</span><span>:kFilename];</span></p>
<p><span>}</span></p>
<p><span>- (</span><span>void</span><span>)applicationWillTerminate: (</span><span>NSNotification</span><span> *)notification {</span></p>
<p><span> </span><span>Fields</span><span> *fourLines = [[</span><span>Fields</span><span> </span><span>alloc</span><span>] </span><span>init</span><span>];</span></p>
<p><span> fourLines.</span><span>field1</span><span> = field1.text;</span></p>
<p><span> fourLines.</span><span>field2</span><span> = field2.text;</span></p>
<p><span> fourLines.</span><span>field3</span><span> = field3.text;</span></p>
<p><span> fourLines.</span><span>field4</span><span> = field4.text;</span></p>
<p><span> </span><span>NSMutableData</span><span> *data = [[</span><span>NSMutableData</span><span> </span><span>alloc</span><span>] </span><span>init</span><span>];</span></p>
<p><span> </span><span>NSKeyedArchiver</span><span> *archiver = [[</span><span>NSKeyedArchiver</span><span> </span><span>alloc</span><span>]</span></p>
<p><span> </span><span>initForWritingWithMutableData</span><span>:data];</span></p>
<p><span> [archiver </span><span>encodeObject</span><span>:fourLines </span><span>forKey</span><span>:kDataKey];</span></p>
<p><span> [archiver </span><span>finishEncoding</span><span>];</span></p>
<p><span> [data </span><span>writeToFile</span><span>:[</span><span>self</span><span> dataFilePath] </span><span>atomically</span><span>:</span><span>YES</span><span>];</span></p>
<p><span> [fourLines </span><span>release</span><span>];</span></p>
<p><span> [archiver </span><span>release</span><span>];</span></p>
<p><span> [data </span><span>release</span><span>]; </span></p>
<p><span>}</span></p>
<p><span>- (</span><span>void</span><span>)viewDidLoad {</span></p>
<p><span> </span><span>NSString</span><span> *filePath = [</span><span>self</span><span> dataFilePath];</span></p>
<p><span> </span><span>if</span><span> ([[</span><span>NSFileManager</span><span> </span><span>defaultManager</span><span>] </span><span>fileExistsAtPath</span><span>:filePath]) {</span></p>
<p><span> </span><span>NSArray</span><span> *array = [[</span><span>NSArray</span><span> </span><span>alloc</span><span>] </span><span>initWithContentsOfFile</span><span>:filePath];</span></p>
<p><span> </span><span>NSData</span><span> *data = [[</span><span>NSMutableData</span><span> </span><span>alloc</span><span>]</span></p>
<p><span> </span><span>initWithContentsOfFile</span><span>:[</span><span>self</span><span> dataFilePath]];</span></p>
<p><span> </span><span>NSKeyedUnarchiver</span><span> *unarchiver = [[</span><span>NSKeyedUnarchiver</span><span> </span><span>alloc</span><span>] </span></p>
<p><span> </span><span>initForReadingWithData</span><span>:data];</span></p>
<p><span> </span><span>Fields</span><span> *fourLines = [unarchiver </span><span>decodeObjectForKey</span><span>:kDataKey];</span></p>
<p><span> [unarchiver </span><span>finishDecoding</span><span>];</span></p>
<p><span> field1.text = fourLines.</span><span>field1</span><span>;</span></p>
<p><span> field2.text = fourLines.</span><span>field2</span><span>;</span></p>
<p><span> field3.text = fourLines.</span><span>field3</span><span>;</span></p>
<p><span> field4.text = fourLines.</span><span>field4</span><span>;</span></p>
<p><span> [unarchiver </span><span>release</span><span>];</span></p>
<p><span> [data </span><span>release</span><span>]; </span></p>
<p><span> }</span></p>
<p><span> </span><span>UIApplication</span><span> *app = [</span><span>UIApplication</span><span> </span><span>sharedApplication</span><span>];</span></p>
<p><span> [[</span><span>NSNotificationCenter</span><span> </span><span>defaultCenter</span><span>] </span><span>addObserver</span><span>:</span><span>self</span></p>
<p><span> </span><span>selector</span><span>:</span><span>@selector</span><span>(</span><span>applicationWillTerminate</span><span>: )</span></p>
<p><span> </span><span>name</span><span>:</span><span>UIApplicationWillTerminateNotification</span><span> </span></p>
<p><span> </span><span>object</span><span>:app];</span></p>
<p><span> [</span><span>super</span><span> </span><span>viewDidLoad</span><span>];</span></p>
<p><span>}</span></p>
<p><span>- (</span><span>void</span><span>)viewDidUnload {</span></p>
<p><span> </span><span>self</span><span>.</span><span>field1</span><span> = </span><span>nil</span><span>;</span></p>
<p><span> </span><span>self</span><span>.</span><span>field2</span><span> = </span><span>nil</span><span>;</span></p>
<p><span> </span><span>self</span><span>.</span><span>field3</span><span> = </span><span>nil</span><span>;</span></p>
<p><span> </span><span>self</span><span>.</span><span>field4</span><span> = </span><span>nil</span><span>;</span></p>
<p><span> [</span><span>super</span><span> </span><span>viewDidUnload</span><span>];</span></p>
<p><span>}</span></p>
<p><span>- (</span><span>void</span><span>)dealloc {</span></p>
<p><span> [field1 </span><span>release</span><span>];</span></p>
<p><span> [field2 </span><span>release</span><span>];</span></p>
<p><span> [field3 </span><span>release</span><span>];</span></p>
<p><span> [field4 </span><span>release</span><span>];</span></p>
<p><span> [</span><span>super</span><span> </span><span>dealloc</span><span>];</span></p>
<p><span>}</span></p>
<p><span>@end</span></p>
<p><span><span> </span>Observem que os métodos que criamos são os mesmo usados no estudo anterior, a grande diferença está somente nos métodos viewDidLoad e appicationWillTerminate. Nestes métodos estamos usando comandos específicos para gravar informações usando archiving, tais como, </span><span>NSKeyedArchiver</span><span> e </span><span>NSFileManager</span><span>.</span></p>
<p style="text-align: right;"><em>(@AdemarVarela)</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mindbike.com.br/blog/?feed=rss2&#038;p=420</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apostila iPhone &#8211; Persistência de Dados &#8211; SQLite &#8211; Final</title>
		<link>http://www.mindbike.com.br/blog/?p=415</link>
		<comments>http://www.mindbike.com.br/blog/?p=415#comments</comments>
		<pubDate>Sun, 12 Sep 2010 21:28:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Mindbike]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[XCode]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://www.mindbike.com.br/blog/?p=415</guid>
		<description><![CDATA[Abra o arquivo MainView.xib e insira os componentes como mostrado na figura abaixo: Agora feche o IB e rode o aplicativo, e claro, divirta-se. Exercício Modifique o aplicativo iAgenda para trabalhar com SQLite3. (@AdemarVarela)]]></description>
			<content:encoded><![CDATA[<p><span>Abra o arquivo MainView.xib e insira os componentes como mostrado na figura abaixo:</span></p>
<p><img class="alignleft size-large wp-image-418" title="figura-61" src="http://www.mindbike.com.br/blog/wp-content/uploads/2010/09/figura-61-1024x640.png" alt="figura-61" width="614" height="384" /></p>
<p><span>Agora feche o IB e rode o aplicativo, e claro, divirta-se.</span></p>
<p><span><span><strong>Exercício</strong></span></span></p>
<ol>
<li><span>Modifique o aplicativo iAgenda para trabalhar com SQLite3.</span></li>
</ol>
<p style="text-align: right;"><em>(@AdemarVarela)</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mindbike.com.br/blog/?feed=rss2&#038;p=415</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apostila iPhone &#8211; Persistência de Dados &#8211; SQLite</title>
		<link>http://www.mindbike.com.br/blog/?p=407</link>
		<comments>http://www.mindbike.com.br/blog/?p=407#comments</comments>
		<pubDate>Wed, 08 Sep 2010 17:25:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Mindbike]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[XCode]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://www.mindbike.com.br/blog/?p=407</guid>
		<description><![CDATA[Outra forma de persistir informações é utilizar o SQLite. O SQLite é um pequeno banco de dados, que responde aos comandos SQL ANSI, tais como select, insert, update, etc. Basicamente, a forma de persistir é muito similar à Property List. Vamos criar um projeto para conhecer o SQLite, chamado iSQL. Para trabalharmos com SQLite é [...]]]></description>
			<content:encoded><![CDATA[<p><span>Outra forma de persistir informações é utilizar o <strong>SQLite</strong>. O <strong>SQLite</strong> é um pequeno banco de dados, que responde aos comandos <strong>SQL</strong> <strong>ANSI</strong>, tais como <em>select</em>, <em>insert</em>, <em>update</em>, etc.</span></p>
<p><span><span> </span>Basicamente, a forma de persistir é muito similar à Property List.</span></p>
<p><span><span> </span>Vamos criar um projeto para conhecer o SQLite, chamado iSQL. Para trabalharmos com SQLite é necessário acrescentar uma nova biblioteca no projeto, libsqlite3.dylib. Esta é uma biblioteca que chamamos de dinâmica, por isto a extensão dylib.</span></p>
<p><span><span> </span>Para acrescentar esta biblioteca, de um click em cima da pasta Framework, depois selecione <em>Project</em> / <em>Add</em> <em>to</em> <em>Project</em>.</span></p>
<p><img class="alignleft size-large wp-image-408" title="figura-58" src="http://www.mindbike.com.br/blog/wp-content/uploads/2010/09/figura-58-1024x640.png" alt="figura-58" width="614" height="384" /></p>
<p><span>Ao escolher Add to Project, selecione o seguinte caminho:</span></p>
<ul>
<li>
<ul>
<li><span>HD;</span></li>
<li><span>Developer;</span></li>
<li><span>Platforms;</span></li>
<li><span>iPhoneSimulator.platform;</span></li>
<li><span>Developer;</span></li>
<li><span>SDKs;</span></li>
<li><span>iPhoneSimulator3.0 (ou 3.1);</span></li>
<li><span>usr;</span></li>
<li><span>lib;</span></li>
</ul>
</li>
</ul>
<p><span><span> </span>Ao chegar neste caminho selecione <em>libsqlite3.dylib</em>.</span></p>
<p><span><span> </span>Geralmente em projetos com SQLite, nós criamos uma classe que determina o modelo dos dados que serão gravados. Portanto vamos criar uma classe denominada Fields que conterá o modelo de dados que será gravado.</span></p>
<div><img class="alignleft size-large wp-image-409" title="figura-60" src="http://www.mindbike.com.br/blog/wp-content/uploads/2010/09/figura-60-1024x640.png" alt="figura-60" width="614" height="384" /></div>
<div>
<p><span>Implemente o seguinte código em Fields.h:</span></p>
<p><span>#import </span><span>&lt;Foundation/Foundation.h&gt;</span></p>
<p><span>#define    kField1Key    @</span><span>&#8220;Field1&#8243;</span></p>
<p><span>#define    kField2Key    @</span><span>&#8220;Field2&#8243;</span></p>
<p><span>#define    kField3Key    @</span><span>&#8220;Field3&#8243;</span></p>
<p><span>#define    kField4Key    @</span><span>&#8220;Field4&#8243;</span></p>
<p><span>@interface</span><span> Fields :  NSObject &lt;NSCoding, NSCopying&gt; {</span></p>
<p><span><span> </span></span><span>NSString</span><span> *field1;</span></p>
<p><span><span> </span></span><span>NSString</span><span> *field2;</span></p>
<p><span><span> </span></span><span>NSString</span><span> *field3;</span></p>
<p><span><span> </span></span><span>NSString</span><span> *field4; </span></p>
<p><span>}</span></p>
<p><span>@property</span><span> (</span><span>nonatomic</span><span>, </span><span>retain</span><span>) </span><span>NSString</span><span> *field1;</span></p>
<p><span>@property</span><span> (</span><span>nonatomic</span><span>, </span><span>retain</span><span>) </span><span>NSString</span><span> *field2;</span></p>
<p><span>@property</span><span> (</span><span>nonatomic</span><span>, </span><span>retain</span><span>) </span><span>NSString</span><span> *field3;</span></p>
<p><span>@property</span><span> (</span><span>nonatomic</span><span>, </span><span>retain</span><span>) </span><span>NSString</span><span> *field4;</span></p>
<p><span>@end</span></p>
<p><span><span> </span>Observem que estamos definindo 4 campos que serão utilizados para a manipulação da nossa base de dados.</span></p>
<p><span><span> </span>No arquivo Fields.m, implemente o seguinte código:</span></p>
<p><span>#import </span><span>&#8220;Fields.h&#8221;</span></p>
<p><span>@implementation</span><span> Fields</span></p>
<p><span>@synthesize</span><span> field1;</span></p>
<p><span>@synthesize</span><span> field2;</span></p>
<p><span>@synthesize</span><span> field3;</span></p>
<p><span>@synthesize</span><span> field4;</span></p>
<p><span>- (</span><span>void</span><span>)encodeWithCoder:(</span><span>NSCoder</span><span> *)encoder {</span></p>
<p><span> [encoder </span><span>encodeObject</span><span>:field1 </span><span>forKey</span><span>:kField1Key];</span></p>
<p><span> [encoder </span><span>encodeObject</span><span>:field2 </span><span>forKey</span><span>:kField2Key];</span></p>
<p><span> [encoder </span><span>encodeObject</span><span>:field3 </span><span>forKey</span><span>:kField3Key];</span></p>
<p><span> [encoder </span><span>encodeObject</span><span>:field4 </span><span>forKey</span><span>:kField4Key];</span></p>
<p><span>}</span></p>
<p><span>- (</span><span>id</span><span>)initWithCoder:(</span><span>NSCoder</span><span> *)decoder {</span></p>
<p><span> </span><span>if</span><span> (</span><span>self</span><span> = [</span><span>super</span><span> </span><span>init</span><span>]) {</span></p>
<p><span> </span><span>self</span><span>.</span><span>field1</span><span> = [decoder </span><span>decodeObjectForKey</span><span>:kField1Key];</span></p>
<p><span> </span><span>self</span><span>.</span><span>field2</span><span> = [decoder </span><span>decodeObjectForKey</span><span>:kField2Key];</span></p>
<p><span> </span><span>self</span><span>.</span><span>field3</span><span> = [decoder </span><span>decodeObjectForKey</span><span>:kField3Key];</span></p>
<p><span> </span><span>self</span><span>.</span><span>field4</span><span> = [decoder </span><span>decodeObjectForKey</span><span>:kField4Key];</span></p>
<p><span> }</span></p>
<p><span> </span><span>return</span><span> </span><span>self</span><span>;</span></p>
<p><span>}</span></p>
<p><span>- (</span><span>id</span><span>)copyWithZone:(</span><span>NSZone</span><span> *)zone {</span></p>
<p><span> </span><span>Fields</span><span> *copy = [[[</span><span>self</span><span> </span><span>class</span><span>] </span><span>allocWithZone</span><span>: zone] </span><span>init</span><span>];</span></p>
<p><span> copy.</span><span>field1</span><span> = [[</span><span>self</span><span>.</span><span>field1</span><span> </span><span>copyWithZone</span><span>:zone] </span><span>autorelease</span><span>];</span></p>
<p><span> copy.</span><span>field2</span><span> = [[</span><span>self</span><span>.</span><span>field2</span><span> </span><span>copyWithZone</span><span>:zone] </span><span>autorelease</span><span>];</span></p>
<p><span> copy.</span><span>field3</span><span> = [[</span><span>self</span><span>.</span><span>field3</span><span> </span><span>copyWithZone</span><span>:zone] </span><span>autorelease</span><span>];</span></p>
<p><span> copy.</span><span>field4</span><span> = [[</span><span>self</span><span>.</span><span>field4</span><span> </span><span>copyWithZone</span><span>:zone] </span><span>autorelease</span><span>];</span></p>
<p><span> </span></p>
<p><span> </span><span>return</span><span> copy;</span></p>
<p><span>}</span></p>
<p><span>@end</span></p>
<p><span><span> </span>Criada a classe que manipulará a base de dados, vamos implementar o código propriamente dito. Vamos perceber que a implementação não foge muito daquilo que foi feito para a persistência do Property List. No arquivo MainViewController.h, implemente o seguinte código:</span></p>
<p><span>#import </span><span>&#8220;FlipsideViewController.h&#8221;</span></p>
<p><span>#import </span><span>&#8220;/usr/include/sqlite3.h&#8221;</span></p>
<p><span>#define kFilename    @</span><span>&#8220;data.sqlite3&#8243;</span></p>
<p><span>@interface</span><span> MainViewController : UIViewController &lt;FlipsideViewControllerDelegate&gt; {</span></p>
<p><span><span> </span></span><span>UITextField</span><span> *field1;</span></p>
<p><span><span> </span></span><span>UITextField</span><span> *field2;</span></p>
<p><span><span> </span></span><span>UITextField</span><span> *field3;</span></p>
<p><span><span> </span></span><span>UITextField</span><span> *field4; </span></p>
<p><span><span> </span></span><span>sqlite3</span><span> *database;</span></p>
<p><span>}</span></p>
<p><span>@property</span><span> (</span><span>nonatomic</span><span>, </span><span>retain</span><span>) </span><span>IBOutlet</span><span> </span><span>UITextField</span><span> *field1;</span></p>
<p><span>@property</span><span> (</span><span>nonatomic</span><span>, </span><span>retain</span><span>) </span><span>IBOutlet</span><span> </span><span>UITextField</span><span> *field2;</span></p>
<p><span>@property</span><span> (</span><span>nonatomic</span><span>, </span><span>retain</span><span>) </span><span>IBOutlet</span><span> </span><span>UITextField</span><span> *field3;</span></p>
<p><span>@property</span><span> (</span><span>nonatomic</span><span>, </span><span>retain</span><span>) </span><span>IBOutlet</span><span> </span><span>UITextField</span><span> *field4;</span></p>
<p><span>- (</span><span>NSString</span><span> *)dataFilePath;</span></p>
<p><span>- (</span><span>void</span><span>)applicationWillTerminate: (</span><span>NSNotification</span><span> *)notification;</span></p>
<p><span>- (</span><span>IBAction</span><span>)showInfo;</span></p>
<p><span>@end</span></p>
<p><span><span> </span>Observe que colocamos um define que determina o nome da base de dados, no nosso caso data.sqlite3. Declaramos uma variável chamada database como sendo do tipo slqlite3.</span></p>
<p><span><span> </span>No arquivo MainViewController.m, implemente o seguinte código:</span></p>
<p><span>#import </span><span>&#8220;MainViewController.h&#8221;</span></p>
<p><span>#import </span><span>&#8220;MainView.h&#8221;</span></p>
<p><span>#import </span><span>&#8220;Fields.h&#8221;</span></p>
<p><span>@implementation</span><span> MainViewController</span></p>
<p><span>@synthesize</span><span> field1;</span></p>
<p><span>@synthesize</span><span> field2;</span></p>
<p><span>@synthesize</span><span> field3;</span></p>
<p><span>@synthesize</span><span> field4;</span></p>
<p><span>- (</span><span>NSString</span><span> *)dataFilePath {</span></p>
<p><span> </span><span>NSArray</span><span> *paths = </span><span>NSSearchPathForDirectoriesInDomains</span><span>(</span></p>
<p><span> </span><span>NSDocumentDirectory</span><span>, </span><span>NSUserDomainMask</span><span>, </span><span>YES</span><span>);</span></p>
<p><span> </span><span>NSString</span><span> *documentsDirectory = [paths </span><span>objectAtIndex</span><span>:</span><span>0</span><span>];</span></p>
<p><span> </span><span>return</span><span> [documentsDirectory </span><span>stringByAppendingPathComponent</span><span>:</span><span>kFilename</span><span>];</span></p>
<p><span>}</span></p>
<p><span>- (</span><span>void</span><span>)applicationWillTerminate:(</span><span>NSNotification</span><span> *)notification {</span></p>
<p><span> </span><span>for</span><span> (</span><span>int</span><span> i = </span><span>1</span><span>; i &lt;= </span><span>4</span><span>; i++)</span></p>
<p><span> {</span></p>
<p><span> </span><span>NSString</span><span> *fieldName = [[</span><span>NSString</span><span> </span><span>alloc</span><span>]</span></p>
<p><span> </span><span>initWithFormat</span><span>:</span><span>@&#8221;field%d&#8221;</span><span>, i];</span></p>
<p><span> </span><span>UITextField</span><span> *field = [</span><span>self</span><span> </span><span>valueForKey</span><span>:fieldName];</span></p>
<p><span> [fieldName </span><span>release</span><span>];</span></p>
<p><span> </span></p>
<p><span> </span><span>char</span><span> *errorMsg;</span></p>
<p><span> </span><span>char</span><span> *update = </span><span>&#8220;INSERT OR REPLACE INTO FIELDS (ROW, FIELD_DATA) VALUES (?, ?);&#8221;</span><span>;</span></p>
<p><span> </span><span>sqlite3_stmt</span><span> *stmt;</span></p>
<p><span> </span><span>if</span><span> (</span><span>sqlite3_prepare_v2</span><span>(</span><span>database</span><span>, update, -</span><span>1</span><span>, &amp;stmt, </span><span>nil</span><span>) == </span><span>SQLITE_OK</span><span>) {</span></p>
<p><span> </span><span>sqlite3_bind_int</span><span>(stmt, </span><span>1</span><span>, i);</span></p>
<p><span> </span><span>sqlite3_bind_text</span><span>(stmt, </span><span>2</span><span>, [field.text </span><span>UTF8String</span><span>], -</span><span>1</span><span>, </span><span>NULL</span><span>);</span></p>
<p><span> }</span></p>
<p><span> </span><span>if</span><span> (</span><span>sqlite3_step</span><span>(stmt) != </span><span>SQLITE_DONE</span><span>)</span></p>
<p><span> </span><span>NSAssert1</span><span>(</span><span>0</span><span>, </span><span>@&#8221;Error updating table: %s&#8221;</span><span>, errorMsg);</span></p>
<p><span> </span><span>sqlite3_finalize</span><span>(stmt);</span></p>
<p><span> }</span></p>
<p><span> </span><span>sqlite3_close</span><span>(</span><span>database</span><span>); </span></p>
<p><span>}</span></p>
<p><span>- (</span><span>void</span><span>)viewDidLoad {</span></p>
<p><span> </span><span>if</span><span> (</span><span>sqlite3_open</span><span>([[</span><span>self</span><span> </span><span>dataFilePath</span><span>] </span><span>UTF8String</span><span>], &amp;</span><span>database</span><span>)</span></p>
<p><span> != </span><span>SQLITE_OK</span><span>) {</span></p>
<p><span> </span><span>sqlite3_close</span><span>(</span><span>database</span><span>);</span></p>
<p><span> </span><span>NSAssert</span><span>(</span><span>0</span><span>, </span><span>@&#8221;Failed to open database&#8221;</span><span>);</span></p>
<p><span> }</span></p>
<p><span> </span><span>char</span><span> *errorMsg;</span></p>
<p><span> </span><span>NSString</span><span> *createSQL = </span><span>@&#8221;CREATE TABLE IF NOT EXISTS FIELDS (ROW INTEGER PRIMARY KEY, FIELD_DATA TEXT);&#8221;</span><span>;</span></p>
<p><span> </span><span>if</span><span> (</span><span>sqlite3_exec</span><span> (</span><span>database</span><span>, [createSQL </span><span>UTF8String</span><span>],</span></p>
<p><span> </span><span>NULL</span><span>, </span><span>NULL</span><span>, &amp;errorMsg) != </span><span>SQLITE_OK</span><span>) {</span></p>
<p><span> </span><span>sqlite3_close</span><span>(</span><span>database</span><span>);</span></p>
<p><span> </span><span>NSAssert1</span><span>(</span><span>0</span><span>, </span><span>@&#8221;Error creating table: %s&#8221;</span><span>, errorMsg);</span></p>
<p><span> }</span></p>
<p><span> </span><span>NSString</span><span> *query = </span><span>@&#8221;SELECT ROW, FIELD_DATA FROM FIELDS ORDER BY ROW&#8221;</span><span>;</span></p>
<p><span> </span><span>sqlite3_stmt</span><span> *statement;</span></p>
<p><span> </span><span>if</span><span> (</span><span>sqlite3_prepare_v2</span><span>( </span><span>database</span><span>, [query </span><span>UTF8String</span><span>],</span></p>
<p><span> -</span><span>1</span><span>, &amp;statement, </span><span>nil</span><span>) == </span><span>SQLITE_OK</span><span>) {</span></p>
<p><span> </span><span>while</span><span> (</span><span>sqlite3_step</span><span>(statement) == </span><span>SQLITE_ROW</span><span>) {</span></p>
<p><span> </span><span>int</span><span> row = </span><span>sqlite3_column_int</span><span>(statement, </span><span>0</span><span>);</span></p>
<p><span> </span><span>char</span><span> *rowData = (</span><span>char</span><span> *)</span><span>sqlite3_column_text</span><span>(statement, </span><span>1</span><span>);</span></p>
<p><span> </span></p>
<p><span> </span><span>NSString</span><span> *fieldName = [[</span><span>NSString</span><span> </span><span>alloc</span><span>]</span></p>
<p><span> </span><span>initWithFormat</span><span>:</span><span>@&#8221;field%d&#8221;</span><span>, </span><span>row</span><span>];</span></p>
<p><span> </span><span>NSString</span><span> *fieldValue = [[</span><span>NSString</span><span> </span><span>alloc</span><span>]</span></p>
<p><span> </span><span>initWithUTF8String</span><span>:rowData];</span></p>
<p><span> </span><span>UITextField</span><span> *field = [</span><span>self</span><span> </span><span>valueForKey</span><span>:fieldName];</span></p>
<p><span> field.text = fieldValue;</span></p>
<p><span> [fieldName </span><span>release</span><span>];</span></p>
<p><span> [fieldValue </span><span>release</span><span>];</span></p>
<p><span> }</span></p>
<p><span> </span><span>sqlite3_finalize</span><span>(statement);</span></p>
<p><span> } </span></p>
<p><span> </span><span>UIApplication</span><span> *app = [</span><span>UIApplication</span><span> </span><span>sharedApplication</span><span>];</span></p>
<p><span> [[</span><span>NSNotificationCenter</span><span> </span><span>defaultCenter</span><span>] </span><span>addObserver</span><span>:</span><span>self</span></p>
<p><span> </span><span>selector</span><span>:</span><span>@selector</span><span>(</span><span>applicationWillTerminate</span><span>: )</span></p>
<p><span> </span><span>name</span><span>:</span><span>UIApplicationWillTerminateNotification</span><span> </span></p>
<p><span> </span><span>object</span><span>:app];</span></p>
<p><span> [</span><span>super</span><span> </span><span>viewDidLoad</span><span>];</span></p>
<p><span>}</span></p>
<p><span>- (</span><span>void</span><span>)viewDidUnload {</span></p>
<p><span> </span><span>// Release any retained subviews of the main view.</span></p>
<p><span> </span><span>// e.g. self.myOutlet = nil;</span></p>
<p><span> </span><span>self</span><span>.</span><span>field1</span><span> = </span><span>nil</span><span>;</span></p>
<p><span> </span><span>self</span><span>.</span><span>field2</span><span> = </span><span>nil</span><span>;</span></p>
<p><span> </span><span>self</span><span>.</span><span>field3</span><span> = </span><span>nil</span><span>;</span></p>
<p><span> </span><span>self</span><span>.</span><span>field4</span><span> = </span><span>nil</span><span>;</span></p>
<p><span> [</span><span>super</span><span> </span><span>viewDidUnload</span><span>];</span></p>
<p><span>}</span></p>
<p><span>- (</span><span>void</span><span>)dealloc {</span></p>
<p><span> [</span><span>field1</span><span> </span><span>release</span><span>];</span></p>
<p><span> [</span><span>field2</span><span> </span><span>release</span><span>];</span></p>
<p><span> [</span><span>field3</span><span> </span><span>release</span><span>];</span></p>
<p><span> [</span><span>field4</span><span> </span><span>release</span><span>];</span></p>
<p><span> [</span><span>super</span><span> </span><span>dealloc</span><span>];</span></p>
<p><span>}</span></p>
<p><span>- (</span><span>id</span><span>)initWithNibName:(</span><span>NSString</span><span> *)nibNameOrNil bundle:(</span><span>NSBundle</span><span> *)nibBundleOrNil {</span></p>
<p><span> </span><span>if</span><span> (</span><span>self</span><span> = [</span><span>super</span><span> </span><span>initWithNibName</span><span>:nibNameOrNil </span><span>bundle</span><span>:nibBundleOrNil]) {</span></p>
<p><span> </span><span>// Custom initialization</span></p>
<p><span> }</span></p>
<p><span> </span><span>return</span><span> </span><span>self</span><span>;</span></p>
<p><span>}</span></p>
<p><span>- (</span><span>void</span><span>)flipsideViewControllerDidFinish:(</span><span>FlipsideViewController</span><span> *)controller {</span></p>
<p><span><span> </span>[</span><span>self</span><span> </span><span>dismissModalViewControllerAnimated</span><span>:</span><span>YES</span><span>];</span></p>
<p><span>}</span></p>
<p><span>- (</span><span>IBAction</span><span>)showInfo { </span></p>
<p><span><span> </span></span><span>FlipsideViewController</span><span> *controller = [[</span><span>FlipsideViewController</span><span> </span><span>alloc</span><span>] </span><span>initWithNibName</span><span>:</span><span>@&#8221;FlipsideView&#8221;</span><span> </span><span>bundle</span><span>:</span><span>nil</span><span>];</span></p>
<p><span><span> </span>controller.</span><span>delegate</span><span> = </span><span>self</span><span>;</span></p>
<p><span><span> </span>controller.modalTransitionStyle = </span><span>UIModalTransitionStyleFlipHorizontal</span><span>;</span></p>
<p><span><span> </span>[</span><span>self</span><span> </span><span>presentModalViewController</span><span>:controller </span><span>animated</span><span>:</span><span>YES</span><span>];</span></p>
<p><span><span> </span>[controller </span><span>release</span><span>];</span></p>
<p><span>}</span></p>
<p><span>- (</span><span>void</span><span>)didReceiveMemoryWarning {</span></p>
<p><span><span> </span></span><span>// Releases the view if it doesn&#8217;t have a superview.</span></p>
<p><span> [</span><span>super</span><span> </span><span>didReceiveMemoryWarning</span><span>];</span></p>
<p><span><span> </span></span></p>
<p><span><span> </span></span><span>// Release any cached data, images, etc that aren&#8217;t in use.</span></p>
<p><span>}</span></p>
<p><span>@end</span></p>
<p><span><span> </span>Reparem que as grandes modificações ocorreram nos métodos viewDidLoad e aplicationWillTerminate, o restante se manteve muito próximo do exemplo do Property List.</span></p>
<div style="text-align: right;"><span><em>(@AdemarVarela)</em></span></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.mindbike.com.br/blog/?feed=rss2&#038;p=407</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Pesquisa da Lockerz</title>
		<link>http://www.mindbike.com.br/blog/?p=404</link>
		<comments>http://www.mindbike.com.br/blog/?p=404#comments</comments>
		<pubDate>Mon, 06 Sep 2010 17:35:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Mindbike]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[XCode]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://www.mindbike.com.br/blog/?p=404</guid>
		<description><![CDATA[Para quem tem Lockerz, veja a http://www.lockerz.com/dailies do dia 4 de Setembro&#8230; Para quem não tem, disponibilizamos a tela com o resultado da pesquisa feita por eles.]]></description>
			<content:encoded><![CDATA[<p>Para quem tem Lockerz, veja a http://www.lockerz.com/dailies do dia 4 de Setembro&#8230;</p>
<p>Para quem não tem, disponibilizamos a tela com o resultado da pesquisa feita por eles.</p>
<p><img class="alignleft size-full wp-image-405" title="image001" src="http://www.mindbike.com.br/blog/wp-content/uploads/2010/09/image001.png" alt="image001" width="701" height="639" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mindbike.com.br/blog/?feed=rss2&#038;p=404</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apostila iPhone &#8211; Persistência de Dados</title>
		<link>http://www.mindbike.com.br/blog/?p=400</link>
		<comments>http://www.mindbike.com.br/blog/?p=400#comments</comments>
		<pubDate>Mon, 06 Sep 2010 14:30:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Mindbike]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[XCode]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://www.mindbike.com.br/blog/?p=400</guid>
		<description><![CDATA[Chegamos em um ponto interessante do nosso treinamento. Já conseguimos manipular vários elementos de interface, agora vamos aprender como manipular dados de persistentes. O que são dados persistentes? São informações que pretendemos armazenar em algum formato para posterior consulta. Dizemos que persistimos estas informações para garantir a integridade da informação, por exemplo, não adianta guardar [...]]]></description>
			<content:encoded><![CDATA[<p><span>Chegamos em um ponto interessante do nosso treinamento. Já conseguimos manipular vários elementos de interface, agora vamos aprender como manipular dados de persistentes. O que são dados persistentes? São informações que pretendemos armazenar em algum formato para posterior consulta. Dizemos que persistimos estas informações para garantir a integridade da informação, por exemplo, não adianta guardar uma informação sobre um determinado telefone que contenha letras, visto que pelo menos por enquanto só usamos números para isso.</span></p>
<p><span><strong>Property List</strong></span></p>
<p><span><span> </span>O primeiro tipo de persistência que vamos aprender é o chamado de <em>Property</em> <em>List</em>. Uma <em>Property</em> <em>List</em> é na verdade um arquivo no formato <strong>XML</strong> que permite alterar o seu conteúdo dinamicamente. Já estamos manipulando há algum tempo um arquivo do tipo Property List. Toda vez que usamos o info.plist do projeto, estamos manipulando um arquivo Property List (por isto a extensão plist). Repare que podemos acrescentar qualquer parâmetro neste tipo de arquivo. Já fizemos um execício anteriormente usando um arquivo no formato XML que na verdade estávamos tratando como sendo um <strong>plist</strong>.</span></p>
<p><span><span> </span>Como de costume, vamos criar um projeto para fazermos os conceitos básicos de persistência de uma plist. Crie um projeto chamado iPList. Mantendo nossas diretrizes, vamos criar um projeto do tipo Utility e sem a barra de status. Sempre fazemos isto para reforçar nossos conceitos aprendidos.</span></p>
<p><span><span> </span>Abra o resource MainView.xib, e vamos acrescentar alguns componentes do tipo UITextField. Na verdade vamos acrescentar 4 campos deste tipo. Para facilitar a nossa compreensão vamos colocar 4 componentes do tipo UILabel.</span></p>
<p><img class="alignleft size-large wp-image-401" title="figura-57" src="http://www.mindbike.com.br/blog/wp-content/uploads/2010/09/figura-57-1024x640.png" alt="figura-57" width="614" height="384" /></p>
<p>Feche o IB e retorne para o XCode.</p>
<p><span><span> </span>No arquivo MainViewController.h, inclua o seguinte código:</span></p>
<p><span>#import </span><span>&#8220;FlipsideViewController.h&#8221;</span></p>
<p><span>#define kFilename        @</span><span>&#8220;data.plist&#8221;</span></p>
<p><span>@interface</span><span> MainViewController : UIViewController &lt;FlipsideViewControllerDelegate&gt; {</span></p>
<p><span><span> </span></span><span>UITextField</span><span> *field1;</span></p>
<p><span><span> </span></span><span>UITextField</span><span> *field2;</span></p>
<p><span><span> </span></span><span>UITextField</span><span> *field3;</span></p>
<p><span><span> </span></span><span>UITextField</span><span> *field4; </span></p>
<p><span>}</span></p>
<p><span>@property</span><span> (</span><span>nonatomic</span><span>, </span><span>retain</span><span>) </span><span>IBOutlet</span><span> </span><span>UITextField</span><span> *field1;</span></p>
<p><span>@property</span><span> (</span><span>nonatomic</span><span>, </span><span>retain</span><span>) </span><span>IBOutlet</span><span> </span><span>UITextField</span><span> *field2;</span></p>
<p><span>@property</span><span> (</span><span>nonatomic</span><span>, </span><span>retain</span><span>) </span><span>IBOutlet</span><span> </span><span>UITextField</span><span> *field3;</span></p>
<p><span>@property</span><span> (</span><span>nonatomic</span><span>, </span><span>retain</span><span>) </span><span>IBOutlet</span><span> </span><span>UITextField</span><span> *field4;</span></p>
<p><span>- (</span><span>NSString</span><span> *)dataFilePath;</span></p>
<p><span>- (</span><span>void</span><span>)applicationWillTerminate:(</span><span>NSNotification</span><span> *)notification;</span></p>
<p><span>- (</span><span>IBAction</span><span>)showInfo;</span></p>
<p><span>@end</span></p>
<p><span><span> </span>Vamos analisar o código digitado.</span></p>
<p><span><span> </span>Logo na segunda linha temos um define. É neste define que estamos definindo o nome do arquivo <strong>XML</strong> que conterá as informações que digitaremos, no nosso caso, as informações que estarão contidas em <em>field1</em>, <em>field2</em>, <em>field3</em> e <em>field4</em>.</span></p>
<p><span><span> </span></span></p>
<p><span><span> </span>A propósito, se vocês repararem bem, acabamos de usar uma forma diferente de declarar as variáveis do tipo IB. Observem que colocamos a declaração IBOutlet na declaração do property. Isto é permitido também.</span></p>
<p><span><span> </span>Criamos também duas funções, que terão o seguinte objetivo:</span></p>
<ul>
<li>
<ul>
<li><span><strong>dataFilePath</strong>: é uma função que retornará o caminho que deverá conter o arquivo XML no formato plist.</span></li>
<li><span><strong>applicationWillTerminate</strong>: É um método que será chamado no momento que a aplicação estiver sendo encerrado. </span></li>
</ul>
</li>
</ul>
<p><span><span> </span>No arquivo MainViewController.m, digite o seguinte código:</span></p>
<p><span>#import </span><span>&#8220;MainViewController.h&#8221;</span></p>
<p><span>#import </span><span>&#8220;MainView.h&#8221;</span></p>
<p><span>@implementation</span><span> MainViewController</span></p>
<p><span>@synthesize</span><span> field1;</span></p>
<p><span>@synthesize</span><span> field2;</span></p>
<p><span>@synthesize</span><span> field3;</span></p>
<p><span>@synthesize</span><span> field4;</span></p>
<p><span>- (</span><span>NSString</span><span> *)dataFilePath {</span></p>
<p><span><span> </span></span><span>NSArray</span><span> *paths = </span><span>NSSearchPathForDirectoriesInDomains</span><span>(</span><span>NSDocumentDirectory</span><span>, </span><span>NSUserDomainMask</span><span>, </span><span>YES</span><span>);</span></p>
<p><span><span> </span></span><span>NSString</span><span> *documentsDirectory = [paths </span><span>objectAtIndex</span><span>:</span><span>0</span><span>];</span></p>
<p><span><span> </span></span><span>return</span><span> [documentsDirectory </span><span>stringByAppendingPathComponent</span><span>:kFilename];</span></p>
<p><span>}</span></p>
<p><span>- (</span><span>void</span><span>)applicationWillTerminate:(</span><span>NSNotification</span><span> *)notification {</span></p>
<p><span><span> </span></span><span>NSMutableArray</span><span> *array = [[</span><span>NSMutableArray</span><span> </span><span>alloc</span><span>] </span><span>init</span><span>];</span></p>
<p><span><span> </span>[array </span><span>addObject</span><span>:field1.</span><span>text</span><span>];</span></p>
<p><span><span> </span>[array </span><span>addObject</span><span>:field2.</span><span>text</span><span>];</span></p>
<p><span><span> </span>[array </span><span>addObject</span><span>:field3.</span><span>text</span><span>];</span></p>
<p><span><span> </span>[array </span><span>addObject</span><span>:field4.</span><span>text</span><span>];</span></p>
<p><span><span> </span>[array </span><span>writeToFile</span><span>:[</span><span>self</span><span> dataFilePath] </span><span>atomically</span><span>:</span><span>YES</span><span>];</span></p>
<p><span><span> </span>[array </span><span>release</span><span>];</span></p>
<p><span>}</span></p>
<p><span>- (</span><span>id</span><span>)initWithNibName:(</span><span>NSString</span><span> *)nibNameOrNil bundle:(</span><span>NSBundle</span><span> *)nibBundleOrNil {</span></p>
<p><span> </span><span>if</span><span> (</span><span>self</span><span> = [</span><span>super</span><span> </span><span>initWithNibName</span><span>:nibNameOrNil </span><span>bundle</span><span>:nibBundleOrNil]) {</span></p>
<p><span> </span><span>// Custom initialization</span></p>
<p><span> }</span></p>
<p><span> </span><span>return</span><span> </span><span>self</span><span>;</span></p>
<p><span>}</span></p>
<p><span>- (</span><span>void</span><span>)viewDidLoad {</span></p>
<p><span><span> </span></span><span>NSString</span><span> *filePath = [</span><span>self</span><span> dataFilePath];</span></p>
<p><span><span> </span></span><span>if</span><span> ([[</span><span>NSFileManager</span><span> </span><span>defaultManager</span><span>] </span><span>fileExistsAtPath</span><span>:filePath]) {</span></p>
<p><span><span> </span></span><span>NSArray</span><span> *array = [[</span><span>NSArray</span><span> </span><span>alloc</span><span>] </span><span>initWithContentsOfFile</span><span>:filePath];</span></p>
<p><span><span> </span>field1.text = [array </span><span>objectAtIndex</span><span>:</span><span>0</span><span>];</span></p>
<p><span><span> </span>field2.text = [array </span><span>objectAtIndex</span><span>:</span><span>1</span><span>];</span></p>
<p><span><span> </span>field3.text = [array </span><span>objectAtIndex</span><span>:</span><span>2</span><span>];</span></p>
<p><span><span> </span>field4.text = [array </span><span>objectAtIndex</span><span>:</span><span>3</span><span>];</span></p>
<p><span><span> </span>[array </span><span>release</span><span>];</span></p>
<p><span><span> </span>}</span></p>
<p><span><span> </span></span><span>UIApplication</span><span> *app = [</span><span>UIApplication</span><span> </span><span>sharedApplication</span><span>];</span></p>
<p><span><span> </span>[[</span><span>NSNotificationCenter</span><span> </span><span>defaultCenter</span><span>] </span><span>addObserver</span><span>:</span><span>self</span><span> </span><span>selector</span><span>:</span><span>@selector</span><span>(</span><span>applicationWillTerminate</span><span>: ) </span><span>name</span><span>:</span><span>UIApplicationWillTerminateNotification</span><span> </span><span>object</span><span>:app];</span></p>
<p><span><span> </span>[</span><span>super</span><span> </span><span>viewDidLoad</span><span>];</span></p>
<p><span>}</span></p>
<p><span>- (</span><span>void</span><span>)flipsideViewControllerDidFinish:(</span><span>FlipsideViewController</span><span> *)controller {</span></p>
<p><span><span> </span>[</span><span>self</span><span> </span><span>dismissModalViewControllerAnimated</span><span>:</span><span>YES</span><span>];</span></p>
<p><span>}</span></p>
<p><span>- (</span><span>IBAction</span><span>)showInfo { </span></p>
<p><span><span> </span></span><span>FlipsideViewController</span><span> *controller = [[</span><span>FlipsideViewController</span><span> </span><span>alloc</span><span>] </span><span>initWithNibName</span><span>:</span><span>@&#8221;FlipsideView&#8221;</span><span> </span><span>bundle</span><span>:</span><span>nil</span><span>];</span></p>
<p><span><span> </span>controller.</span><span>delegate</span><span> = </span><span>self</span><span>;</span></p>
<p><span><span> </span>controller.modalTransitionStyle = </span><span>UIModalTransitionStyleFlipHorizontal</span><span>;</span></p>
<p><span><span> </span>[</span><span>self</span><span> </span><span>presentModalViewController</span><span>:controller </span><span>animated</span><span>:</span><span>YES</span><span>];</span></p>
<p><span><span> </span>[controller </span><span>release</span><span>];</span></p>
<p><span>}</span></p>
<p><span>- (</span><span>void</span><span>)didReceiveMemoryWarning {</span></p>
<p><span><span> </span>[</span><span>super</span><span> </span><span>didReceiveMemoryWarning</span><span>];</span></p>
<p><span>}</span></p>
<p><span>- (</span><span>void</span><span>)viewDidUnload {</span></p>
<p><span><span> </span></span><span>self</span><span>.</span><span>field1</span><span> = </span><span>nil</span><span>;</span></p>
<p><span><span> </span></span><span>self</span><span>.</span><span>field2</span><span> = </span><span>nil</span><span>;</span></p>
<p><span><span> </span></span><span>self</span><span>.</span><span>field3</span><span> = </span><span>nil</span><span>;</span></p>
<p><span><span> </span></span><span>self</span><span>.</span><span>field4</span><span> = </span><span>nil</span><span>;</span></p>
<p><span><span> </span>[</span><span>super</span><span> </span><span>viewDidUnload</span><span>];</span></p>
<p><span>}</span></p>
<p><span>- (</span><span>void</span><span>)dealloc {</span></p>
<p><span><span> </span>[</span><span>field1</span><span> </span><span>release</span><span>];</span></p>
<p><span><span> </span>[</span><span>field2</span><span> </span><span>release</span><span>];</span></p>
<p><span><span> </span>[</span><span>field3</span><span> </span><span>release</span><span>];</span></p>
<p><span><span> </span>[</span><span>field4</span><span> </span><span>release</span><span>];</span></p>
<p><span><span> </span>[</span><span>super</span><span> </span><span>dealloc</span><span>];</span></p>
<p><span>}</span></p>
<p><span>@end</span></p>
<p><span><span> </span>Podemos observar que quase todos os comandos digitados já foram utilizados exaustivamente por nós. Eu disse quase todos, porque temos dois que ainda não vimos, <strong>UIApplication</strong> e <strong>NSNotificationCenter</strong>.</span></p>
<p><span><span> </span>Usamos o UIApplication para instanciar uma aplicação. No nosso caso, estamos instanciando uma variável (app) com a própria aplicação que estamos executando. Usaremos esta variável no momento que formos informar a aplicação, que existe uma notificação de encerramento para esta aplicação. Quando ocorrer o encerramento da aplicação, ocorrerá uma notificação chamada </span><span>UIApplicationWillTerminateNotification</span><span>, que irá disparar a execução do método </span><span>applicationWillTerminate</span><span>. É isto que o comando NSNotificationCenter faz, informa o que será executado no momento que uma notificação ocorrer. Chamamos este tipo de intervenção, de execução de método condicionado. Um determinado método, só está sendo executado mediante uma condição específica que ocorreu através de uma ação do usuário. </span></p>
<p><strong>Exercício</strong></p>
<p><span>1. Crie um projeto chamado iAgenda. Grave em um plist chamado “agenda.plist” o nome, o endereço e o telefone. Consista as informações, grave somente se todos os campos possuirem conteúdo.</span></p>
<div style="text-align: right;"><span><em>(@AdemarVarela)</em></span></div>
]]></content:encoded>
			<wfw:commentRss>http://www.mindbike.com.br/blog/?feed=rss2&#038;p=400</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

