Archive for the ‘iPhone’ Category

Apostila iPhone - Table View - Criando Classe

sábado, setembro 4th, 2010

Para criar uma classe, de um click na pasta do grupo CustomCell e em File / File New.

figura-542
Esta ação irá abrir uma nova janela para você selecionar que tipo de arquivo você deseja incluir no projeto.

figura-56

Vamos selecionar Cocoa Touch Class / Objective-C class.

Ao escolher estas opções, o XCode irá perguntar qual o nome que deseja colocar na sua classe. Vamos colocar CustomCell. Observe que quando colocar o nome da classe, você estará criando o header do arquivo, e se observar melhor, perceberá que existe a opção de criar automaticamente a implementação (“.m”).

Agora vamos implementar de fato estas classes. No arquivo CustomCell.h, digite o seguinte código:

@interface CustomCell : UITableViewCell

{

BOOL checked;

NSString *title;

UIButton *checkButton;

}

@property (nonatomic, retain) NSString *title;

@property (nonatomic, assign) BOOL checked;

- (void)checkAction:(id)sender;

@end

No arquivo CustomCell.m digite o seguinte código:

@implementation CustomCell

@synthesize checked, title;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier

{

if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])

{

self.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;

// cell’s title label

self.textLabel.backgroundColor = self.backgroundColor;

self.textLabel.opaque = NO;

self.textLabel.textColor = [UIColor blackColor];

self.textLabel.highlightedTextColor = [UIColor whiteColor];

self.textLabel.font = [UIFont boldSystemFontOfSize:18.0];

// cell’s check button

checkButton = [[UIButton buttonWithType:UIButtonTypeCustom] retain];

checkButton.frame = CGRectZero;

checkButton.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;

checkButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;

[checkButton addTarget:self action:@selector(checkAction: ) forControlEvents:UIControlEventTouchDown];

checkButton.backgroundColor = self.backgroundColor;

[self.contentView addSubview:checkButton];

}

return self;

}

- (void)layoutSubviews

{

[super layoutSubviews];

CGRect contentRect = [self.contentView bounds];

CGRect frame = CGRectMake(contentRect.origin.x + 40.0, 8.0, contentRect.size.width, 30.0);

self.textLabel.frame = frame;

// layout the check button image

UIImage *checkedImage = [UIImage imageNamed:@"checked.png"];

frame = CGRectMake(contentRect.origin.x + 10.0, 12.0, checkedImage.size.width, checkedImage.size.height);

checkButton.frame = frame;

UIImage *image = (self.checked) ? checkedImage: [UIImage imageNamed:@"unchecked.png"];

UIImage *newImage = [image stretchableImageWithLeftCapWidth:12.0 topCapHeight:0.0];

[checkButton setBackgroundImage:newImage forState:UIControlStateNormal];

}

- (void)dealloc

{

[checkButton release];

[title release];

[super dealloc];

}

// called when the checkmark button is touched

- (void)checkAction:(id)sender

{

// note: we don’t use ’sender’ because this action method can be called separate from the button (i.e. from table selection)

self.checked = !self.checked;

UIImage *checkImage = (self.checked) ? [UIImage imageNamed:@"checked.png"] : [UIImage imageNamed:@"unchecked.png"];

[checkButton setImage:checkImage forState:UIControlStateNormal];

}

Agora, vamos terminar a nossa nova implementação.

Diferentemente do tópico anterior, vamos conhecer mais alguns métodos que podem (e neste caso devem) ser implementados. Porém antes, vamos digitar o seguinte código no arquivo CellsViewController.h:

@interface CellsViewController : UIViewController

<UITableViewDataSource, UITableViewDelegate>

{

NSMutableArray *computers;

}

@property (nonatomic, retain) NSMutableArray *computers;

@end

Vamos ver um novo componente, o NSMutableArray. Este componente tem o mesmo comportamento do NSArray, porém este componente permite mutação, ou seja, conseguimos colocar praticamente qualquer tipo de informação neste array.

No arquivo CellsViewController.m insira o seguinte código:

#import “CellsViewController.h”

#import “CustomCell.h”

#import “CellsAppDelegate.h”

@implementation CellsViewController

@synthesize computers;

