Archive for the ‘Mindbike’ 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 - 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 - Tratando Teclado

domingo, maio 2nd, 2010

Você já deve ter percebido que quando usamos o componente UITextField, o teclado virtual aparece e não conseguimos recolher, mesmo pressionando o botão “return”. Isto acontece porque precisamos tratar o comportamento do teclado

Para isto vamos implementar o seguinte método:

    • (BOOL)textFieldShouldReturn:(UITextField *)theTextField {

if (theTextField == variável) {

[variável resignFirstResponder];

}

return YES;

}

Este método irá tratar todos os eventos de teclado, no parâmetro theTextField é recebido o nome do componente que está evocando o tratamento. Perceba que você pode tratar o conteúdo de uma variável no momento que recebe o retorno do teclado, como por exemplo verificar se está o campo está vazio ou não.

Text Input Traits

Existem algumas modificações que podem ser feitas no comportamento do componente UITextField, tais como:

      • Capitalize - Aqui você pode dizer quais os formatos do texto que será digitado, por exemplo, se vai deixar só a primeira letra maiúscula, ou a palavra, ou a sentença, ou mesmo sem nenhuma maiúscula.
      • Correction - Permitie usar o dicionário padrão e ajudar na correção de palavras.
      • Keyboard - Aqui você configura o tipo de teclado que vai utilizar
      • Appearance - Forma de exibição do teclado
      • Return Key - Define qual será a tecla de retorno do teclado.

Exercício

  1. Modifique o projeto iPhoneHello. Insira o componente UITextField. Quando o usuário inserir o texto, a aplicação deverá verificar se o usuário digitou algo. Se não tiver nada no camo de texto, a aplicação manterá o teclado virtual aberto, caso contrário deverá exibir o que o usuário digitou no componente label. Modifique todos os tratamentos do teclado e teste um por um.
  2. Crie uma aplicação chamada iAchou. Esta aplicação deverá gerar um número aleatório  entre 1 e 100 e o usuário deverá advinhar que número é este. Será necessário pesquisar qual a função que gera números aleatórios, no caso é a random().

(by Ademar Varela)

Apostila iPhone - @synthesize

domingo, março 14th, 2010

Para reforçar o que acabamos de ver, faça os mesmos procedimentos do @property para chegar na documentação do @synthesize.

figura-30

De uma maneira mais simplista, usamos o @synthesize como forma de inicializar uma varíavel, existem outras formas de inicialização de uma variável, como por exemplo @dynamic. Veremos mais a frente esta forma de inicialização.

(by Ademar Varela)


Um ótimo 2010 para todos!!!

sábado, janeiro 2nd, 2010

Para todos que acompanham este blog, eu desejo um próspero 2010, que todos os desafios sejam conquistados!!!

Boas festas e Feliz 2010

sábado, dezembro 26th, 2009

À todos que acompanham este blog, quero desejar boas festas e um próspero 2010.

Que todos os nossos sonhos se concretizem!

Manipulando View - Parte II

domingo, agosto 16th, 2009

Bom criamos uma view, vamos colocar alguns componentes nesta view para ficar um pouco mais interessante. Conforme mostrado nas matérias anteriores, coloque um componente label nesta View. Não se esqueça de dar um duplo click em cima da Tela1 para abrir a janela. Coloque um label escrito “Tela 1 em ação”. (figura 04). Fizemos algo bem simples apenas para mostrar o funcionamento de uma chamada de view. Agora vamos pensar o seguinte, de que maneira vamos chamar a Tela1? A maneira mais simples é criar um botão na tela anterior e na ação deste botão, chamar a Tela1. Ganha um beijo da Gisele, quem responder que a tela anterior é a RootViewController. É isso mesmo, nesta view iremos colocar um componente button que quando pressionado irá exibir a Tela1. Com um duplo click, abra a RootViewController e coloque um botão nesta view, pode posicionar em qualquer lugar.

figura-05

Criamos uma nova View, criamos uma maneira de exibi-la, vamos voltar para o código, pois é lá que vamos trabalhar para efetivamente exibir a famosa Tela1. Feche o IB e retorne para o XCode. Como eu escrevi anteriormente, uma View é um componente como outro qualquer, logo eu preciso declara-la como tal. Vamos lembrar mais uma vez que a tela que irá chamar a Tela1 é a RootViewController, logo teremos que declarar a Tela1 na própria. Como uma view é basicamente um componente de saída, usaremos a declaração IBOutlet para referencia-la, vamos abrir nosso antigo projeto e inserir a declaração para a Tela1 na RootViewController.h, conforme segue:

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

IBOutlet UIView *viewTela1;

}

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

@property (nonatomic, retain) UIView *viewTela1;

(Matéria publicada na revista MAC+)

(by Ademar Varela)

ModelBaker - Banco de dados para o seu iPhone

sexta-feira, maio 1st, 2009

 

Todos nós temos aquela informação que gostaríamos de organizar em algum lugar né? aquele livro de receita, o acervo de CD e DVD, o acervo de revistas MAC+, enfim todas as coisas legais que possuímos e gostamos. E o melhor, que isto esteja na ponta dos dedos. O problema é fazer isso sem perder tempo, e de maneira bem prática.

