Mostrando postagens com marcador iPad. Mostrar todas as postagens
Mostrando postagens com marcador iPad. Mostrar todas as postagens

sábado, 30 de junho de 2012

iOS: Dicas

Olá povo,

Como tô mexendo muito com iOS ultimamente vou registrar aqui algumas pequenas dicas no desenvolvimento de aplicações para iOS.

Dica 1 - Adicionando botões na navigation bar dinâmicamente
UIBarButtonItem *saveButton = [[UIBarButtonItem alloc]
  initWithTitle:@"Salvar" 
  style:UIBarButtonItemStyleDone 
  target:self action:@selector(salvarDados)];
[self.navigationItem setRightBarButtonItem:saveButton];

Dica 2 - Ocultando o teclado virtual

O teclado virtual do iOS é exibido automaticamente quando você clica em uma caixa de texto (UITextFiedl), se tornando o "primeiro a responder" (firstResponder) a eventos de toque. Entretanto para fechá-la você vai codificar um pouquinho. Digamos que em uma tela você tenha 3 caixas de texto. Quando o usuário estiver na primeira caixa de texto ele terá a opção de pular para o próximo campo clicando no botão Next no teclado virtual. Para habilitar esse botão altere a propriedade Return Button do TextField para Next. Faça o mesmo no segundo (e nos outros que você precisar). No último coloque Done na mesma propriedade.
Agora ligue o evento Did End On Exit de todas as caixas de texto para o método abaixo.

- (IBAction)hideKeyboard:(id)sender {
  if ([sender isEqual:edtName] == YES){
    [edtAddress becomeFirstResponder];
  } else if ([sender isEqual:edtAddress] == YES){
    [edtPhone becomeFirstResponder];
  } else {
    [edtName resignFirstResponder];
    [edtAddress resignFirstResponder];
    [edtPhone resignFirstResponder];
  }
}
Isso resolve o problema da navegação. Mas uma coisa comum é, ao clicarmos fora da caixa de texto, o teclado desaparecer. Para fazer isso, clique na View da tela e mude seu tipo de classe de UIView para UIControl. Depois associe o evento Touch Up Inside para o método acima.
O parâmetro sender identifica qual componente disparou o evento. Se não foi nenhum dos dois primeiros TextFields ocultamos o teclado chamando o método resignFirstResponder (o TextField agora é o "primeiro respondedor"). Pronto! Agora ao clicar em qualquer área da tela, o teclado desaparecerá.

Dica 3 - Editando células da UITableView

Quando precisamos, em algum tipo de listagem, excluir um registro, podemos recorrer a um recurso bacana do iOS: deslizar sobre célula. Quando isso acontece o método tableView:editingStyleForRowAtIndexPath é chamado. Aqui podemos retornar um estilo de edição para a célula: UITableViewCellEditingStyleDelete ou UITableViewCellEditingStyleInsert.
-(UITableViewCellEditingStyle)tableView:
    (UITableView *)tableView 
  editingStyleForRowAtIndexPath:
    (NSIndexPath *)indexPath{

    return UITableViewCellEditingStyleDelete;
}
Quando deslizar o dedo para a direita sobre a célula, aparecerá ao botão Delete na célula. Para tratar o evento desse botão devemos implementa o método abaixo:
-(void)tableView:(UITableView *)tableView 
 didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath {
}
Uma outra opção é colocar utilizar o código abaixo ao clicar em um UIBarButton.
-(void)habilitarExcluir:(id)sender {
  [self.tableView setEditing:
    !self.tableView.editing animated:YES];
}
E realizar o código da exclusão no método abaixo:
- (void)tableView:(UITableView *)tableView 
  commitEditingStyle:(UITableViewCellEditingStyle)editingStyle 
  forRowAtIndexPath:(NSIndexPath *)indexPath {

  if (editingStyle == 
    UITableViewCellEditingStyleDelete) {
  }   
}

Dica 4 - Abrindo uma URL no Browser

O código abaixo também aplica-se a telefone (tel:88990099) e mapas...
NSURL *url = [NSURL URLWithString:
  @"http://nglauber.blogspot.com"];
[[UIApplication sharedApplication] openURL:url];

Dica 5 - iPhone ou iPad?