- (void)viewDidLoad {

NSString *path = [[NSBundle mainBundle] pathForResource:@”Data” ofType:@”plist”];

self.computers = [NSMutableArray arrayWithContentsOfFile:path];

}

- (void)didReceiveMemoryWarning {

// Releases the view if it doesn’t have a superview.

[super didReceiveMemoryWarning];

// Release any cached data, images, etc that aren’t in use.

}

- (void)viewDidUnload {

// Release any retained subviews of the main view.

// e.g. self.myOutlet = nil;

self.computers = nil;

}

- (void)dealloc {

[computers release];

[super dealloc];

}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

{

return 1;

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

return [self.computers count];

}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

{

// find the cell being touched and update its checked/unchecked image

CustomCell *targetCustomCell = (CustomCell *)[tableView cellForRowAtIndexPath:indexPath];

[targetCustomCell checkAction:nil];

// don’t keep the table selection

[tableView deselectRowAtIndexPath:indexPath animated:YES];

// update our data source array with the new checked state

NSMutableDictionary *selectedItem = [self.computers objectAtIndex:indexPath.row];

[selectedItem setObject:[NSNumber numberWithBool:targetCustomCell.checked] forKey:@”checked”];

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

static NSString *kCustomCellID = @”MyCellID”;

CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:kCustomCellID];

if (cell == nil)

{

cell = (CustomCell *)[[[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCustomCellID] autorelease];

}

NSDictionary *item = [computers objectAtIndex:indexPath.row];

NSString* title = [item objectForKey:@"text"];

cell.title = title;

cell.textLabel.text = title;

cell.checked = [[item objectForKey:@"checked"] boolValue];

return cell;

}

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath

{

// called when the accessory view (disclosure button) is touched

CustomCell *cell = (CustomCell *)[tableView cellForRowAtIndexPath:indexPath];

CellsAppDelegate *appDelegate = [UIApplication sharedApplication].delegate;

NSDictionary *infoDict = [NSDictionary dictionaryWithObjectsAndKeys:

cell.title, @"text",

[NSNumber numberWithBool:cell.checked], @”checked”,

nil];

[appDelegate showDetail:infoDict];

}

@end

Observe o método viewDidLoad. Neste momento estamos populando nosso dicionário com o arquivo XML que criamos anteriormente. Alguns métodos vamos estudar no próximo tópico, quando vamos dar ações nas nossas células. Por enquanto compile e execute este código.

Exercício

  1. Modifique o projeto iReceita. Coloque a entrada de dados por meio de XML e modifique a configuração da célula e insira um botão que será para determinar a ação da mesma.

(@AdemarVarela)

Apostila iPhone - Table View - PList

sexta-feira, setembro 3rd, 2010

Acessando uma base de dados XML

No nosso tópico anterior mostramos o uso do componente Table Views usando dados do tipo hardcode (quando os dados são inseridos diretamente no código). Agora vamos mostrar como acessar dados de um arquivo no formato XML. Inicialmente vamos incluir um arquivo XML no projeto.

Selecione File / New File, e escolha a opção Other e Property List.

figura-53

Vamos chamar este arquivo de Data.plist. Estes passos irão criar um arquivo XML na pasta que você tiver selecionado antes de executar File / New File / Other / Property List. No caso vamos criar este arquivo na pasta Resource.

Você deve estar lembrado que no projeto Cells, inserimos as informações diretamente no código, e fazemos isto no instante que a aplicação é inicializada, ou seja, implementamos no método viewDidLoad. Ainda continuamos com a necessidade de popular nossos dados no momento da inicialização da aplicação, mas agora vamos popular através do novo arquivo Data.plist.

Antes porém precisamos preparar nosso arquivo XML. Edite o arquivo Data.plist e digite o seguinte código:

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

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

<plist version=“1.0″>

<array>

<dict>

<key>text</key>

<string>Mac Pro</string>

<key>checked</key>

<true/>

</dict>

<dict>

<key>text</key>

<string>Mac Mini</string>

<key>checked</key>

<false/>

</dict>

<dict>

<key>text</key>

<string>iMac</string>

<key>checked</key>

<false/>

</dict>

<dict>

<key>text</key>

<string>MacBook</string>

<key>checked</key>

<false/>

</dict>

<dict>

<key>text</key>