O ModelBaker é um aplicativo que pode fazer isto para você. Ele cria e controla uma base de dados que você pode disponibilizar no seu iPhone (e também no Android) com extrema facilidade, mesmo que você não seja um profissional certificado DBA. Com o ModelBaker, você pode fazer rapidamente uma pequena intranet corporativa, criar um cliente web e disponibilizar acesso móvel para seus funcionários, ou amigos.

figura-1

Para tanto, é claro que você precisa ter um mínimo de conhecimento técnico para colocar sua intranet no ar, o ModelBaker é bom, mas não faz mágica. Você tem alguns templates prontos para serem utilizados, mas se desejar criar algo fora do template você precisa saber algumas coisas, tipo: criar um modelo, criar atributos, criar regras e relacionamentos. Nada disso é muito complicado, um pouco de bom senso e organização já ajudam bastante .

figura-2

E mesmo com o template você precisa conhecer as informações para configurar a sua intranet, tais como: Build Path, Cache, Core, e etc.

figura-3

E claro, sempre que a coisa apertar você tem um help. Tá certo, você vai perceber que o ponto forte não é o help, mas ele vai lhe ajudar na criação da sua primeira aplicação para intranet. 

E por que o ModelBaker?

O ModelBaker faz a integração da sua base de dados com o iPhone e Android de uma maneira muito simples, rápida e eficiente. E o mais interessante é que pode atender tanto profissionais como um usuário interessado em fazer coisas simples. O que chama muito a atenção do ModelBaker é a sua interface gráfica, bem intuitiva e limpa, deixando bem claro para o usuário o que precisa ser feito. A forma de criar o projeto é muito interessante. Basta dar um click que você terá sua base criada e pronta para ser usada. Outra coisa interessante é a forma fácil de criar seus modelos de dados, tudo na ponta do mouse. A velocidade de processamento testada na versão Single User não deixou nada a desejar.

Existem 4 versões para comprar o ModelBaker, que se diferenciam pela quantidade de licenças que disponibiliza. A Developer License permite que 1 estação de trabalho ($399.00), na Team License 5 estações de trabalho ($1,599.00), na WorkGroup License 25 estações de trabalho ($6,999.00) e a Enterprise License 100 estações de trabalho ($19,999.00).

Serviço:

Prós: Facilidade de uso e integração com iPhone e Android

Contras: o Help podia ser melhor e os preços das licensas menos salgados

Preço: 1 estação $399,00

Onde encontrar: www.widgetpress.com

(Matéria publicada da revista MAC+)

(by Ademar Varela)

Introdução à plataforma de Desenvolvimento iPhone e iPod Touch - Parte 2

domingo, abril 5th, 2009

 

Montando Projetos iPhone / iPod Touch

Um projeto do iPhone no XCode contém uma variedade de componentes padrões e customizados. A figura abaixo apresenta um projeto típico. Os elementos do projeto incluem código fonte, frameworks e  resources como áudio e imagem. O XCode compila seu código fonte, faz um link com o framework e faz a sua aplicação para instalar no iPhone.

Código para iPhone é normalmente escrito em Objective-C 2.0 que é uma linguagem orientada à objeto que tem suas origens a partir de um mix da linguagem C e Smalltalk. Se você não é familiar com esta linguagem a Apple fornece excelentes tutoriais online no site dedicado para desenvolvedores de iPhone. Frameworks são bibliotecas de software fornecidas pela Apple qye facilita o re-uso de classes.

O projeto apresentado na figura abaixo consiste de um código fonte (main.m) o framework padrão para o iPhone (UIKit, Foundation e Core Graphics) ealguns arquivos de suporte (info.plist). Juntos, estes itens forma todo material necessário para criar uma aplicação básica.

figura-1

Componentes de uma aplicação iPhone / iPod Touch

Como os seus primos Macintosh, uma aplicação iPhone vivem em aplicações Bundles. Uma aplicação Bundles são somente pastas nomeadas com uma extensão .app. Os indices e os resources do seu programa estão nestas pastas, incluindo o executável compilado, o suporte de mídias (como imagens e áudio) e alguns arquivos especiais que descrevem a aplicação para o sistema operacional.

Hierarquia das pastas da aplicação.

Diferente do Macintosh, o Bundle do iPhone não utiliza Indices e pastas de resource para armazenar dados. Todo material aparece no topo da pasta. Por exemplo, ao invés de colocar o suporte à linguagem na pasta Contents/Resources, o XCode coloca diretamente na pasta .app. Você pode ainda usar sub-pastas para organizar seu projeto.

O executável.

O arquivo executável da sua aplicação está na pasta products. Para executar este executável é necessário ter permissões e estas deverão estar autenticadas pelo SpringBoard.

O arquivo info.plist

Como um Macintosh, a pasta de uma aplicação iPhone contém todas as informações importantes no arquivo info.plist. O arquivo info.plist são arquivos com propriedades XML e descrevem a aplicação para o sistema operacional. Esta lista de propriedades estão armazenadas com valores em pares. 

figura-2

 

 

Arquivos XIB (NIB)

Interface Builder cria arquivos XIB (também chamados de arquivos NIB no Macintosh) que armazenam as classes gráficas. Estas classes são chamadas diretamente do programa principal.

figura-3

(Matéria publicada na revista Mac+)

(by Ademar Varela)