Em uma aplicação Universal (que roda em iPhone e iPad) para checar se o device é um iPhone (ou iPod) ou iPad utilizamos o código abaixo:
if ([[UIDevice currentDevice] userInterfaceIdiom] == 
  UIUserInterfaceIdiomPhone) {
  //iPhone ou iPod
} else {
  // iPad
}

Dica 6 - Salvando Objetos com NSUserDefaults

Para salvar um objeto todo no NSUserDefaults você deve implementar os métodos que vão serializar e deserializar os dados...
// NSPessoa.h --------------------------------
#import 

@interface NSPessoa : NSObject

@property (nonatomic, strong) NSString *nome;
@property (nonatomic, strong) NSString *email;

@end

// NSPessoa.m --------------------------------
#import "NSPessoa.h"

@implementation NSPessoa

@synthesize nome, email;

- (void)encodeWithCoder:(NSCoder *)encoder {
  [encoder encodeObject:self.nome  forKey:@"nome"];
  [encoder encodeObject:self.email forKey:@"email"];
}

- (id)initWithCoder:(NSCoder *)decoder {
  if((self = [super init])) {
    self.nome  = [decoder decodeObjectForKey:@"nome"];
    self.email = [decoder decodeObjectForKey:@"email"];
  }
  return self;
}
@end

Abaixo o código para carregar e salvar os dados.
// Carregando ----------------------------------
NSUserDefaults *prefs = 
  [NSUserDefaults standardUserDefaults];

NSData *data = [prefs objectForKey:@"pessoa"];
NSPessoa *pessoa = (NSPessoa *)
  [NSKeyedUnarchiver unarchiveObjectWithData: data];

// se os dados da pessoa não existirem, 
// inicia um novo objeto    
if (!pessoa){
  pessoa = [NSPessoa new];
}

// Salvando ------------------------------------
NSData *data = [NSKeyedArchiver 
  archivedDataWithRootObject:pessoa];

NSUserDefaults *defaults = 
  [NSUserDefaults standardUserDefaults];

[defaults setObject:data forKey:@"pessoa"];

Qualquer dúvida, deixem seus comentários.

4br4ç05,
nglauber

terça-feira, 3 de abril de 2012

iOS: Internacionalização

Olá povo,

Aqui vai o primeiro vídeo-post aqui do blog: Internacionalização no iOS.


Espero que vocês gostem. Qualquer dúvida, deixem seus comentários.

4br4ç05,
nglauber

sexta-feira, 5 de agosto de 2011

Apple Fail

Olá povo,

Como vocês sabem, aqui no blog coloco coisas da minha vida profissional, então a maioria dos exemplos de código que eu coloco aqui, vem de necessidades minhas, ou de alunos/colegas durante o desenvolvimento de seus projetos. Entretanto, dessa vez não serão exemplos de código que colocarei aqui, e sim um registro, para que eu lembre e quem sabe até me retrate depois em relação a Apple.

Não estou nada satisfeito com os produtos da companhia do Steve Jobs. Comprei meu Macbook (branco) em Fevereiro deste ano, e em julho, após pagar os U$30 para atualizar o sistema operacional para a versão Lion, o computador já travou 3 vezes apresentando e tela de "kernel panic". Tudo bem que o Lion está na primeira versão, mas devemos combinar que isso é inadmissível.

Também não tive uma boa experiência com o tablet "da maçã". Em junho, comprei um iPad 2 (16GB + Wi-Fi + 3G) pois estava bastante motivado para desenvolver aplicações para iOS. Porém, após 32 dias de uso o mesmo apresentou um defeito: uma linha de pixels queimados de cima a baixo. Isso mesmo, uma linha de "dead pixels".

Acabei de solicitar a devolução do mesmo junto a empresa onde adquiri, e felizmente acho que vou conseguir meu dinheiro de volta. Se isso acontecer, comprarei um outro tablet, mas com certeza, não será um iPad, pois duas experiências ruins de uma vez não são lá muito motivadoras.

Por ser um professor, e ter uma pequena parcela de participação na formação de pessoas, acho legal ter um registro como esse para que elas não fiquem com a imagem de que a Apple é perfeita. Não é, e pelo que eu vi depois dessas experiências, está longe disso.

4br4ç05,
nglauber

terça-feira, 8 de fevereiro de 2011

Hello World iPhone

Olá povo,

