Aprendiendo Objetive-C para IOS (Dia 9)

Guion del blog de curso de Objetive-C para IOS – DIA 9
nota: Esto es no es curso propiamente dicho, es un diario de autoaprendizaje de objetive-c, que me sirve para afianzar conocimientos, y de paso, tener un diario de referencia, con ejemplos propios de uso del lenguaje.
————-
Vamos a ver como se puede utilizar un NSTimer, para realizar diferentes acciones. Por ejemplo, el crear un contador, o el mover un objeto por la pantalla.

Creamos un nuevo proyecto, de tipo single-view, sin usar storyboard, ni ARC.
Creamos un interface como se ve a continuación, con dos imágenes, 3 labels y un Stepper

Creamos todos los outlets de los componentes, y un catión del stepper, para que se actualice el label adecuado cada vez que incrementamos o decrementos su valor.
Teneis como siempre la explicación, en los comentarios de los archivos
Los archivos quedaran así:
//
//  ViewController.h
//  Diario009
//
//  Created by david fraj blesa on 14/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController{
    //Esto sera una variable de tipo entero, para controlar el tiempo
    int contador;
    int contador2;
    NSTimer *eltimer;
    NSTimer *eltimer2;
    
}
@property (retain, nonatomic) IBOutlet UILabel *lblTiempo;
@property (retain, nonatomic) IBOutlet UILabel *lblTiempo2;
@property (retain, nonatomic) IBOutlet UIImageView *imgBola;
@property (retain, nonatomic) IBOutlet UIImageView *imgBola2;
@property (retain, nonatomic) IBOutlet UIStepper *spMasMenos;
@property (retain, nonatomic) IBOutlet UILabel *lblNumero;
– (IBAction)spMasMenos_valueChanged:(id)sender;
-(void) metodo;
-(void) metodo2;
@end
——————–
——————–
//
//  ViewController.m
//  Diario009
//
//  Created by david fraj blesa on 14/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import «ViewController.h»
@implementation ViewController
@synthesize lblTiempo;
@synthesize lblTiempo2;
@synthesize imgBola;
@synthesize imgBola2;
@synthesize spMasMenos;
@synthesize lblNumero;
– (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren’t in use.
    
}
#pragma mark – View lifecycle
– (void)viewDidLoad
{
    //Ponemos el contador a 0
    contador=0;
    contador2=0;
    
    //Inicializamos el timer
    //El NSTimer, funciona de tal manera que al reservar memoria para dicho timer
    //Tenemos que decirle el intervalo de tiempo, el objetivo o target de
    //Dicho timer, el «metodo» que se ejecutara cada vez, y el numero de
    //veces que se va a repetir
    eltimer=[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(metodo) userInfo:nil repeats:YES];
    
    //Creamos un nuevo Timer, pero que se ejecute mas rapido
    eltimer2=[NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(metodo2) userInfo:nil repeats:YES];
    
    //Establecemos el valor del contador mas menos a 1
    [spMasMenos setValue:1];
    lblNumero.text=[NSString stringWithFormat:@»%.0f», spMasMenos.value];
    
    //nota: con @»%.0f», estamos mostrando el float/double con 0 decimales
    
    [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
    
}
– (IBAction)spMasMenos_valueChanged:(id)sender {
    //Cada vez que cambie el valor, actualizamos para saber la velocidad
    lblNumero.text=[NSString stringWithFormat:@»%.0f», spMasMenos.value];
//Este metodo se ejecutara una vez por segundo, de forma indefinica
-(void) metodo{
    //Incrementamos el contador
    contador++;
    
    //Actualizamos el estado del label con el contenido del timer
    lblTiempo.text=[NSString stringWithFormat:@»%d», contador];
    
    //Vamos a mover la bola
    //Para eso, lo unico que hacemos es cambiar el valor de su centro, haciendo
    //uso del value que hay en el componente Stepper con el nombre
    //spMasMenos. Podria ser una constante como 1, sin ningun problema
    imgBola.center=CGPointMake(imgBola.center.x+spMasMenos.value, imgBola.center.y+spMasMenos.value);
    
}
//Este metodo se ejecutara 100 veces cada segundo, de forma indefinida
-(void) metodo2{
    //Incrementamos el contador
    contador2++;
    
    //Actualizamos el estado del label con el contenido del timer
    lblTiempo2.text=[NSString stringWithFormat:@»%d», contador2];
    
    //Vamos a mover la bola2
    imgBola2.center=CGPointMake(imgBola2.center.x+1, imgBola2.center.y+1);
    
}
– (void)viewDidUnload
{
    [self setLblTiempo:nil];
    [self setLblTiempo2:nil];
    [self setImgBola:nil];
    [self setImgBola2:nil];
    [self setSpMasMenos:nil];
    [self setLblNumero:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}
– (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
}
– (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
}
– (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
}
– (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
}
– (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
– (void)dealloc {
    [lblTiempo release];
    [lblTiempo2 release];
    [imgBola release];
    [imgBola2 release];
    [spMasMenos release];
    [lblNumero release];
    [super dealloc];
}
@end