<string>MacBook Pro</string>

<key>checked</key>

<true/>

</dict>

<dict>

<key>text</key>

<string>MacBook Air</string>

<key>checked</key>

<false/>

</dict>

</array>

</plist>

Reparem que o esquema é praticamente o mesmo que implementamos anteriormente, temos tags para dict, key, string e array.

Mas não veremos somente estas modificações. Vamos criar uma classe para tratar a célula que pretendemos apresentar. Vamos no nome do projeto e vamos criar um novo grupo no projeto. Usamos os grupos para separar as classes que criamos no projeto.

figura-541

Selecione o projeto e em Project / New Group, vamos batizar este grupo de CustomCell. A partir de agora vamos implementar a classe CustomCell. Esta classe terá a configuração da célula que será apresentada ao usuário. Bom, agora vamos incluir a classe propriamente dita dentro do grupo CustomCell.

(@AdemarVarela)

Apostila iPhone - Table View / Custom Cell

quarta-feira, setembro 1st, 2010

Implementando Cells

Vamos agora implementar o código.

No arquivo MainViewController.h, vamos inserir o seguinte código:

#define kNameValueTag 1

#define kColorValueTag 2

@interface MainViewController : UIViewController <FlipsideViewControllerDelegate, UITableViewDataSource, UITableViewDelegate> {

NSArray *computers;

}

@property (nonatomic, retain) NSArray *computers;

@end

O que observamos neste código acima? Reparem na linha em que declaramos a interface, nela informamos quais são as delegações da classe. Para trabalharmos com Cells, nós precisamos haja uma delegação das classes UITableViewDataSource e UITableViewDelegate.

Agora vamos para o MainViewController.m.

Naturalmente que precisamos inicializar a variável computers:

@implementation MainViewController

@synthesize computers;

Agora vamos entender que o nosso objetivo. A nossa proposta é apresentar uma lista com o nome de alguns computadores.

Por isso, vamos criar um array no momento que a nossa aplicação é inicializada.

- (void)viewDidLoad {

NSDictionary *row1 = [[NSDictionary alloc] initWithObjectsAndKeys:

@”MacBook”, @”Name”, @”White”, @”Color”, nil];

NSDictionary *row2 = [[NSDictionary alloc] initWithObjectsAndKeys:

@”MacBook Pro”, @”Name”, @”Silver”, @”Color”, nil];

NSDictionary *row3 = [[NSDictionary alloc] initWithObjectsAndKeys:

@”iMac”, @”Name”, @”White”, @”Color”, nil];

NSDictionary *row4 = [[NSDictionary alloc] initWithObjectsAndKeys:

@”Mac Mini”, @”Name”, @”White”, @”Color”, nil];

NSDictionary *row5 = [[NSDictionary alloc] initWithObjectsAndKeys:

@”Mac Pro”, @”Name”, @”Silver”, @”Color”, nil];

NSArray *array = [[NSArray alloc] initWithObjects:row1, row2, row3, row4, row5, nil];

self.computers = array;

[row1 release];

[row2 release];

[row3 release];

[row4 release];

[row5 release];

[array release];

[super viewDidLoad];

}

Reparem que estamos usando uma nova instrução, a NSDictionary.

Esta instrução serve para criar estruturas de dados, no nosso caso estamos montando cada linha da nossa lista.

Como no IB nós delegamos o componente UITableView para File’s Owner, nós vamos precisar implementar dois métodos na nossa classe de controle, conforme segue:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

return [self.computers count];

}

Precisamos deste método para determinar qual a quantidade de linhas que a nossa tabela possui. Repare que estamos retornando a quantidade de elementos do array computers que foi carregada no momento do viewDidLoad.

Agora vamos terminar a implementação do Cells, escrevendo o seguinte método:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellTableIdentifier = @”CellTableIdentifier “;

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellTableIdentifier];

if (cell == nil) {

#ifdef __IPHONE_3_0__

cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier: CellTableIdentifier] autorelease];

#else

cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellTableIdentifier] autorelease];

#endif

CGRect nameLabelRect = CGRectMake(0, 5, 70, 15);

UILabel *nameLabel = [[UILabel alloc] initWithFrame:nameLabelRect];

nameLabel.textAlignment = UITextAlignmentRight;