A muito tempo que deveria ter escrito esse post. Passei 2010 entre iPhone e Android graças ao meu mestrado, e hoje vou apresentar pra vocês como começar a desenvolver aplicativos para o iOS, o sistema operacional dos dispositivos móveis da Apple (iPhone, iPad e iPod touch).
Para começo de conversa, precisamos de um computador que rode o Mac OS X. Pelas vias legais, você deve ter um Macbook, iMac, Mac Pro ou Mac mini. Entretanto você pode recorrer a um bom e velho Hackintosh ou instalar uma máquina virtual com o sistema operacional da Apple.
O kit de desenvolvimento está disponível no site da Apple (developer.apple.com) e pode ser baixado livremente, bastando apenas fazer o registro gratuitamente. Ele só é "um pouquinho" grande, tem cerca de 3.6GB, então se for baixar via dial-up, esqueça! :) (não que eu acredite que um desenvolvedor ainda acesse internet assim). A instalação é bem simples, basta seguir o assistente. A última versão do SDK exige a versão 10.6.4 ou superior do Mac OS, e uma recomendação é que sua máquina tenha 2GB de memória pra trabalhar bem.

As principais ferramentas do SDK são: Xcode, Interface Builder e os Emuladores do iPhone e iPad.
A primeira, é a IDE, onde criamos e gerenciamos nossos projetos, além de escrever o código fonte, compilar e executar a aplicação. O Interface Builder é um editor visual onde podemos criar as telas da aplicação e fazer a associação de componentes visuais para atributos da classe (criada no Xcode), e de eventos disparados por componentes a métodos declarados no código fonte. Quando o código fonte é compilado, ele pode ser testado no emulador. Na versão atual, temos emuladores para iPhone e iPad, porém funcionalidades como acelerômetro e GPS não estão disponíveis neles. Sendo assim, para testar esse tipo de funcionalidade precisamos de um aparelho real, e para tal, você deve pagar por uma licença de desenvolvedor. Com esse licença, você obtém uma assinatura que deve ser usada em suas aplicações de modo a instalá-las no aparelho. Mas se você já fez o Jailbreak no seu iPhone, podem testar sem licença mesmo :)

Nosso exemplo fará um bom e velho HelloWorld. Para começãr, execute o Xcode e vá até o menu File > New project. Será exibida a tela abaixo:

O Xcode disponibiliza alguns templates que criam a estrutura básica do projeto dependendo de sua funcionalidade. Utilizaremos o template "View based Application", selecione-o e clique em Choose. Em seguida, dê o nome ao seu projeto (eu coloquei ExemploBlog) e clique em ok.
O nosso projeto será exibido no Xcode conforme a imagem abaixo.


No lado direito é exibido o conteúdo de uma pasta na parte superior e o conteúdo do arquivo na parte inferior. No lado esquerdo fica a estrutura do nosso projeto organizado em pastas. As principais são as pastas Classes e Resources. Na primeira ficam os arquivos de código fonte, que assim como em C e C++ fica divido em arquivos de cabeçalho (.h) e de implementação (.m). Já as imagens e os arquivos que definem a interface gráfica (chamados de NIBs mas com extensão .xib) ficam no diretório Resources.

Vamos resumir como um programa iOS começa. Ele inicia com um arquivo chamado main.m (que fica na pasta Other Resources) que lê um arquivo que tem o mesmo nome do projeto e com extensão .plist. Nesse arquivo, existe a definição de qual será o NIB principal da aplicação. Nesse NIB constam: uma referência para a classe que implementa UIApplicationDelegate; uma instância de UIWindow que representa a tela do aparelho; e opcionalmente uma referência para UIViewController que trata os eventos de interface gráfica.

Vejam que nosso projeto tem a classe ExemploBlogAppDelegate. Que tem o seguinte código:

// Arquivo .h
#import <UIKit/UIKit.h>

@class ExemploBlogViewController;

@interface ExemploBlogAppDelegate : NSObject
<UIApplicationDelegate>{

UIWindow *window;
ExemploBlogViewController *viewController;
}

@property (nonatomic, retain) IBOutlet
UIWindow *window;
@property (nonatomic, retain) IBOutlet
ExemploBlogViewController *viewController;

@end

// Arquivo .m
#import "ExemploBlogAppDelegate.h"
#import "ExemploBlogViewController.h"

