0 Vote up Vote down imprimir post Enviar por email Tutoriais » Mac Pro

Por dentro dos aplicativos

escrito por Ademar Varela em 16 de abril de 2009

Na última edição da MAC+, criamos um projeto do tipo Útil, algo bastante simples e sem muito código. Na verdade, nosso aplicativo até o momento só faz uma coisa: virar a tela quando se clica com o dedo sobre o pequeno [i]. Apesar do nome, não parece nada útil até o momento.

Agora vamos estudar alguns pontos interessantes sobre o código de nosso singelo aplicativo. Podemos observar que o wizard do Xcode criou duas pastas específicas para fazer o controle da transição, chamada de Flipside. Os códigos que controlam o efeito de transição estão nas pastas Main View e Flipside View. Basicamente as duas possuem os mesmo tipo de código, isto é, ambas contam com quatro arquivos. Como já mencionamos em matérias anteriores, arquivos com a extensão .h são arquivos header dos documentos com extensão .m. Pensando nisso, temos na pasta Main View o código MainView e MainController, e na pasta Flipside temos FlipsideView e FlipsideViewController.

O que são classes Controller?

Essas classes são responsáveis pelo gerenciamento de todos os componentes que serão usados por toda a aplicação ou parte dela. Em nosso exemplo, temos dois comportamentos parecidos tanto na MainView como na FlipsideView, por isso vamos estudar somente a MainView, pois os conceitos valem para ambas.

#import <UIKit/UIKit.h>

@interface MainViewController : UIViewController {

}

@end

#import “MainViewController.h”

#import “MainView.h”

@implementation MainViewController

- (id)initWithNibName:(NSString *)nibNameOrNil

∑ bundle:(NSBundle *)nibBundleOrNil {

if (self = [super initWithNibName:nibNameOrNil

∑ bundle:nibBundleOrNil]) {

// Custom initialization

}

return self;

}

// Implement viewDidLoad to do additional setup after ∑ loading the view, typically from a nib.

- (void)viewDidLoad {

[super viewDidLoad];

}

// Override to allow orientations other than the

∑ default portrait orientation.

- (BOOL)shouldAutorotateToInterfaceOrientation:

∑ (UIInterfaceOrientation)interfaceOrientation {

// Return YES for supported orientations

return (interfaceOrientation ==

∑ UIInterfaceOrientationPortrait);

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning]; // Releases the view if it doesn’t have a superview

// Release anything that’s not essential, such as cached data

}

- (void)dealloc {

[super dealloc];

}

@end

Na MainView temos cinco métodos declarados:

initWithNibName – Este método informa qual será o arquivo NIB utilizado;

viewDidLoad – Este método diz o que será feito quando a classe for inicializada;

shouldAutorotateToInterfaceOrientation – Este método é chamado quando a rotação do aparelho acontece. Também podemos limitar uma orientação específica para a aplicação: Portrait (retrato) ou Landscape (paisagem);

didReceiveMemoryWarning – Este método é chamado quando ocorre um aviso (warning) na memória no momento em que sua aplicação está sendo utilizada;

dealloc – Este método é chamado assim que sua aplicação for finalizada.

Utilizaremos esses métodos e outros mais à medida que formos nos aprofundando no desenvolvimento de um aplicativo. Chegou o momento de entender como funciona o Flipside. Como podemos observar, o wizard deixou as classes MainView e FlipView prontas para serem usadas, mas quem vai usá-las?

Vamos abrir a pasta Application Controllers que, como o próprio nome diz, é onde estão todos os controles que nossa aplicação utilizará. Como de costume, teremos a mesma quantidade de arquivos das pastas anteriores.

O RootViewController é a classe principal desse tipo de aplicação. Vamos encontrar quase todos os métodos falados na MainView aqui. A grande diferença estão nos métodos loadFlipsideViewController e toggleView.

#import “RootViewController.h”

#import “MainViewController.h”

#import “FlipsideViewController.h”

@implementation RootViewController

@synthesize infoButton;

@synthesize flipsideNavigationBar;

@synthesize mainViewController;

@synthesize flipsideViewController;

- (void)viewDidLoad {

[super viewDidLoad];

MainViewController *viewController =

∑ [[MainViewController alloc] initWithNibName:

∑ @”MainView” bundle:nil];

self.mainViewController = viewController;

[viewController release];

[self.view insertSubview:mainViewController.

∑ view belowSubview:infoButton];

}

- (void)loadFlipsideViewController {

FlipsideViewController *viewController =

∑ [[FlipsideViewController alloc] initWithNibName:

∑ @”FlipsideView” bundle:nil];

self.flipsideViewController = viewController;

[viewController release];

UINavigationBar *aNavigationBar =

∑ [[UINavigationBar alloc] initWithFrame:CGRectMake

∑ (0.0, 0.0, 320.0, 44.0)];

aNavigationBar.barStyle = UIBarStyleBlackOpaque;

self.flipsideNavigationBar = aNavigationBar;

[aNavigationBar release];

UIBarButtonItem *buttonItem =

∑ [[UIBarButtonItem alloc]

∑ initWithBarButtonSystemItem:

∑ UIBarButtonSystemItemDone target:self action:

∑ @selector(toggleView)];

UINavigationItem *navigationItem =

∑ [[UINavigationItem alloc]

∑ initWithTitle:@”materia3”];

navigationItem.rightBarButtonItem = buttonItem;

[flipsideNavigationBar pushNavigationItem:

∑ navigationItem animated:NO];

[navigationItem release];

[buttonItem release];

}