nameLabel.text = @”Name:”;

nameLabel.font = [UIFont boldSystemFontOfSize:12];

[cell.contentView addSubview: nameLabel];

[nameLabel release];

CGRect colorLabelRect = CGRectMake(0,26, 70, 15);

UILabel *colorLabel = [[UILabel alloc] initWithFrame:colorLabelRect];

colorLabel.textAlignment = UITextAlignmentRight;

colorLabel.text = @”Color:”;

colorLabel.font = [UIFont boldSystemFontOfSize:12];

[cell.contentView addSubview: colorLabel];

[colorLabel release];

CGRect nameValueRect = CGRectMake(80, 5, 200, 15);

UILabel *nameValue = [[UILabel alloc] initWithFrame:nameValueRect];

nameValue.tag = kNameValueTag;

[cell.contentView addSubview:nameValue];

[nameValue release];

CGRect colorValueRect = CGRectMake(80, 25, 200, 15);

UILabel *colorValue = [[UILabel alloc] initWithFrame:colorValueRect];

colorValue.tag = kColorValueTag;

[cell.contentView addSubview:colorValue];

[colorValue release];

}

NSUInteger row = [indexPath row];

NSDictionary *rowData = [self.computers objectAtIndex:row];

UILabel *name = (UILabel *)[cell.contentView viewWithTag:kNameValueTag];

name.text = [rowData objectForKey:@"Name"];

UILabel *color = (UILabel *)[cell.contentView viewWithTag:kColorValueTag];

color.text = [rowData objectForKey:@"Color"];

return cell;

}

Reparem mais duas novas instruções para nós:

#ifdef, #else e #endif

Estas instruções são executadas no momento da compilação, no nosso caso, no momento da compilação do código o compilador verifica se a variavél macro __IPHONE_3_0__ está válida.

Além desta intrução vimos a instrução CGRet. Esta instrução monta uma retângulo em torno de algumas informações, no nosso caso, cada informação do nosso array receberá um retângulo em torno.

Exercício

  1. Crie um projeto chamado iReceitas. Na tela Main View coloque um botão (que deverá habilitado com um componente Switch) que inicialize uma segunda view que tenha as seguintes linhas: “Bobó de Camarão”, “Canjiquinha”, “Feijoada”, “Polenta”, “Picanha” e “Frango Assado”.

(@AdemarVarela)

Apostila iPhone - Table View - XML

domingo, agosto 29th, 2010

Acessando uma base de dados XML

No nosso tópico anterior mostramos o uso do componente Table Views usando dados do tipo hardcode (quando os dados são inseridos diretamente no código). Agora vamos mostrar como acessar dados de um arquivo no formato XML. Inicialmente vamos incluir um arquivo XML no projeto.

Selecione File / New File, e escolha a opção Other e Property List.

figura-53

Vamos chamar este arquivo de Data.plist. Estes passos irão criar um arquivo XML na pasta que você tiver selecionado antes de executar File / New File / Other / Property List. No caso vamos criar este arquivo na pasta Resource.

Você deve estar lembrado que no projeto Cells, inserimos as informações diretamente no código, e fazemos isto no instante que a aplicação é inicializada, ou seja, implementamos no método viewDidLoad. Ainda continuamos com a necessidade de popular nossos dados no momento da inicialização da aplicação, mas agora vamos popular através do novo arquivo Data.plist.

Antes porém precisamos preparar nosso arquivo XML. Edite o arquivo Data.plist e digite o seguinte código:

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

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

<plist version=“1.0″>

<array>

<dict>

<key>text</key>

<string>Mac Pro</string>

<key>checked</key>

<true/>

</dict>

<dict>

<key>text</key>

<string>Mac Mini</string>

<key>checked</key>

<false/>

</dict>

<dict>

<key>text</key>

<string>iMac</string>

<key>checked</key>

<false/>

</dict>

<dict>

<key>text</key>

<string>MacBook</string>

<key>checked</key>

<false/>

</dict>

<dict>

<key>text</key>

<string>MacBook Pro</string>

<key>checked</key>

<true/>

</dict>

<dict>

<key>text</key>

<string>MacBook Air</string>

<key>checked</key>

<false/>

</dict>

</array>

</plist>

