Archive for maio, 2009

Desvendando um pouco do código - Parte Final

sábado, maio 23rd, 2009

 

O que é um arquivo XIB (ou NIB)?

figura-31

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

File’s Owner é o objeto que possui o controle do próprio arquivo XIB. Mais para frente iremos voltar conversar sobre ele. Já o First Responder é o objeto com o qual o usuário faz a sua interação. O First Responder controla a iteração do usuário com a interface da aplicação.

Mais adiante voltaremos a falar destes controles mais a fundo, agora vamos mexer um pouco no IB. Na janela MainView.XIB vamos encontrar um controle chamado RootView Controller. Como você já percebeu, já vimos este mesmo nome na pasta Application Controllers, e isto não é coincidência. Este controle é o reflexo da classe que está na Application Controllers, e como sabemos disso?

De um click na 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 é a RootViewController .

figura-4

Um duplo click em RootViewController irá abrir uma view no IB. A partir deste momento, todos os componentes inseridos nesta view poderão ser controlados na classe RootViewController que está na pasta Application Controller. Na próxima edição vamos colocar componentes nesta view e aprender a controla-los na classe.

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

Desvendando um pouco do código - Parte II

quarta-feira, maio 13th, 2009

Agora vamos abrir a pasta Application Controllers, que como o próprio nome diz, é aonde estão todos os controles que a nossa aplicação irá usar. Como de costume, vamos ter a mesma quantidade de arquivos das pastas anteriores.

RootViewController, é a classe principal deste tipo de aplicação. Vamos encontrar quase todos os métodos falados na MainView. 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 método toggleView controla qual view deverá exibida para o usuário, a MainView ou a FlipsideView. Este método também determina qual vai ser a transição que será usada na mudança entre a MainView e a FlipsideView. Na verdade a forma de fazer isto está descrito na linha:

 

[UIView setAnimationTransition:([mainView superview] ? UIViewAnimationTransitionFlipFromRight : UIViewAnimationTransitionFlipFromLeft) forView:self.view cache:YES];

 

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

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

Desvendando um pouco do código - Parte I

quinta-feira, maio 7th, 2009

 

Na nossa última matéria criamos um projeto do tipo Util, e agora vamos estudar alguns pontos interessantes. Podemos observar que o wizard do XCode criou duas pastas específicas para fazer o controle da transição. Esta transição é chamada de Flipside. Os códigos que controlam esta transição estão nas pastas Main View e Flipside View. Basicamente as duas possuem os mesmo tipo de código, ou seja, as duas possuem 4 arquivos. Conforme já mencionamos em matérias anteriores, arquivos com a extensão .h são arquivos header dos arquivos 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?

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

#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 5 métodos declarados:

  • initWithNibName - Este método informa qual será o arquivo NIB que será 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, e também podemos limitar uma orientação específica para a aplicação: Portrait ou Landscape;
  • didReceiveMemoryWarning - Este método é chamado quando ocorre um warning na memória no momento que a sua aplicação está sendo utilizada;
  • dealloc - Este método é chamado assim que a sua aplicação for finalizada.

Iremos utilizar este métodos e outros mais na medida que formos nos aprofundando no desenvolvimento de uma aplicação, agora vamos procurar 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?

(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)