- (IBAction)toggleView {

if (flipsideViewController == nil) {

[self loadFlipsideViewController];

}

UIView *mainView = mainViewController.view;

UIView *flipsideView = flipsideViewController.view;

[UIView beginAnimations:nil context:NULL];

[UIView setAnimationDuration:1];

[UIView setAnimationTransition:

∑ ([mainView superview] ?

∑ UIViewAnimationTransitionFlipFromRight :

∑ UIViewAnimationTransitionFlipFromLeft) forView:

∑ self.view cache:YES];

if ([mainView superview] != nil) {

[flipsideViewController viewWillAppear:YES];

[mainViewController viewWillDisappear:YES];

[mainView removeFromSuperview];

[infoButton removeFromSuperview];

[self.view addSubview:flipsideView];

[self.view insertSubview:

∑ flipsideNavigationBar aboveSubview:flipsideView];

[mainViewController viewDidDisappear:YES];

[flipsideViewController viewDidAppear:YES];

} else {

[mainViewController viewWillAppear:YES];

[flipsideViewController viewWillDisappear:

∑ YES];

[flipsideView removeFromSuperview];

[flipsideNavigationBar removeFromSuperview];

[self.view addSubview:mainView];

[self.view insertSubview:

∑ infoButton aboveSubview:mainViewController.view];

[flipsideViewController viewDidDisappear:

∑ YES];

[mainViewController viewDidAppear:YES];

}

[UIView commitAnimations];

}

- (BOOL)shouldAutorotateToInterfaceOrientation:

∑ (UIInterfaceOrientation)interfaceOrientation {

// Return YES for supported orientations

return (interfaceOrientation ==

∑ UIInterfaceOrientationPortrait);

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

}

- (void)dealloc {

[infoButton release];

[flipsideNavigationBar release];

[mainViewController release];

[flipsideViewController release];

[super dealloc];

}

@end

No método loadFlipsideViewController, temos toda a preparação para carregar a classe FlipsideView, quando o método toggleView for executado. Já o toggleView controla qual visualização (view) deverá ser exibida para o usuário, a MainView ou a FlipsideView. Este método também determina qual será a transição usada na mudança entre a MainView e a FlipsideView. Na verdade a forma de fazer isso está descrita na linha:

[UIView setAnimationTransition:([mainView superview]

∑ ? UIViewAnimationTransitionFlipFromRight:
∑ UIViewAnimationTransitionFlipFromLeft)
∑ forView:self.view cache:YES];

É com o código acima que o método toggleView determina a transição que será usada entre a MainView e a FlipsideView. Em outras oportunidades, mostraremos mais formas de criar transições.

O que é um arquivo XIB (ou NIB)?

Um arquivo XIB é criado usando o Interface Builder (IB). Para iniciarmos um arquivo XIB, vá até a pasta Resources do projeto e dê dois cliques no arquivo MainWindow.xib. Isso fará o IB abrir essa tela. Neste momento, vamos apresentar os controles File’s Owner e o First Responder.

35-xcode-1

File’s Owner é o objeto que possui o controle do próprio arquivo XIB. Nas próximas matérias, voltaremos a conversar sobre ele. Já o First Responder é o objeto com o qual o usuário faz sua interação. O First Responder controla a interação do usuário com a interface da aplicação.

Voltaremos a falar desses controles mais a fundo em outras oportunidades. Agora vamos mexer um pouco no Interface Builder. Na janela MainView.XIB vamos encontrar um controle chamado RootView Controller. Como você percebeu, já vimos este mesmo nome na pasta Application Controllers, e isso não é coincidência. Esse controle é o reflexo da classe que está na Application Controllers. Como sabemos disso?

Dê um clique em RootViewController. Depois, vá até a janela Inspector e escolha o último botão superior, que tem um “i” como ícone. Você verá que a classe selecionada é a própria RootViewController.

35-xcode-2

Um duplo clique em RootViewController irá abrir uma visualização (view) no IB. A partir deste momento, todos os componentes inseridos poderão ser controlados na classe RootViewController, que está na pasta Application Controller. Na próxima edição, colocaremos componentes nesta view e aprenderemos a controlá-los na classe.

Ademar Varela desenvolve aplicações para iPhone e mantém o blog www.mindbike.com.br/blog. Para participar da lista de discussão de desenvolvedores, visite o site http://tinyurl.com/clf6qa.

Tags: ,

Comentada uma vez » Feed RSS dos comentários deste post URL de TrackBack

  1. Luis Lacerda

    8 de agosto de 2009 @ 20:18


    Os tutoriais XCode excelentes. Pena que não venha serrilhada para corte e pronto para colecionar.
    Devo dizer que é um belo trabalho para a comunidade de programadores - quem sabe breve não tenhamos aplicativos brasileiros de qualidade na app store…


Deixe seu comentário