Computação Programação Workshop iOS

Resumão do Workshop + Cheatsheet

March 21, 2017

Lembra que eu ia ministrar um workshop? Foi suuuuuper legal. Agora que acabou mesmo vou fazer um overall com todos os pontos positivos e negativos do curso e vou fazer um comparativo do que eu queria ter passado com o que conseguimos fazer (não nesse post), mas a minha conclusão já é a de que foi muito bacana e eu queria repetir mais uma dezena de vezes!!

Então por que você está escrevendo esse post, Yasmin? Porque no último dia eu recapitulei com o pessoal o que vimos nos dois primeiros dias (além de passar a parte de requisições para a API RESTful) e quero deixar uma referência para que eles possam consultar sempre que precisarem. Bônus: pra quem não fez o workshop esse post também será útil ;]

Sumário do que foi passado no curso:

  1. Objective-C
    1. Properties
    2. Classes
    3. Methods
    4. Boolean
  2. Storyboards e XIBs
  3. AutoLayout e Constraints
  4. Delegates
  5. Notifications
  6. UIAlertController
  7. UITableView
  8. UITabBar
  9. Layer

Mais detalhes:

    1. Objective-C
      1. Properties

Atributos podem ser: strong/weak (references) atomic/nonatomic (thread safety)

@property (strong, nonatomic) NSString *string;
      1. Classes

A classe depois dos dois pontos (:) é a classe pai da que eu estou declarando e entre os sinais de maior e menor (<>) eu declaro os delegates que a classe está implementando.

@interface MyViewController : UIViewController 
@end

Para instanciar uma classe é só usar a keyword “new” ou os métodos alloc+init. Um array por exemplo poderia ser declarado de uma das seguintes formas:

NSArray *array = [NSArray new];
NSArray *array = [NSArray alloc]init];
      1. Methods

É nesse momento em que a divisão de águas acontece. Ou a pessoa vai odiar objective-c, jogar tudo pra cima e desistir de tudo, ou ela vai aceitar que a linguagem é verbosa, é semântica, é quadradona, que chamar métodos envolve usar colchetes e vai um dia achar “até tranquilo” codificar assim…

Eis a declaração de métodos em obj-c:

- (void)myMethodName:(NSString *)stringParameter;

Wait, whaat???
Vamos dividir esse método em pedaços:

        1. o sinal no começo pode ser o sinal de menos (-) ou o sinal de mais (+), indicando um instance method e um class method (static), respectivamente.
        2. dentro dos primeiros parênteses colocamos o tipo de retorno
        3. depois do retorno vem o nome do método
        4. o sinal de igual seguido de parênteses :() representa um parâmetro, sendo o tipo dentro dos parênteses seguido de seu nome
      1. Boolean
        1. para true usa-se YES
        2. para false usa-se NO
    1. Storyboards

Conjuntos de XIBs que por sua vez nada mais são do que XMLs mais o advento do interface builder. Esse é um dos próximos tópicos a serem abordados aqui no blog.

    1. AutoLayout e Constraints

Conjunto de regras para o posicionamento de componentes na interface, criando relações entre os componentes e mantendo suas proporções em diferentes modos de apresentação.

    1. Delegates

Semelhantes à interfaces em outras linguagens, são objetos que respondem por eventos recebidos por outro objeto. Entraremos em mais detalhes sobre isso em outro post, mas fica aqui a anotação para a classe que cria o delegate, ou seja, a classe que recebe o evento:

//MyViewController.h
@protocol DelegateName : NSObject 
-(void)methodThatShouldBeImplementedByResponder;
@end
 
@interface MyViewController : UIViewController 
  @property (weak, nonatomic) iddelegate;
@end
 
//MyViewController.m
#import "MyViewController.h"
 
@implementation
-(void)methodThatWillReturnDataToResponder {
  [self.delegate methodThatShouldBeImplementedByResponder];
}
@end

E a anotação para a classe que responde pelo evento:

//ResponderViewController.h
#import "MyViewController.h"
@interface ResponderViewController : UIViewController 
//properties and methods
@end
 
//ResponderViewController.m
 
@implementation
 
-(void)methodThatWillCallMyViewController {
  UIStoryboard *sb = [UIStoryboard storyboardWithName:@"StoryboardName" bundle:nil];
  MyViewController *vc = [sb instantiateViewControllerWithIdentifier:@""];
  vc.delegate = self;
  [self.navigationController pushViewController:vc animated:YES];
}
 
-(void)methodThatShouldBeImplementedByResponder {
  //do something
}
@end
    1. Notifications

Como um farol, fica enviando uma mensagem por broadcast e quem estiver ouvindo por essa mensagem, responde com alguma ação. Por exemplo, quando o teclado aparece na tela uma notificação é enviada e quem se registrou como “listener” dessa notificação, recebe as informações enviadas pelo teclado.

//Enviar uma notificação
[[NSNotificationCenter defaultCenter] postNotificationName:@"notificationName" 
                                      object:@"Hello World!"];
 
//Registrar um listener de notificação, geralmente adicionado no método ViewWillAppear de um ViewController
[[NSNotificationCenter defaultCenter] addObserver:self 
                                      selector:@selector(notificationActionMethod:) 
                                      name:@"notificationName" object:nil];
 
