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