Obtener las coordenadas GPS del iPhone con CoreLocation (parte 2)

mislata

Mislata
Bien en la primera parte del tutorial hicimos una introducción de la librería Core Location y conseguimos sacar por la consola de xCode la posición GPS, pero esto no es mucha utilidad si no podemos usar esta información para mostrar-la en la aplicación, por ejemplo.

Hacer la clase MyCLController útil
Bien, lo que vamos a hacer es modificar la clase que creamos en la primera parte del tutorial de manera que esta nos mande los eventos de cambio de ubicación a la clase que la haya instanciado (nuestra vista por ejemplo). Para hacer esto, vamos a definir un protocolo delegado. Esto es, que nuestra vista va a poder registrarse como la delegada del controlador y podrá recibir ella directamente los eventos que mande MyCLController. Empecemos modificando MyCLController para quede así:

MyCLController.h
Código:
01
....
02
protocol MyCLControllerDelegate
03
required
04
- (void)locationUpdate:(CLLocation *)location;
05
- (void)locationError:(NSError *)error;
06
end
07
 
08
interface MyCLController : NSObject {
09
CLLocationManager *locationManager;
10
id delegate;
11
}
12
 
13
property (nonatomic, retain) CLLocationManager *locationManager;
14
property (nonatomic, assign) id delegate;
15
 
16
- (void)locationManager:(CLLocationManager *)manager
17
didUpdateToLocation:(CLLocation *)newLocation
18
fromLocation:(CLLocation *)oldLocation;
19
 
20
- (void)locationManager:(CLLocationManager *)manager
21
didFailWithError:(NSError *)error;
22
 
23
end

MyCLController.m

Código:
01
#import "MyCLController.h"
02
 
03
implementation MyCLController
04
 
05
synthesize locationManager;
06
synthesize delegate;
07
 
08
- (id) init {
09
self = [super init];
10
if (self != nil) {
11
self.locationManager = [[[CLLocationManager alloc] init] autorelease];
12
self.locationManager.delegate = self; // send loc updates to myself
13
}
14
return self;
15
}
16
 
17
- (void)locationManager:(CLLocationManager *)manager
18
didUpdateToLocation:(CLLocation *)newLocation
19
fromLocation:(CLLocation *)oldLocation
20
{
21
[self.delegate locationUpdate:newLocation];
22
}
23
 
24
- (void)locationManager:(CLLocationManager *)manager
25
didFailWithError:(NSError *)error
26
{
27
[self.delegate locationError:error];
28
}
29
 
30
- (void)dealloc {
31
[self.locationManager release];
32
[super dealloc];
33
}
34
 
35
end

Bien hasta aquí lo que hemos hecho es establecer un protocolo delegado que tiene dos métodos requeridos o obligatorios: una para cuando se actualiza la ubicación y otro por si da error. Ahora tenemos que modificar MyViewController para que soporte MyCLControllerDelegate y usar los eventos que nos mande este para, por ejemplo, modificar el texto de una UILabel.

Mostrando los cambios en la ubicación
Ahora tenemos que modificar nuestra clase MyViewController para que implemente MyCLControllerDelegate. La clase debería quedar así:

MyViewController.h
Código:
01
#imports....
02
#import "MyCLController.h"
03
 
04
interface hereViewController : UIViewController <MyCLControllerDelegate> {
05
//un IBOutlet para la label donde que queremos que nos muestra la ubicación
06
IBOutlet UILabel *locationLabel;
07
MyCLController *locationController;
08
}
09
 
10
//estas dos funciones estamos obligados a implementar-las tal y como hemos definido en el protocolo.
11
- (void)locationUpdate:(CLLocation *)location;
12
- (void)locationError:(NSError *)error;
13
 
14
end

MyViewController.m
Código:
1
//implementamos la dos funciones que obliga el protocolo a implementar
2
- (void)locationUpdate:(CLLocation *)location {
3
locationLabel.text = [location description];
4
}
5
 
6
- (void)locationError:(NSError *)error {
7
locationLabel.text = [error description];
8
}

Bueno pues ya esta, no olvidéis abrir el .xib de vuestra vista y añadir un UILabel y asociarlo al IBOutlet que hemos creado. Si todo va bien deberías ver la ubicación actual en la UILabel.

Espero que os haya servido de ayuda el tutorial.
 
Arriba