//Remover um listener de notificação, geralmente adicionado no método ViewWillDisappear de um ViewController
[[NSNotificationCenter defaultCenter] removeObserver:self 
                                      name:@"notificationName" 
                                      object:nil];
 
-(void)notificationActionMethod:(NSNotification *)n {
  //[n userInfo] tem o conteúdo enviado através da notificação
}
    1. UIAlertController

No workshop vimos somente o UIAlertControllerStyleAlert, então vou deixar o código pra esse tipo aqui e mais tipos de alertas ficam pra um próximo post.

UIAlertController *myAlertController = [UIAlertController alertControllerWithTitle:@"Alert Title!" 
                                                          message:@"Alert message :]"             
                                                          preferredStyle:UIAlertControllerStyleAlert];
 
UIAlertAction* ok = [UIAlertAction actionWithTitle:@"Positive" style:UIAlertActionStyleDefault     
                                   handler:^(UIAlertAction * action) {
                                     [myAlertController dismissViewControllerAnimated:YES completion:nil];
                                   }];
[myAlertController addAction: ok];
[self.navigationController presentViewController:myAlertController 
                           animated:YES 
                           completion:nil];
    1. UITableView

Êta assunto abrangente. Tem coisa D-E-M-A-I-S pra falar de tabelas em iOS. Prometo que vou fazer posts com tuuudo que vimos no workshop, passo a passo, dicas e tudo mais. Mas por hoje fica só o essencial

      1. Não esqueça de fazer com que seu ViewController seja o delegate e o dataSource da tabela. Muito importante, sem isso ou crashes acontecem ou a tabela não carrega. Se for via Storyboard, clique na tabela, segure ctrl, arraste até o símbolo do ViewController desejado e selecione as duas opções. Se for via código
        self.tableName.delegate = self;
        self.tableName.dataSource = self;
      2. Implemente os métodos obrigatórios:
        -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
        -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
    1. UITabBar

TabBar é aquela barrinha na parte inferior do app com ícones que ao serem acionados mudam o conteúdo da tela. Geralmente tem até 5 itens com ícones contidos somente de imagem ou de imagem+texto e cada item condiz com o conteúdo a ser apresentado. Cada ícone é na verdade uma referência para um fluxo distinto e no caso do nosso app cada ícone é uma referência para um outro Storyboard cujo ponto inicial é um NavigationController, responsável pelo controle do fluxo daquela tab.
Aprendemos que as referências para outros storyboards possuem diferentes modos de apresentação. Para fluxos alternativos, como Login/Signup, usamos o modo “Present Modally”. Para fluxos dos storyboards relativos aos ícones, usamos o modo “ViewControllers”.
Mais sobre TabBars? Adivinha onde?

    1. Layer

Por último, mas não menos importante, vimos um pouquinho, bem por cima, sobre layers. Toda UIView possui uma layer, responsável por coisas como arredondamento dos cantos, inserção de bordas, etc. Vimos que layers recebem cores do tipo “CGColor” e que para que as views internas se adaptem às views externas usamos a propriedade maskToBounds.

//Rounded Corners
[self.myView.layer setCornerRadius:18.0f];
//Border size and colour
[self.myView.layer setBorderWidth:2.0f];
[self.myView.layer setBorderColor:[[UIColor redColor] CGColor]];
//If the outside view has rounded corners, this child view will not go over its borders
[self.myView.layer setMasksToBounds:YES];

YAAAAAAY! Vimos coisa PRA CARAMBA nesse workshop. E eu ainda nem escrevi sobre as coisas do último dia (scrollview, chamadas HTTP e blocks). Eu sei que prometi um milhão de posts durante este, mas eu prometo que vou fazer! Palavra de coração!

Eu me diverti muuuito dando esse curso, não vejo a hora de repetir, tenho mil ideias, pra melhor o que faltou, dar mais foco pro que deu certo, ajustar a ordem, o tempo e mais mil coisas que traquinam na minha cabeça.

Fiquei muito feliz de receber mensagens, e-mails e comentários aqui no blog de pessoas parabenizando e agradecendo, mas sou eu quem tenho que agradecer. Sou muito muito grata ao OpenSanca, que abriu as portas sem colocar barreira nenhuma, ao IFSP que gentilmente cedeu a sala com os Macbooks pra galera conseguir acompanhar o curso, ao Homer que fez a API pro workshop, aguentou minha ansiedade, não deixou eu desistir, me levou pra lá e pra cá, me ajudou a idealizar e participou do curso e foi essencial pra que tudo ocorresse nos conformes. E um agradecimento a todo mundo que foi, apesar da distância, da chuva, da hora. Obrigada meeesmo todo mundo! Foi um passo enorme pra mim ter dado esse curso e espero que eu tenha conseguido passar um pouquinho do meu conhecimento pra frente.

Continuem de olho aqui no blog pra mais novidades, hein?!
Cheers!

You Might Also Like

1 Comment

  • Reply Igor March 21, 2017 at 5:28 pm

    Muito bom.

  • Leave a Reply to Igor Cancel Reply