{"id":272,"date":"2011-03-29T23:06:19","date_gmt":"2011-03-30T02:06:19","guid":{"rendered":"http:\/\/blog.renatopeterman.com.br\/?p=272"},"modified":"2011-04-26T07:57:48","modified_gmt":"2011-04-26T10:57:48","slug":"desenvolvendo-uma-aplicacao-simples-para-iphone-hello-world","status":"publish","type":"post","link":"https:\/\/renatopeterman.com.br\/blog\/2011\/03\/29\/desenvolvendo-uma-aplicacao-simples-para-iphone-hello-world\/","title":{"rendered":"Desenvolvendo sua primeira aplica\u00e7\u00e3o para iPhone"},"content":{"rendered":"<p>Este tutorial tem o objetivo de apresentar alguns conceitos b\u00e1sicos para desenvolvimento de uma aplica\u00e7\u00e3o simples para iPhone. Espero que seja \u00fatil para quem est\u00e1 iniciando os estudos com o SDK do iPhone. Para este tutorial \u00e9 necess\u00e1rio que voc\u00ea j\u00e1 tenha conhecimento em programa\u00e7\u00e3o. Ao final do tutorial est\u00e1 disponivel o arquivo com o projeto para o Xcode.<\/p>\n<p>A app a ser desenvolvida, ser\u00e1 constituida de um campo de texto (Text Field) e um bot\u00e3o e quando este bot\u00e3o for pressionado uma janela de alerta aparecer\u00e1 com o nome colocado no campo, caso n\u00e3o haja nenhum nome, o alerta informar\u00e1 uma mensagem pedindo para que seja inserido um nome no campo. A imagem abaixo mostra a aplica\u00e7\u00e3o em funcionamento.<\/p>\n<p style=\"text-align: center;\">\n<div id=\"attachment_414\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2011\/03\/imagem-final.jpg\" rel=\"lightbox\"><img aria-describedby=\"caption-attachment-414\" loading=\"lazy\" src=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2011\/03\/imagem-final-300x231.jpg\" alt=\"\" title=\"imagem-final\" width=\"300\" height=\"231\" class=\"size-medium wp-image-414\" srcset=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2011\/03\/imagem-final-300x231.jpg 300w, https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2011\/03\/imagem-final.jpg 1006w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-414\" class=\"wp-caption-text\">App<\/p><\/div><\/p>\n<p style=\"text-align: center;\">\n<p style=\"text-align: left;\">Bom, ent\u00e3o vamos l\u00e1, a IDE de desenvolvimento XCode roda apenas no Mac OSX ent\u00e3o voc\u00ea vai precisar de um computador com o Mac OSX instalado para poder executa-lo, abaixo o que foi utilizado:<\/p>\n<p><!--more--><\/p>\n<ul>\n<li>Mac OSX Snow Leopard 10.6.4<\/li>\n<li><a href=\"http:\/\/developer.apple.com\/\" target=\"_blank\">XCode 3.2.3 e iPhone SDK 4.0.1<\/a><\/li>\n<\/ul>\n<p>\n<strong>1. Criando um novo projeto<\/strong><\/p>\n<p>Quando o XCode \u00e9 iniciado ele traz uma janela de boas vindas, ent\u00e3o voc\u00ea pode criar o novo projeto clicando no menu File &gt; New Project ou clicando no bot\u00e3o &#8220;Create a new Xcode project&#8221; na tela de boas vindas, conforme mostra a figura abaixo:<\/p>\n<div id=\"attachment_303\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a rel=\"lightbox\" href=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/09\/imagem-0001.jpg\" target=\"_blank\"><img aria-describedby=\"caption-attachment-303\" loading=\"lazy\" class=\"size-medium wp-image-303\" title=\"imagem-0001\" src=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/09\/imagem-0001-300x187.jpg\" alt=\"\" width=\"300\" height=\"187\" srcset=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/09\/imagem-0001-300x187.jpg 300w, https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/09\/imagem-0001-1024x640.jpg 1024w, https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/09\/imagem-0001.jpg 1280w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-303\" class=\"wp-caption-text\">Tela inicial do Xcode - Criando um novo projeto (clique para ampliar)<\/p><\/div>\n<p>Em seguida \u00e9 necess\u00e1rio selecionar o tipo de projeto a ser criado, podendo ser para MacOS, iPhone, iPad, etc&#8230; Vamos selecionar para iPhoneOS e escolher o template &#8220;View-based Application&#8221; conforme mostra a figura abaixo:<\/p>\n<div id=\"attachment_304\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a rel=\"lightbox\" href=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/09\/imagem-0002.jpg\" target=\"_blank\"><img aria-describedby=\"caption-attachment-304\" loading=\"lazy\" class=\"size-medium wp-image-304\" title=\"imagem-0002\" src=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/09\/imagem-0002-300x250.jpg\" alt=\"\" width=\"300\" height=\"250\" srcset=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/09\/imagem-0002-300x250.jpg 300w, https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/09\/imagem-0002.jpg 789w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-304\" class=\"wp-caption-text\">Escolhendo o tipo de projeto (clique para ampliar)<\/p><\/div>\n<p>Ap\u00f3s selecionado o template do projeto \u00e9 necess\u00e1rio escolher um nome (no meu caso, utilizei o nome <strong>TutorialIphone<\/strong>), em seguida \u00e9 criada a estrutura conforme mostra a figura abaixo:<\/p>\n<div id=\"attachment_306\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a rel=\"lightbox\" href=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/09\/imagem-0003.png\" target=\"_blank\"><img aria-describedby=\"caption-attachment-306\" loading=\"lazy\" class=\"size-medium wp-image-306\" title=\"imagem-0003\" src=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/09\/imagem-0003-300x187.png\" alt=\"\" width=\"300\" height=\"187\" srcset=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/09\/imagem-0003-300x187.png 300w, https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/09\/imagem-0003-1024x640.png 1024w, https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/09\/imagem-0003.png 1280w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-306\" class=\"wp-caption-text\">Janela do projeto com a estrutura de arquivos e o editor de c\u00f3digo (clique para ampliar)<\/p><\/div>\n<p>A estrutura do projeto basicamente \u00e9 composta por 5 pastas:<\/p>\n<p><strong>Classes:<\/strong> Aqui est\u00e3o localizadas as classes do projeto, ou seja, os arquivos funcionais que cont\u00e9m o c\u00f3digo fonte.<\/p>\n<p><strong>Other Sources: <\/strong>Outros arquivos de c\u00f3digo fonte, como por exemplo o arquivo main.m necess\u00e1rio por inicializar o programa.<\/p>\n<p><strong>Resources:<\/strong> Aqui est\u00e3o os arquivos de &#8220;recursos&#8221; do projeto, como por exemplo um arquivo <strong>.plist<\/strong> onde se encontra as configura\u00e7\u00f5es do projeto como nome, icone e etc&#8230; Nesta pasta est\u00e1 tamb\u00e9m os arquivos <strong>.xib<\/strong> que s\u00e3o as telas do programa desenvolvidas no Interface Builder.<\/p>\n<p><strong>Frameworks: <\/strong>Cont\u00e9m as bibliotecas e frameworks utilizados no projeto.<\/p>\n<p><strong>Products: <\/strong>Cont\u00e9m a aplica\u00e7\u00e3o final compilada <strong>.app<\/strong>.<br \/>\n<br \/>\n<strong>2. Criando a aplica\u00e7\u00e3o<\/strong><\/p>\n<p>Como n\u00f3s j\u00e1 utilizamos o template &#8220;View-based Application&#8221; n\u00e3o \u00e9 necess\u00e1rio que criemos um View Controller manualmente, mas \u00e9 bom que voc\u00ea saiba como este \u00e9 composto, \u00e9 s\u00f3 buscar na documenta\u00e7\u00e3o depois. O View Controller \u00e9 a visualiza\u00e7\u00e3o\/tela da sua Janela, por exemplo, se voc\u00ea tiver uma aplica\u00e7\u00e3o que tem duas telas diferentes, vai precisar de um outro View Controller (ex.: uma tela principal e uma tela que cont\u00e9m as informa\u00e7\u00f5es da app (about)).<\/p>\n<p>Como voc\u00ea pode notar, na pasta classes, ambos os objetos possuem dois arquivos, cada um com um extens\u00e3o diferente, no meu caso como eu usei o nome do projeto TutorialIphone eles est\u00e3o da seguinte forma:<\/p>\n<ul>\n<li>TutorialIphoneAppDelegate.h<\/li>\n<li>TutorialIphoneAppDelegate.m<\/li>\n<li>TutorialIphoneViewController.h<\/li>\n<li>TutorialIphoneViewController.m<\/li>\n<\/ul>\n<p>At\u00e9 aqui \u00e9 simples, os arquivos com extens\u00e3o <strong>.h<\/strong> s\u00e3o apenas uma interface onde s\u00e3o declarados os atributos e met\u00f3dos que estar\u00e3o presentes na implementa\u00e7\u00e3o que s\u00e3o os arquivos com extens\u00e3o <strong>.m<\/strong>.<\/p>\n<p>Neste tutorial n\u00e3o irei detalhar o funcionamento das classes TutorialIphoneAppDelegate.*, o que pode-se dizer, \u00e9 que esta classe seria a classe principal do projeto respons\u00e1vel pela aplica\u00e7\u00e3o em si, como no nosso projeto temos apenas uma &#8220;view&#8221; e utilizamos um template da pr\u00f3pria IDE, n\u00e3o ser\u00e1 necess\u00e1rio alterar o c\u00f3digo.<\/p>\n<p>Let&#8217;s code ! hehe. Primeiro, \u00e9 necess\u00e1rio declarar os atributos e fun\u00e7\u00f5es que ter\u00e1 na implementa\u00e7\u00e3o (*.m) na interface (*.h), no meu caso, na classe <strong>TutorialIphoneViewController<\/strong>, abaixo segue o c\u00f3digo comentado:<\/p>\n<pre>\n\n<div class=\"codecolorer-container objc default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/><\/div><\/td><td><div class=\"objc codecolorer\"><span class=\"co2\">\/\/TutorialIphoneViewController.h<\/span><br \/>\n<br \/>\n<span class=\"co1\">#import &lt;UIKit\/UIKit.h&gt;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">@interface<\/span> TutorialIphoneViewController <span class=\"sy0\">:<\/span> UIViewController <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <span class=\"co2\">\/\/Atributos<\/span><br \/>\n&nbsp; &nbsp; UIButton&nbsp; &nbsp; <span class=\"sy0\">*<\/span>button;<br \/>\n&nbsp; &nbsp; UITextField <span class=\"sy0\">*<\/span>textField;<br \/>\n&nbsp; &nbsp; UIAlertView <span class=\"sy0\">*<\/span>alert;<br \/>\n<br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"co2\">\/\/Necess\u00e1rio para que se possa utilizar esses objetos no Interface Builder<\/span><br \/>\n<span class=\"co2\">\/\/E associa-los aos componentes<\/span><br \/>\n<span class=\"kw1\">@property<\/span> <span class=\"br0\">&#40;<\/span>nonatomic, retain<span class=\"br0\">&#41;<\/span> IBOutlet UIButton <span class=\"sy0\">*<\/span>button;<br \/>\n<span class=\"kw1\">@property<\/span> <span class=\"br0\">&#40;<\/span>nonatomic, retain<span class=\"br0\">&#41;<\/span> IBOutlet UITextField <span class=\"sy0\">*<\/span>textField;<br \/>\n<br \/>\n<span class=\"co2\">\/\/Action que ser\u00e1 associada ao bot\u00e3o no Interface Builder<\/span><br \/>\n<span class=\"sy0\">-<\/span> <span class=\"br0\">&#40;<\/span>IBAction<span class=\"br0\">&#41;<\/span>btAction<span class=\"sy0\">:<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">id<\/span><span class=\"br0\">&#41;<\/span>sender;<br \/>\n<br \/>\n<span class=\"kw1\">@end<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n<\/pre>\n<p>O <strong>IBOutlet<\/strong> significa &#8220;Interface Builder Outlet&#8221;, \u00e9 o que permite associal o objeto a um componente no Interface Builder, simples n\u00e3o ?.<\/p>\n<p>A mesma coisa com o <strong>IBAction<\/strong>, mas nesse caso associamos um m\u00e9todo pra uma determinada a\u00e7\u00e3o de um componente, como por exemplo, ao apertar um bot\u00e3o esta a\u00e7\u00e3o\/m\u00e9todo ser\u00e1 executado, assim como no nosso exemplo.<\/p>\n<p>Agora vamos implementar os met\u00f3dos e inserir as variaveis no arquivo <strong>TutorialIphoneViewController.m<\/strong> (implementa\u00e7\u00e3o), segue o c\u00f3digo comentado abaixo:<\/p>\n<pre>\n\n<div class=\"codecolorer-container objc default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/>23<br \/>24<br \/>25<br \/>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/>31<br \/>32<br \/>33<br \/>34<br \/>35<br \/>36<br \/>37<br \/>38<br \/>39<br \/>40<br \/>41<br \/>42<br \/>43<br \/>44<br \/>45<br \/>46<br \/>47<br \/>48<br \/>49<br \/>50<br \/>51<br \/>52<br \/>53<br \/>54<br \/>55<br \/>56<br \/>57<br \/>58<br \/>59<br \/>60<br \/>61<br \/>62<br \/>63<br \/>64<br \/>65<br \/>66<br \/>67<br \/>68<br \/>69<br \/>70<br \/>71<br \/>72<br \/>73<br \/>74<br \/>75<br \/>76<br \/>77<br \/>78<br \/>79<br \/>80<br \/>81<br \/>82<br \/>83<br \/>84<br \/>85<br \/>86<br \/>87<br \/>88<br \/>89<br \/><\/div><\/td><td><div class=\"objc codecolorer\"><span class=\"co2\">\/\/TutorialIphoneViewController.m<\/span><br \/>\n<br \/>\n<span class=\"co1\">#import &quot;TutorialIphoneViewController.h&quot;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">@implementation<\/span> TutorialIphoneViewController<br \/>\n<br \/>\n<span class=\"kw1\">@synthesize<\/span> textField;<br \/>\n<span class=\"kw1\">@synthesize<\/span> button;<br \/>\n<br \/>\n<span class=\"sy0\">-<\/span><span class=\"br0\">&#40;<\/span>IBAction<span class=\"br0\">&#41;<\/span>btAction<span class=\"sy0\">:<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">id<\/span><span class=\"br0\">&#41;<\/span>sender <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <span class=\"co2\">\/\/ Cria um novo objeto &quot;UIAlertView&quot;<\/span><br \/>\n&nbsp; &nbsp; alert <span class=\"sy0\">=<\/span> <span class=\"br0\">&#91;<\/span><span class=\"br0\">&#91;<\/span>UIAlertView alloc<span class=\"br0\">&#93;<\/span> init<span class=\"br0\">&#93;<\/span>;<br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <span class=\"co2\">\/\/Delegate (basicamente especifica que<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co2\">\/\/o objeto alert pode trocar mensagens<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co2\">\/\/(interagir) com o view controller)<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co2\">\/\/ -&gt; ver documenta\u00e7ao para mais detalhes<\/span><br \/>\n&nbsp; &nbsp; alert.delegate <span class=\"sy0\">=<\/span> self;<br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <span class=\"co2\">\/\/Adiciona o botao com o texto &quot;OK&quot;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#91;<\/span>alert addButtonWithTitle<span class=\"sy0\">:<\/span><span class=\"co3\">@<\/span><span class=\"st0\">&quot;Ok&quot;<\/span><span class=\"br0\">&#93;<\/span>;<br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#91;<\/span>textField.text length<span class=\"br0\">&#93;<\/span> <span class=\"sy0\">==<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co2\">\/\/Atribui o seguinte titulo a janela de alerta<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; alert.title <span class=\"sy0\">=<\/span> <span class=\"co3\">@<\/span><span class=\"st0\">&quot;Aviso&quot;<\/span>;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co2\">\/\/Atribui a seguinte mensagem a janela de alerta<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; alert.message <span class=\"sy0\">=<\/span> <span class=\"co3\">@<\/span><span class=\"st0\">&quot;Informe seu nome&quot;<\/span>;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co2\">\/\/Mostra a janela de alerta<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#91;<\/span>alert show<span class=\"br0\">&#93;<\/span>;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co2\">\/\/Libera o objeto na mem\u00f3ria<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#91;<\/span>alert release<span class=\"br0\">&#93;<\/span>;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span> <span class=\"kw1\">else<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co2\">\/\/Cria um objeto de NSString<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <a href=\"http:\/\/developer.apple.com\/documentation\/Cocoa\/Reference\/Foundation\/Classes\/NSString_Class\/\"><span class=\"kw5\">NSString<\/span><\/a> <span class=\"sy0\">*<\/span>str <span class=\"sy0\">=<\/span> <span class=\"br0\">&#91;<\/span><span class=\"br0\">&#91;<\/span><a href=\"http:\/\/developer.apple.com\/documentation\/Cocoa\/Reference\/Foundation\/Classes\/NSString_Class\/\"><span class=\"kw5\">NSString<\/span><\/a> alloc<span class=\"br0\">&#93;<\/span> initWithFormat<span class=\"sy0\">:<\/span><span class=\"co3\">@<\/span><span class=\"st0\">&quot;Hello %@ !&quot;<\/span>,textField.text<span class=\"br0\">&#93;<\/span>;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co2\">\/\/Atribui este objeto de string para o titulo do alerta<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; alert.title <span class=\"sy0\">=<\/span> str;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co2\">\/\/Atribui a string &quot;Aplicativo de Teste&quot; na mensagem do alerta<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; alert.message <span class=\"sy0\">=<\/span> <span class=\"co3\">@<\/span><span class=\"st0\">&quot;Aplicativo de teste&quot;<\/span>;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co2\">\/\/Func\u00e3o que chama o alertview<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#91;<\/span>alert show<span class=\"br0\">&#93;<\/span>;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co2\">\/\/Libera a janela da mem\u00f3ria<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#91;<\/span>alert release<span class=\"br0\">&#93;<\/span>;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"co2\">\/\/Func\u00e3o respons\u00e1vel por esconder o teclado quando a tecla return ou done \u00e9 pressionada<\/span><br \/>\n<span class=\"sy0\">-<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw4\">BOOL<\/span><span class=\"br0\">&#41;<\/span>textFieldShouldReturn<span class=\"sy0\">:<\/span><span class=\"br0\">&#40;<\/span>UITextField <span class=\"sy0\">*<\/span><span class=\"br0\">&#41;<\/span>theTextField <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>theTextField <span class=\"sy0\">==<\/span> textField<span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#91;<\/span>textField resignFirstResponder<span class=\"br0\">&#93;<\/span>;<br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw2\">YES<\/span>;<br \/>\n&nbsp; &nbsp; <br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"sy0\">-<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw4\">void<\/span><span class=\"br0\">&#41;<\/span>didReceiveMemoryWarning <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co2\">\/\/ Releases the view if it doesn't have a superview.<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#91;<\/span>super didReceiveMemoryWarning<span class=\"br0\">&#93;<\/span>;<br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <span class=\"co2\">\/\/ Release any cached data, images, etc that aren't in use.<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"sy0\">-<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw4\">void<\/span><span class=\"br0\">&#41;<\/span>viewDidUnload <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co2\">\/\/ Release any retained subviews of the main view.<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co2\">\/\/ e.g. self.myOutlet = nil;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"co2\">\/\/Liberamos os objetos da mem\u00f3ria.<\/span><br \/>\n<span class=\"sy0\">-<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw4\">void<\/span><span class=\"br0\">&#41;<\/span>dealloc <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#91;<\/span>button release<span class=\"br0\">&#93;<\/span>;<br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#91;<\/span>textField release<span class=\"br0\">&#93;<\/span>;<br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#91;<\/span>super dealloc<span class=\"br0\">&#93;<\/span>;<br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">@end<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n<\/pre>\n<p>Na implementa\u00e7\u00e3o utilizamos o comando <strong>&#8220;@synthesize&#8221;<\/strong> para tornar acess\u00edveis as vari\u00e1veis que foram declaradas na interface da classe.<br \/>\nA fun\u00e7\u00e3o <strong>&#8220;dealloc&#8221;<\/strong> \u00e9 utilizada para liberar os objetos da mem\u00f3ria, devemos liberar todos os objetos para que n\u00e3o gera lixo (garbage) na mem\u00f3ria.<br \/>\nBasicamente \u00e9 esse o nosso c\u00f3digo, agora vamos criar a interface !<br \/>\n<br \/>\n<strong>3. Interface<\/strong><\/p>\n<p>Os arquivos de interface geralmente est\u00e3o localizados na pasta resources e utilizam a extens\u00e3o <strong>*.xib<\/strong>, de um duplo clique para edita-lo, em seguida ser\u00e1 aberto o Interface Builder (imagem abaixo):<\/p>\n<div id=\"attachment_391\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2011\/03\/imagem-0004.jpg\" rel=\"lightbox\"><img aria-describedby=\"caption-attachment-391\" loading=\"lazy\" src=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2011\/03\/imagem-0004-300x187.jpg\" alt=\"\" title=\"imagem-0004\" width=\"300\" height=\"187\" class=\"size-medium wp-image-391\" srcset=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2011\/03\/imagem-0004-300x187.jpg 300w, https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2011\/03\/imagem-0004.jpg 960w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-391\" class=\"wp-caption-text\">Interface Builder (clique para ampliar)<\/p><\/div>\n<p>Abaixo uma breve explica\u00e7\u00e3o de cada janela:<\/p>\n<p><strong>Janela A:<\/strong> Cont\u00e9m os objetos, como por exemplo, o objeto &#8220;view&#8221; que faz refer\u00eancia com a classe TutorialIphoneViewController, e vamos utilizar para conectar os componentes aos objetos do c\u00f3digo e tamb\u00e9m ao nosso m\u00e9todo (IBAction).<\/p>\n<p><strong>Janela B:<\/strong> Mostra a nossa &#8220;view&#8221;, onde podemos incluir os objetos e editar o posicionamento dos mesmos.<\/p>\n<p><strong>Janela C:<\/strong> Apresenta os atributos dos componentes selecionados.<\/p>\n<p><strong>Janela D:<\/strong> Cont\u00e9m todos objetos, classes ou arquivos de media dispon\u00edveis para serem utilizados na interface.<\/p>\n<p>Crie a sua &#8220;view&#8221;, de acordo com a que est\u00e1 na imagem acima, incluindo um campo de texto e um bot\u00e3o que ser\u00e3o vinculados com os objetos da classe.<\/p>\n<p>Agora vamos vincular os objetos declarados na classe com os componentes na &#8220;view&#8221;, e tamb\u00e9m associar a nossa action ao nosso bot\u00e3o para que quanto este for acionado chame o nosso met\u00f3do (action).<\/p>\n<p>Clique com o bot\u00e3o direito sobre o objeto &#8220;File&#8217;s Owner&#8221;, aparecer\u00e1 uma janela onde ser\u00e1 poss\u00edvel selecionar os atributos\/a\u00e7\u00f5es que foram declarados na classe e associa-los aos componentes na nossa interface. <\/p>\n<p>Para associar o atributo &#8220;button&#8221; da nossa classe, clique com o bot\u00e3o direito sobre o objeto &#8220;Files Owner&#8221;, e clique no circulo no final da op\u00e7\u00e3o e arraste at\u00e9 o bot\u00e3o como na imagem abaixo:<\/p>\n<div id=\"attachment_395\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a rel=\"lightbox\"  href=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2011\/03\/imagem-0006.jpg\"><img aria-describedby=\"caption-attachment-395\" loading=\"lazy\" src=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2011\/03\/imagem-0006-300x187.jpg\" alt=\"\" title=\"imagem-0006\" width=\"300\" height=\"187\" class=\"size-medium wp-image-395\" srcset=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2011\/03\/imagem-0006-300x187.jpg 300w, https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2011\/03\/imagem-0006.jpg 960w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-395\" class=\"wp-caption-text\">Botao<\/p><\/div>\n<p>Fa\u00e7a o mesmo para o campo de texto conforme a imagem abaixo:<\/p>\n<div id=\"attachment_396\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a rel=\"lightbox\" href=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2011\/03\/imagem-0007.jpg\"><img aria-describedby=\"caption-attachment-396\" loading=\"lazy\" src=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2011\/03\/imagem-0007-300x187.jpg\" alt=\"\" title=\"imagem-0007\" width=\"300\" height=\"187\" class=\"size-medium wp-image-396\" srcset=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2011\/03\/imagem-0007-300x187.jpg 300w, https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2011\/03\/imagem-0007.jpg 960w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-396\" class=\"wp-caption-text\">Vinculando text field<\/p><\/div>\n<p>Fa\u00e7a o mesmo para a nossa a\u00e7\u00e3o <strong>&#8220;btAction&#8221;<\/strong> e conecte ao nosso bot\u00e3o na interface, no entanto, ao fazer isso abrir\u00e1 uma nova janela com os comportamentos do bot\u00e3o, selecione <strong>&#8220;Touch Down&#8221;<\/strong>, a imagem abaixo ilustra o procedimento:<\/p>\n<div id=\"attachment_397\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a  rel=\"lightbox\" href=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2011\/03\/imagem-0008.jpg\"><img aria-describedby=\"caption-attachment-397\" loading=\"lazy\" src=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2011\/03\/imagem-0008-300x187.jpg\" alt=\"\" title=\"imagem-0008\" width=\"300\" height=\"187\" class=\"size-medium wp-image-397\" srcset=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2011\/03\/imagem-0008-300x187.jpg 300w, https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2011\/03\/imagem-0008.jpg 960w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-397\" class=\"wp-caption-text\">Atribuindo a a\u00e7\u00e3o ao bot\u00e3o<\/p><\/div>\n<p>Devemos referenciar o nosso campo de texto a nossa aplica\u00e7\u00e3o para que a fun\u00e7\u00e3o <strong>&#8220;textFieldShouldReturn&#8221;<\/strong> que est\u00e1 na nossa classe <strong>TutorialIphoneViewController.m<\/strong> seja executada quando o a tecla Done ou Return no teclado seja pressionada, escondendo assim o teclado. Para isso arraste <strong>&#8220;New Referecing Outlet&#8221;<\/strong> para o campo de texto, aparecer\u00e1 a op\u00e7\u00e3o <strong>&#8220;delegate&#8221;<\/strong>, selecione-a e pronto as duas imagens abaixo ilustra o procedimento:<\/p>\n<div id=\"attachment_398\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a  rel=\"lightbox\" href=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2011\/03\/imagem-0009.jpg\"><img aria-describedby=\"caption-attachment-398\" loading=\"lazy\" src=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2011\/03\/imagem-0009-300x187.jpg\" alt=\"\" title=\"imagem-0009\" width=\"300\" height=\"187\" class=\"size-medium wp-image-398\" srcset=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2011\/03\/imagem-0009-300x187.jpg 300w, https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2011\/03\/imagem-0009.jpg 960w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-398\" class=\"wp-caption-text\">Delegate-01<\/p><\/div>\n<div id=\"attachment_399\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2011\/03\/imagem-0010.jpg\" rel=\"lightbox\"><img aria-describedby=\"caption-attachment-399\" loading=\"lazy\" src=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2011\/03\/imagem-0010-300x187.jpg\" alt=\"\" title=\"imagem-0010\" width=\"300\" height=\"187\" class=\"size-medium wp-image-399\" srcset=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2011\/03\/imagem-0010-300x187.jpg 300w, https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2011\/03\/imagem-0010-1024x640.jpg 1024w, https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2011\/03\/imagem-0010.jpg 1280w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-399\" class=\"wp-caption-text\">Delegate-02<\/p><\/div>\n<p>Ap\u00f3s feito isso, a nossa interface est\u00e1 completa e com todos os componentes vinculados a nossa classe.<\/p>\n<p>\n<strong>4. FIM<\/strong><\/p>\n<p>Este \u00e9 um tutorial bem simples para desenvolver uma aplica\u00e7\u00e3o b\u00e1sica para iPhone, procurei n\u00e3o entrar muito em detalhes para que n\u00e3o ficar muito cansativo e extenso, \u00e9 um exemplo bem superficial mas espero que seja \u00fatil pra quem est\u00e1 iniciando na \u00e1rea.<\/p>\n<p>Se voc\u00ea deseja se aprofundar mais no assunto, a Apple disponibiliza toda a documenta\u00e7\u00e3o necess\u00e1ria, guias, tutoriais e etc&#8230; tudo muito bem documentado, tanto para iOS quanto Mac e tamb\u00e9m Safari. Para acessar o Apple Developer Center <a href=\"http:\/\/developer.apple.com\/\">clique aqui.\/<\/a><\/p>\n<p>\u00c9 isso, espero que seja \u00fatil. \ud83d\ude09<\/p>\n<p>Abaixo segue o link para download do projeto:<\/p>\n<p>Download: <a href=\"https:\/\/renatopeterman.com.br\/downloads\/TutorialIphone.zip\">TutorialIphone.zip<\/a><br \/>\n<br \/>\n<em style=\"color:red\">*NOTA: Comecei a desenvolver este tutorial em 2010, e como d\u00e1 um certo trabalho mudar tudo e j\u00e1 tinha come\u00e7ado, terminei de faze-lo na mesma vers\u00e3o dos softwares de quando comecei a desenvolve-lo, hoje j\u00e1 estamos na vers\u00e3o 4 do XCode e ocorreram algumas pequenas mudan\u00e7as na interface, como por exemplo, o Interface Builder est\u00e1 integrado na IDE, no entanto, isso n\u00e3o altera o prop\u00f3sito do tutorial.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Este tutorial tem o objetivo de apresentar alguns conceitos b\u00e1sicos para desenvolvimento de uma aplica\u00e7\u00e3o simples para iPhone. Espero que seja \u00fatil para quem est\u00e1 iniciando os estudos com o SDK do iPhone. Para este tutorial \u00e9 necess\u00e1rio que voc\u00ea &hellip; <a href=\"https:\/\/renatopeterman.com.br\/blog\/2011\/03\/29\/desenvolvendo-uma-aplicacao-simples-para-iphone-hello-world\/\">Continue lendo <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[10,33],"tags":[46,49,34,47,36,35,48,50,45],"_links":{"self":[{"href":"https:\/\/renatopeterman.com.br\/blog\/wp-json\/wp\/v2\/posts\/272"}],"collection":[{"href":"https:\/\/renatopeterman.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/renatopeterman.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/renatopeterman.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/renatopeterman.com.br\/blog\/wp-json\/wp\/v2\/comments?post=272"}],"version-history":[{"count":61,"href":"https:\/\/renatopeterman.com.br\/blog\/wp-json\/wp\/v2\/posts\/272\/revisions"}],"predecessor-version":[{"id":421,"href":"https:\/\/renatopeterman.com.br\/blog\/wp-json\/wp\/v2\/posts\/272\/revisions\/421"}],"wp:attachment":[{"href":"https:\/\/renatopeterman.com.br\/blog\/wp-json\/wp\/v2\/media?parent=272"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/renatopeterman.com.br\/blog\/wp-json\/wp\/v2\/categories?post=272"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/renatopeterman.com.br\/blog\/wp-json\/wp\/v2\/tags?post=272"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}