Archive for junho, 2009

Usando componentes no IB - Final

sábado, junho 27th, 2009

Para definirmos os componentes criados no IB iremos instanciar estes componentes usando IBOutlet. Para não necessitar entrar em grandes divagações sobre este parametro vamos entender que o prefixo IB vem de Interface Builder e Outlet que é um componente de saída, no caso visual. Em outra oportunidade vamos nos aprofundar neste tema. Você deve estar pensando, que como criamos 3 componentes no IB vamos precisar declarar 3 componentes no .h, porém nós também vamos querer manipular as views do IB, ou seja, a janela Window e a janela RootViewController, desta forma vamos precisar de 5 declarações, uma declaração para o componente UITextField, uma declaração para o componente UIButton, uma declaração para o componente UILabel, uma declaração para a janela Window e uma declaração para a janela RootViewController. No caso das janelas, vamos precisar declarar variáveis UIView. Outro ponto importante, a nossa intenção basicamente é colocar um nome no componente UITextView, e depois de pressionar o componente UIButton colocar uma mensagem no componente UILabel. Isto quer dizer que iremos incluir uma ação na nossa aplicação, pois só iremos colocar a mensagem no componente UILabel depois da ação de pressionar o componente UIButton. Quero dizer que vamos precisar também utilizar outro tipo de parâmetro o IBAction. Temos aqui o mesmo princípio do IBOutlet, ou seja, IB de Interface Builder e Action que quer dizer que iremos fazer uma ação a partir de um elemento criado no IB. Atualize o arquivo .h conforme segue:

#import <UIKit/UIKit.h>

@class MainViewController;

@class FlipsideViewController;

@interface RootViewController : UIViewController {

UIButton *infoButton;

MainViewController *mainViewController;

FlipsideViewController *flipsideViewController;

UINavigationBar *flipsideNavigationBar;

IBOutlet UIView *viewMain;

IBOutlet UIView *viewRoot;

IBOutlet UITextField *textField;

IBOutlet UIButton *button;

IBOutlet UILabel *labelSTR;

}

@property (nonatomic, retain) IBOutlet UIButton *infoButton;

@property (nonatomic, retain) MainViewController *mainViewController;

@property (nonatomic, retain) UINavigationBar *flipsideNavigationBar;

@property (nonatomic, retain) FlipsideViewController *flipsideViewController;

@property (nonatomic, retain) UIView *viewMain;

@property (nonatomic, retain) UIView *viewRoot;

@property (nonatomic, retain) UITextField *textField;

@property (nonatomic, retain) UIButton *button;

@property (nonatomic, retain) UILabel *labelSTR;

- (IBAction)toggleView;

- (IBAction)showMessage:(id)sender;

@end

Observe as linha que contém o IBOutlet e o IBAction. Repare que no caso do IBOutlet precisamos definir também as propriedades do componente que acabamos de criar, já para o IBAction não é necessário. Bom já modificamos o arquivo .h, agora precisamos implementar o arquivo .m. Você irá observar que antes de usar os componentes criados pela declaração IBOutlet vamos precisar sintezila-los. Neste momento vamos assumir isto como uma necessidade básica. Atualize o arquivo RootViewController.m conforme segue:

#import “RootViewController.h”

#import “MainViewController.h”

#import “FlipsideViewController.h”

@implementation RootViewController

@synthesize infoButton;

@synthesize flipsideNavigationBar;

@synthesize mainViewController;

@synthesize flipsideViewController;

@synthesize viewMain;

@synthesize viewRoot;

@synthesize textField;

@synthesize labelSTR;

@synthesize button;

- (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];

// Set up the navigation bar

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:@”materia04″];

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];

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

}

- (IBAction)showMessage:(id)sender {

labelSTR.text = textField.text;

}

- (void)dealloc {

[infoButton release];

[flipsideNavigationBar release];

[mainViewController release];

[flipsideViewController release];

[textField release];

[button release];

[labelSTR release];

[viewMain release];

[viewRoot release];

[super dealloc];

}

@end

Estamos quase terminando por hoje, mas vamos fazer uma última observação. Primeiro nós criamos o layout (ou design) da aplicação no IB, depois criamos estas variáveis no XCode, porém falta um último passo, que é o mais simples, mas fundamental para que possamos ver o resultado de tudo que fizemos até agora. Falta dizer quem é quem, ou seja, falta relacionar as declarações do XCode com os componentes criados no IB. Para fazer esta relação vamos voltar para o IB. Antes porém compile o projeto no XCode, só para garantir que não existe erros de digitação. Com o IB já aberto, de um click em RootViewController com o botão control pressionado. Você verá que todos as declarações que você criou no XCode vão aparecer para você. Para relacionar o botão, você vai clicar no circulo que está a direita da variável button e arrastar até o componente UIButton que você criou na janela RootViewController (se for necessário, abra esta janela antes). Faça isso para todas as variáveis criadas (UITextField e UILabel).

figura09

Agora só falta relacionar a ação do botão criado. De um click no componente UIButton da janela RootViewController pressionando o botão control, e você terá as opções de ações. Na opção Touch Down,tem um círculo do lado direito, click no círculo e arraste até o componente RootViewController da janela MainWindow.xib. Quando você soltar o click vai aparecer as opções que você pode relacionar com a ação, dentre elas deve estar a opção showMessage (aquela que criamos com IBAction, lembra?). Escolha esta ação dando um click.

figura10

Agora é só sair do IB, salvando as suas alterações e executar a aplicação. Se você ocultou a barra de status ela não deve aparecer, e vai aparecer um campo para você colocar um texto qualquer, um botão que quanto pressionado vai colocar o texto selecionado no label. É bem simples, e ainda possui uma série de melhorias para serem feitas. Você vai observar que quando retorna da tela do botão info, você vai perder os componentes que criamos, vai perceber também que o teclado não está fechando e nem está limpando o conteúdo após pressionar o botão de ação. Estas e outras melhorias (manipular as UIViews por exemplo) vamos estudar na próxima publicação.