@implementation ExemploBlogAppDelegate

@synthesize window;
@synthesize viewController;

- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:
(NSDictionary *)launchOptions {

[self.window addSubview:viewController.view];
[self.window makeKeyAndVisible];

return YES;
}

- (void)dealloc {
[viewController release];
[window release];
[super dealloc];
}
@end

O arquivo .h acima define: de qual estamos herdando; (opcionalmente) quais interfaces ele implementa; as declarações de atributos; e declarações de métodos. Nesse arquivo estão definidos dois atributos: window e viewController. Em Objective-C temos o conceito de propriedades muito conhecido dos desenvolvedores Delphi e C#. Não vamos entrar em detalhes sobre isso, mas pensem nelas como sendo atalhos para métodos GET e SET.
Ainda no código acima, temos o método application:didFinishLaunchingWithOptions que é chamado quando a aplicação é carregada, e quando isso ocorre, a View (que define uma tela da aplicação) do ViewController (que trata os evento dessa tela) é adicionada a Window, e logo em seguida, torna-se visível. Ao final, o método dealloc, libera a memória alocada pela tela.
Como você pode ver, o ViewController declarado é do tipo ExemploBlogViewController (que está declarada nos arquivos de mesmo nome com extensão .h e .m). TodoViewController tem uma View associada que dispara eventos para ele. No nosso projeto, essa View está definida no arquivo ExemploBlogViewController.xib. Dê um duplo clique nesse arquivo e será aberto o InterfaceBuilder.

O InterfaceBuilder é composto por quatro janelas principais: Main, View, Attributes e Library. A primeira exibe a estrutura do arquivo; a segunda, é o editor visual onde adicionamos os componentes e podemos ter uma idéia de como ficará a tela; na janela attributes podemos alterar as propriedades dos componentes da tela; na última, temos todos os componentes que podemos adicionar à tela.


Adicione um Label da janela Library para a janela Window. Dê um duplo-clique no componente adicionado e digite um novo valor para o texto. Selecione o Label, e na janela Attributes altere a cor do texto (você consegue achar né? :). Depois altere o tamanho do texto. Por fim, salve as alterações e volte para o Xcode.

Clique no Build and Run, e o emulador do iPhone iniciará com nossa aplicação executando! \o/


Que beleza hein!? Um HelloWorld sem digitar nenhuma linha de código! :)
No próximo post vamos falar um pouco sobre Objective-C e veremos como tratar eventos de componentes.
Espero que tenham gostado. Dúvidas e melhorias, deixem seus comentários.

4br4ç05,
nglauber

quinta-feira, 7 de outubro de 2010

Especialização em TECNOLOGIAS PARA DESENVOLVIMENTO DE APLICAÇÕES MÓVEIS

Olá povo,

O CESAR.edu está lançando o curso de Especialização em Engenharia de Software com ênfase em Tecnologias para Desenvolvimento de Aplicações Móveis (TECDAM) onde o aluno aprenderá a desenvolver aplicações para as plataformas: Android, iOS (iPhone, iPad e iPod), Windows Mobile, Windows Phone 7, BADA, Java ME, Flash Lite, .Net Compact Framework, Appcelerator, Elips, Adobe Air, W3C Widgets, Silverlight e XNA.

O curso será ministrado as sextas (das 18:30 as 22:00) e aos sábados (08:00 as 17:00) nas instalações do CESAR, com aulas práticas e com o apoio de professores que além de experiência em sala de aula, são profissionais especializados nas disciplinas que ministram.

Para obter mais informações clique aqui.

4br4ç05,
nglauber

sábado, 6 de março de 2010

Microsoft's Courier 'digital journal'

Olá povo,

A moda dos Tablets parece que vai pegar mesmo. Depois do lançamento do iPad, agora é a vez da Microsoft apresentar o seu novo brinquedinho. Eu achei a idéia do Courier explêndida, será um MID (Mobile Internet Device) que além de ser "e-book-reader", também é uma agenda, um álbum de fotografias, tem câmera, browser e muito mais. Ele vem com uma caneta para o usuário escrever texto a mão livre e conta com tela multi-touch.


Nesse link vocês podem ver uma bela demonstração do que o Courier será capaz.

4br4ç05,
nglauber

Créditos da notícia para Bruno Vinícius. Valeu Ogro Gordo!