Reparem que o esquema é praticamente o mesmo que implementamos anteriormente, temos tags para dict, key, string e array.

Mas não veremos somente estas modificações. Vamos criar uma classe para tratar a célula que pretendemos apresentar. Vamos no nome do projeto e vamos criar um novo grupo no projeto. Usamos os grupos para separar as classes que criamos no projeto.

figura-54

Selecione o projeto e em Project / New Group, vamos batizar este grupo de CustomCell. A partir de agora vamos implementar a classe CustomCell. Esta classe terá a configuração da célula que será apresentada ao usuário. Bom, agora vamos incluir a classe propriamente dita dentro do grupo CustomCell.

(@AdemarVarela)

Twitter

sábado, agosto 28th, 2010

Pessoal,

Para facilitar e para acompanhar os avanços da tecnologia da comunicação, (rs), estou disponibilizando o meu twitter para vocês fazerem perguntas referentes a programação iPhone. Segue: @AdemarVarela

Abs

Apostila iPhone - Table View

sábado, agosto 28th, 2010

Em algumas situações é necessário disponibilizar as informações para o usuário em forma de uma lista, e ainda quer permitir ao usuário efetuar alguma ação com esta informação. Para conseguir isso, é necessário montar uma tabela. O componente usado para isso é o Table View.

Inserindo uma Table View no IB

Vamos abrir um novo projeto, vamos chama-lo de Cells. Guarde este projeto pois iremos usa-lo mais para frente. Dê um duplo click no arquivo MainView.xib

figura-52
Arraste o componente UITableView para a janela Main View.

Neste exemplo iremos aprender que alguns componentes não precisam ser declarados no XCode. Faremos apenas informar a delagação e o datasource da TableView. Com o botão control pressionado, de um click no componente, ao aparecer uma janela pop-up arraste a delegação e o datasource para File’s Owner.

Feche o IB e vamos voltar para o XCode.

Implementando Cells

Vamos agora implementar o código.

No arquivo MainViewController.h, vamos inserir o seguinte código:

#define kNameValueTag 1

#define kColorValueTag 2

@interface MainViewController : UIViewController <FlipsideViewControllerDelegate, UITableViewDataSource, UITableViewDelegate> {

NSArray *computers;

}

@property (nonatomic, retain) NSArray *computers;

@end

O que observamos neste código acima? Reparem na linha em que declaramos a interface, nela informamos quais são as delegações da classe. Para trabalharmos com Cells, nós precisamos haja uma delegação das classes UITableViewDataSource e UITableViewDelegate.

Agora vamos para o MainViewController.m.

Naturalmente que precisamos inicializar a variável computers:

@implementation MainViewController

@synthesize computers;

Agora vamos entender que o nosso objetivo. A nossa proposta é apresentar uma lista com o nome de alguns computadores.

Por isso, vamos criar um array no momento que a nossa aplicação é inicializada.

- (void)viewDidLoad {

NSDictionary *row1 = [[NSDictionary alloc] initWithObjectsAndKeys:

@”MacBook”, @”Name”, @”White”, @”Color”, nil];

NSDictionary *row2 = [[NSDictionary alloc] initWithObjectsAndKeys:

@”MacBook Pro”, @”Name”, @”Silver”, @”Color”, nil];

NSDictionary *row3 = [[NSDictionary alloc] initWithObjectsAndKeys:

@”iMac”, @”Name”, @”White”, @”Color”, nil];

NSDictionary *row4 = [[NSDictionary alloc] initWithObjectsAndKeys:

@”Mac Mini”, @”Name”, @”White”, @”Color”, nil];

NSDictionary *row5 = [[NSDictionary alloc] initWithObjectsAndKeys:

@”Mac Pro”, @”Name”, @”Silver”, @”Color”, nil];

NSArray *array = [[NSArray alloc] initWithObjects:row1, row2, row3, row4, row5, nil];

self.computers = array;

[row1 release];

[row2 release];

[row3 release];

[row4 release];

[row5 release];

[array release];

[super viewDidLoad];

}

Reparem que estamos usando uma nova instrução, a NSDictionary.

Esta instrução serve para criar estruturas de dados, no nosso caso estamos montando cada linha da nossa lista.