(Matéria publicada na revista MAC+)

(by Ademar Varela)

Usando componentes no IB - Parte III

segunda-feira, junho 22nd, 2009

Bom, isto é só o começo. Vamos fazer algo mais interessante. Vamos incluir alguns componentes na view e vamos manipular estes componentes. Abra a janela RootViewController e arraste o componente UITextField. Para fazer isso, vá na ferramenta Library e selecione Inputs & Values. Nesta pasta você encontrará o componente UITextField. Arraste este componente para a janela RootViewController.

figura04


Agora vamos colocar o componente UIButton. Este componente está localizado ao lado esquerdo do componente UITextField. Arraste este componente para a janela RootViewController.

figura05


E finalmente vamos adicionar o componente UILabel que está localizado a esquerda do componente UIButton, e novamente é só arrastar este componente até a janela.

figura06


Já temos todos os componentes que iremos precisar para a nossa aplicação, vamos fechar o IB por um instante e voltar ao XCode. Antes de sair salve suas alterações no IB.

No XCode vamos editar o arquivo RootViewController.h na pasta Application Controllers. Observe que todos os componentes que adicionamos foram na janela RootViewController, portanto nada mais lógico manipular estes componentes nos arquivos RootViewController da pasta Application Controllers.

(Matéria publicada na revista MAC+)

(by Ademar Varela)

Usando componentes no IB - Parte II

sexta-feira, junho 12th, 2009

Repare que irá abrir uma janela chamada Window, e nesta tela existe uma barra no topo. Chamamos esta barra de barra de status, e temos o desenho de uma bateria no lado direito. Se você deseja retirar esta barra da sua aplicação, não se engane, o fato de remover esta barra do design, não remove a barra no momento da execução. Esta barra só existe para facilitar o design da sua aplicação, se realmente deseja remover esta barra, será necessário modificar o arquivo info.plist da pasta Resource. Edite este arquivo e inclua o seguinte código:

 

<key>UIStatusBarHidden</key>

<true/>

 

Para fazer esta inclusão, você terá que dar um click em info.plist pressionando a tecla control, desta forma você terá acesso a opcão Open As / Source Code File. Basta incluir estas linhas no final deste arquivo conforme segue: 

<?xml version=“1.0″ encoding=“UTF-8″?>

<!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” http://www.apple.com/DTDs/PropertyList-1.0.dtd>

<plist version=“1.0″>

<dict>

<key>CFBundleDevelopmentRegion</key>

<string>English</string>

<key>CFBundleDisplayName</key>

<string>${PRODUCT_NAME}</string>

<key>CFBundleExecutable</key>

<string>${EXECUTABLE_NAME}</string>

<key>CFBundleIconFile</key>

<string></string>

<key>CFBundleIdentifier</key>

<string>com.yourcompany.${PRODUCT_NAME:rfc1034identifier}</string>

<key>CFBundleInfoDictionaryVersion</key>

<string>6.0</string>

<key>CFBundleName</key>

<string>${PRODUCT_NAME}</string>

<key>CFBundlePackageType</key>

<string>APPL</string>

<key>CFBundleSignature</key>

<string>????</string>

<key>CFBundleVersion</key>

<string>1.0</string>

<key>LSRequiresIPhoneOS</key>

<true/>

<key>NSMainNibFile</key>

<string>MainWindow</string>

<key>UIStatusBarHidden</key>

<true/>

</dict>

</plist>

Depois da inclusão basta salvar o arquivo. Se desejar voltar ao formato antigo, basta dar um click em info.plist pressionando a tecla control e escolher a opção Open As / XML Property List. Assim que você executar a sua aplicação verá que a barra de status não irá aparecer.

Bom, vamos voltar ao IB, fizemos este comentário para explicar como retira a barra de status da aplicação, conforme já dissemos a barra que você está vendo na janela Window é simplesmente para ajudar no design da sua tela. Se você retirou a barra de status pelo info.plist não faz sentido manter no seu design, vamos tirar também da janela Window. De um click em janela e observe a ferramenta Inspector. Nela você vai encontrar a opção Status Bar que deverá estar com a opção Gray. Selecione a opção None.

Se desejar faça o mesmo procedimento na RootViewController e retire a Status Bar da janela.

(Matéria publicada na revista MAC+)
(by Ademar Varela)

Usando componentes no IB - Parte 1

domingo, junho 7th, 2009

 

Como vimos na última matéria, hoje vamos colocar componentes em uma view do Interface Builder (IB) e controlar na classe. Vamos relembrar um pouco, vá no XCode e abra um projeto novo do tipo Utility. Bem fácil, só para relembrar, caso tenha o antigo projeto, e já consolidou todo o processo de abertura de um projeto, abra o projeto que possue. Vá até o arquivo MainWindow.xib na pasta Resource e dê um duplo click.

figura01

Você vai perceber que abrimos uma ferramenta nova, o Interface Builder (IB), com ele podemos criar toda a parte visual da sua aplicação. Inicialmente vamos observar algumas ferramentas interessantes do IB. Consideramos como as duas principais ferramentas a Library e o Inspector. Na Library possuimos uma biblioteca com todos os componentes possíveis de serem incorporados na nossa aplicação, e na Inspector temos como configurar o comportamento destes componentes na aplicação. Observe que existe também uma janela chamada MainWindow.xib, que exibe todas as extruturas contidas no arquivo.

Vamos dar um duplo click no arquivo Window e nós teremos a imagem abaixo:

figura02

 

(Matéria publicada na revista MAC+)

(by Ademar Varela)