Coloque o feed RSS em seu aplicativo para iPhone
Colocando o texto Não esqueça de sempre testar o aplicativo e ver se todos os links estão funcionando como deveriam
por Lucas Longo (@iaibrasil)*
Continuando nosso aplicativo para leitura de notícias do site da MAC+ (veja as matérias anteriores -Parte 1, Parte 2- já publicadas), agora precisamos criar outro view controller e apresentar a notícia completa na tela do iPhone. As manchetes já estão em nosso table view e a ideia é, ao tocar no texto, que uma nova tela se abra com o texto do artigo.
Vamos lá. Neste momento do nosso projeto, o método que a célula foi clicada do delegate do Table View é chamado. Recebemos, então, o índice da célula tocada para pegar as informações de nosso array que estão na tabela.
Sendo assim, criamos um novo view controller e o apresentamos ao usuário pelo navigation controller. No modelo, já temos este método com algumas linhas de código comentadas:
RSSMainViewController.m
#pragma mark -
#pragma mark Table view delegate
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)
indexPath {
// Navigation logic may go here. Create and push another view controller.
/*
<#DetailViewController#> *detailViewController
= [[<#DetailViewController#> alloc]
initWithNibName:@”<#Nib name#>” bundle:nil];
// …
// Pass the selected object to the new view controller.
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];
*/
}
Vamos reaproveitar esse código comentado e, no lugar do DetailViewController, vamos colocar o nosso.
O primeiro passo, portanto, é criar uma nova subclasse de um UIViewController chamada RSSDetailViewController, que vai ser usada para exibir os detalhes da notícia selecionada pelo usuário na tela anterior.
No momento em que criamos nossa subclasse, passamos as informações necessárias da célula selecionada via uma propriedade de instância que vamos criar nesta subclasse.
Vamos ao passo a passo:
1 Selecione File > New > New File… no Xcode.
2 Escolha iOS > Cocoa Touch > UIViewController subclasse.
3 Crie uma subclasse do UIViewController com a opção de With XIB for user interface selecionada.
4 Finalmente, dê um nome para a subclasse.
No header da nossa subclasse, vamos declarar um dicionário que será usado para receber as informações da tela anterior. Fazemos isso, também, em quatro passos.
1 Primeiramente, declare a variável na interface.
2 Defina esta variável como uma propriedade.
Atenção: propriedades (nonatomic/atomic) permitem ou não a interrupção do “setter” ou “getter” por outra thread.
Obs.: em (retain/assign), o “setter” dá um retain na variável ou não. RSSDetailViewController.h
#import <UIKit/UIKit.h>
@interface RSSDetailViewController : UIViewController {
NSDictionary* newsDict;
}
@property(nonatomic,retain)NSDictionary* newsDict;
@end
3. Na implementação, crie o getter/setter por meio da macro @synthesize
4. Não se esqueça de dar um release na variável, pois quando ela for indicada (setada), daremos o retain nela no passo 2.
RSSDetailViewController.m
#import “RSSDetailViewController.h”
@implementation RSSDetailViewController
@synthesize newsDict;
- (void)dealloc
{
[newsDict release];
[super dealloc];
}
Pronto. Agora, criaremos esta subclasse no evento do toque de uma célula em nosso table view. O primeiro passo é importar nossa nova subclasse no RSSMainViewController.m para que o compilador saiba da existência dela:
RSSMainViewController.m
#import “RSSMainViewController.h”
#import “RSSDetailViewController.h”
@implementation RSSMainViewController
Em seguida, podemos criar a subclasse utilizando o método de inicialização com XIB do view controller. Depois, apresentamos o view controller pelo navigation controller.
Uma vez apresentado, podemos dar um release na instância.
RSSMainViewController.m
#pragma mark -
#pragma mark Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// Navigation logic may go here. Create and push another view controller. RSSDetailViewController *detailViewController
= [[RSSDetailViewController alloc]
initWithNibName:@”RSSDetailViewController”
bunlde:nil];
// …
// Pass the selected object to the new view controller.
[self.navigationController pushViewContro
ller:detailViewController animated:YES];
[detailViewController release];
}
Notem que no próprio código já existe também um comentário dizendo para passar o objeto selecionado para o novo view controller. Pegamos, então, o dicionário no índice tocado do array e passamos para a instância que acabamos de criar:
RSSMainViewController.m
#pragma mark -
#pragma mark Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *) indexPath {
// Navigation logic may go here. Create and push another view controller.
RSSDetailViewController *detailViewController
= [[RSSDetailViewController alloc] initWithNibName:@”RSSDetailViewController” bundle:nil];
// …
// Pass the selected object to the new view controller.
NSDictionary* dictSelecionado = [noticiasArray objectAtIndex:indexPath.row];
detailViewController.newsDict = dict-Selecionado;
[self.navigationController push ViewController:detailViewController animated:YES];
[detailViewController release];
Para testar, rode o aplicativo no simulador. Ao clicar em uma das células, uma tela em branco deverá aparecer.
No viewDidLoad do detalhe, podemos imprimir o dicionário recebido para verificar se está tudo como deveria ser.
RSSDetailViewController.m
#pragma mark – View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
NSLog(@”News Dict %@”, [newsDict description]);
}
Se tudo estiver OK, é hora de preparar a interface. Mas isso vai ficar para a próxima edição.
*Matéria publicada originalmente na MAC+ 61.