Como no IB nós delegamos o componente UITableView para File’s Owner, nós vamos precisar implementar dois métodos na nossa classe de controle, conforme segue:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

return [self.computers count];

}

Precisamos deste método para determinar qual a quantidade de linhas que a nossa tabela possui. Repare que estamos retornando a quantidade de elementos do array computers que foi carregada no momento do viewDidLoad.

Agora vamos terminar a implementação do Cells, escrevendo o seguinte método:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellTableIdentifier = @”CellTableIdentifier “;

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellTableIdentifier];

if (cell == nil) {

#ifdef __IPHONE_3_0__

cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier: CellTableIdentifier] autorelease];

#else

cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellTableIdentifier] autorelease];

#endif

CGRect nameLabelRect = CGRectMake(0, 5, 70, 15);

UILabel *nameLabel = [[UILabel alloc] initWithFrame:nameLabelRect];

nameLabel.textAlignment = UITextAlignmentRight;

nameLabel.text = @”Name:”;

nameLabel.font = [UIFont boldSystemFontOfSize:12];

[cell.contentView addSubview: nameLabel];

[nameLabel release];

CGRect colorLabelRect = CGRectMake(0,26, 70, 15);

UILabel *colorLabel = [[UILabel alloc] initWithFrame:colorLabelRect];

colorLabel.textAlignment = UITextAlignmentRight;

colorLabel.text = @”Color:”;

colorLabel.font = [UIFont boldSystemFontOfSize:12];

[cell.contentView addSubview: colorLabel];

[colorLabel release];

CGRect nameValueRect = CGRectMake(80, 5, 200, 15);

UILabel *nameValue = [[UILabel alloc] initWithFrame:nameValueRect];

nameValue.tag = kNameValueTag;

[cell.contentView addSubview:nameValue];

[nameValue release];

CGRect colorValueRect = CGRectMake(80, 25, 200, 15);

UILabel *colorValue = [[UILabel alloc] initWithFrame:colorValueRect];

colorValue.tag = kColorValueTag;

[cell.contentView addSubview:colorValue];

[colorValue release];

}

NSUInteger row = [indexPath row];

NSDictionary *rowData = [self.computers objectAtIndex:row];

UILabel *name = (UILabel *)[cell.contentView viewWithTag:kNameValueTag];

name.text = [rowData objectForKey:@"Name"];

UILabel *color = (UILabel *)[cell.contentView viewWithTag:kColorValueTag];

color.text = [rowData objectForKey:@"Color"];

return cell;

}

Reparem mais duas novas instruções para nós:

#ifdef, #else e #endif

Estas instruções são executadas no momento da compilação, no nosso caso, no momento da compilação do código o compilador verifica se a variavél macro __IPHONE_3_0__ está válida.

Além desta intrução vimos a instrução CGRet. Esta instrução monta uma retângulo em torno de algumas informações, no nosso caso, cada informação do nosso array receberá um retângulo em torno.

Exercício

  1. Crie um projeto chamado iReceitas. Na tela Main View coloque um botão (que deverá habilitado com um componente Switch) que inicialize uma segunda view que tenha as seguintes linhas: “Bobó de Camarão”, “Canjiquinha”, “Feijoada”, “Polenta”, “Picanha” e “Frango Assado”.

(by Ademar Varela)

(@AdemarVarela)

Apostila iPhone - Switch

quinta-feira, julho 29th, 2010

Outro componente que só existe no iPhone é o UISwitch.

Este componente é utilizado para determinarmos se uma determinada situação está ativa ou não (ON/OFF).

Declarando Switch no IB

Abra o projeto iPhoneHello e abra o IB pelo MainView.xib

Na janela Library selecione UISwitch em Inputs & Values e arraste até a Main View.

figura-51

Agora que já deixamos o componente do jeito desejado, vamos fechar o IB e retornar para o XCode.

Inserindo Switch no XCode

Como já foi mencionado, não vamos nos estender mais sobre as declarações do componente no XCode, você já sabe que precisa declarar o componente, definir suas propriedades e inicializa-lo, certo?

Inserindo a ação do Switch

A idéia da nossa ação é similar ao tópico anterior, quando este componete estiver ON o componente Picker View estará visível, quando OFF ficará invisível.

Vamos até o MainViewController.h e vamos declarar a ação:

- (IBAction)toggleSwitch:(id)sender;

e agora vamos até MainViewController.m e implementamos a ação:

- (IBAction)toggleSwitch:(id)sender{

UISwitch *whichSwitch = (UISwitch *)sender;

BOOL setting = whichSwitch.isOn;

[viewComponentSwitch setOn:setting animated:YES];

if (setting == YES) {

[dataPicker setHidden:NO];

} else {

[dataPicker setHidden:YES];

}

}

Agora compile o código, confira todos os relacionamentos e execute.

(by Ademar Varela)

Apostila iPhone - Codificando Segmented Control

domingo, junho 13th, 2010

Criando uma ação para o Segmented Control

Para começar vamos definir uma variável que irá determinar o primeiro índice deste componente, no arquivo MainViewController.h:

#define KShowSegmentIndex 0

Vamos utilizar esta definição para definir a ação que será tomada no momento que desejarmos exibir ou inibir o componente Picker View.

Toda vez que tivermos trabalhando com um componente de multipla escolha, é comum criarmos uma ação com o nome de toggle, no caso vamos criar uma com o nome de toggleShowHide. Em MainViewController.h:

- (IBAction)toggleShowHide:(id)Sender;

Agora vamos em MainViewController.m:

- (IBAction)toggleShowHide:(id)Sender {

NSInteger segment = segControl.selectedSegmentIndex;

if (segment == KShowSegmentIndex) {

[dataPicker setHidden:NO];

} else {

[dataPicker setHidden:YES];

}

}

Para entendermos melhor, segControl é a declaração do UISegmentControl que eu declarei no MainViewController.h e dataPicker é a declaração do Picker View.

Certifique-se que todos os componentes estão declarado e relacionados com o IB.

Execute o código.

Exercício

  1. No projeto iPicker, crie uma nova view e insira um componente Picker View com somente uma coluna com os seguintes elementos: Campinas, Santos, Ribeirão Preto, São Vicente, Guarujá e Indaiatuba. Na view principal insira um SegmentedControl. A primeira opção apresentará o Picker View dos Estados e a segunda a de Cidades.

(by Ademar Varela)

Apostila iPhone - Segmented Control

sábado, junho 5th, 2010

Este componente é outro que só existe no iPhone SDK. Ele tem um equivalente, mas não igual, no ambiente Desk que é o componene Tab. O funcionamento deste componente é similar ao Tab, ele executa alguma ação na medida que você seleciona um botão, ou seja, as ações estão segmentadas e dependem da execução dos botões para serem executados.

Inserindo um Segmented Control no IB

Abra o projeto iPhoneHello, e abra o MainView.xib.

Na janela Libray selecione Input & Values e arraste o componente UISegmentedControl para a Main View.

figura-49

Após inserir o componente vamos configura-lo.

Em atributos da janela Inspector, selecione Style com a opção Bar.

No atributo Segment 0, atribua “Apresenta” para o item Title e em Segment 1, atribua “Esconde” para o item Title.

figura-50

Agora que já deixamos o componente do jeito desejado, vamos fechar o IB e retornar para o XCode.

Inserindo Segmented Control no XCode

Não vou me estender sobre como declarar componentes no XCode, já sabemos como fazer isso, declarar componente, definir propriedades e inicializa-lo. Este é só um lembrete.

Para entender o funcionamento deste componente vamos determinar uma ação para o momento em que o usuário pressionar o botão “Apresentar” e o “Esconder”. Na verdade, vamos definir que quando o usuário escolher “Apresentar” vamos exibir o Picker View que fizemos anteriormente, e quando o usuário pressionar “Esconder” vamos inibir o componente Picker View.

(by Ademar Varela)

Apostila iPhone - Manipulando um Picker View

sábado, junho 5th, 2010

Podemos manipular a seleção feita pelo usuário, para isso vamos modificar o método showHello.

NSInteger row = [dataPicker selectedRowInComponent:0];

NSString *selected = [dataElementos objectAtIndex:row];

lblHello.text = selected;

Exercício

  1. Crie um projeto chamado iPicker. Crie um Picker View com todos os estados do Brasil, crie um botão que quando pressionado exiba o conteúdo selecionado no Picker View.

(by Ademar Varela)