24
Curso de desarrollo iOS (principiante) sábado 4 de febrero de 12

Apuntes de AppCity 2012 Día 4

Embed Size (px)

DESCRIPTION

Apuntes de AppCity 2012 Día 4

Citation preview

Curso de desarrollo iOS(principiante)

sábado 4 de febrero de 12

DÍA 4

Saving, Loading, and Multitasking Subclassing UITableViewCell Core Data Localization Settings

sábado 4 de febrero de 12

1. SAVING AND LOADING

- Crear un botón y dos Text Fields. Al hacer tap en el botón, se guardará en preferencias el valor de los dos Text Fiels.

-(IBAction)guardar:(id)sender{ NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; NSString *valorNombre = textFieldNombre.text; [prefs setObject:valorNombre forKey:@"Nombre"]; NSString *valorPass = textFieldPass.text; [prefs setObject:valorPass forKey:@"Pass"]; [prefs synchronize];}

sábado 4 de febrero de 12

1. SAVING AND LOADINGCargar datos al inicio:- (void)viewDidLoad{ [super viewDidLoad]; NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; NSString *valorNombre = [prefs objectForKey:@"Nombre"]; NSString *valorPass = [prefs objectForKey:@"Pass"]; if (valorNombre != nil) { [textFieldNombre setText:valorNombre]; } if (valorPass != nil) { [textFieldPass setText:valorPass]; } }

sábado 4 de febrero de 12

1. SAVING AND LOADING

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch * touch = [touches anyObject]; if(touch.phase == UITouchPhaseBegan) { [textFieldRaza resignFirstResponder]; [textFieldNombre resignFirstResponder]; [textFieldEdad resignFirstResponder]; }}

sábado 4 de febrero de 12

2. SUBCLASSING UITABLEVIEWCELL

- Vamos a crear una clase CustomCell que sea subclase de UTTableViewCell que tenga varios labels, uno para el título y otro para la fecha.CustomCell.h:#import <UIKit/UIKit.h>@interface CustomCell : UITableViewCell { UILabel *titulo; UILabel *hora;}@property(nonatomic,retain) UILabel *titulo;@property(nonatomic,retain) UILabel *hora;@end

sábado 4 de febrero de 12

2. SUBCLASSING UITABLEVIEWCELL

Método Constructor:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString*)reuseIdentifier{ self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { //Instanciamos los labels titulo = [[UILabel alloc] initWithFrame:CGRectZero]; hora = [[UILabel alloc] initWithFrame:CGRectZero]; [titulo setBackgroundColor:[UIColor clearColor]]; [hora setBackgroundColor:[UIColor clearColor]]; //Los añadimos a el contenido de la vista [[self contentView] addSubview:titulo]; [[self contentView] addSubview:hora]; //Liberamos [titulo release]; [hora release];

}

return self;}

sábado 4 de febrero de 12

2. SUBCLASSING UITABLEVIEWCELL

Colocación de subvistas:

-(void)layoutSubviews{ [super layoutSubviews]; CGRect bounds = [[self contentView] bounds]; float inset = 5.0; float w = bounds.size.width; float h = bounds.size.height; CGRect titleFrame = CGRectMake(inset,inset, w, (h/2)); CGRect hourFrame = CGRectMake(inset,inset+h/2, w, (h/2)); [titulo setFrame:titleFrame]; [hora setFrame:hourFrame];}

sábado 4 de febrero de 12

2. SUBCLASSING UITABLEVIEWCELL

Modificar cellForRowAtIndexPath de ListViewController.m

-(UITableViewCell*)tableView:(UITableView *)tableViewcellForRowAtIndexPath:(NSIndexPath *)indexPath{ CustomCell *cell = (CustomCell*)[tableViewdequeueReusableCellWithIdentifier:@"CustomCell"]; if (cell == nil) { cell = [[[CustomCell alloc]

initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CustomCell"]autorelease];

}

NSMutableDictionary *i = [items objectAtIndex:indexPath.row]; [[cell titulo] setText:[i objectForKey:@"title"]]; [[cell hora] setText:[i objectForKey:@"pubDate"]]; return cell;}

sábado 4 de febrero de 12

3. CORE DATA

Es un framework que ofrece gestión y persistencia en memoria para los objetos.

Es un ORM: Object-relational mapping: nos permite persistir objetos en distintos medios de almacenaje (El mas usado SQLite pero es posible especificar uno diferente). Se encuentra disponible a partir del SDK 3.0 del iPhone.

Por lo general emplea SQLite.

Es válido para todas las plataformas (iPhone/iPad)

sábado 4 de febrero de 12

3. CORE DATA

Necesitamos conocer tres conceptos importantes:

-El contexto del objeto gestionado: cuando se produce un cambio en un objeto que está dentro de nuestro contexto, dichos cambios se almacenan en la base de datos al llamar al método save.

-El objeto gestionado: es un objeto gestionado por Core Location.

-El modelo de objeto gestionado: se trata de las entidades que serán almacenadas a través de Core Data. La entidad contiene los atributos del objeto y las relaciones con otras entidades.

sábado 4 de febrero de 12

3. CORE DATA

Para entender mejor como funciona Core Data, vamos a hacer un ejemplo.

Creamos un nuevo proyecto de tipo Empty Application.

En la segunda ventana del wizard de creación de proyectos, hay que asegurarse de tener seleccionada la opción de Use Core Data

sábado 4 de febrero de 12

3. CORE DATA

sábado 4 de febrero de 12

3. CORE DATA

Si vemos el delegate de nuestra aplicación, vemos que se han añadido varias propiedades para la gestión de Core Data.

También podemos ver que se ha creado un nuevo archivo en nuestro proyecto con extensión .xcdatamodeld que es donde se guardará nuestro modelo de datos.

Abrimos el archivo y creamos una Entidad nueva con el botón Add Entity.Añadimos los atributos nombre y apellido de tipo String

En Editor Style, cambiamos la vista y vemos como queda nuestro Entity

sábado 4 de febrero de 12

3. CORE DATAAhora vamos a generar la clase para la entidad persona. Para ello vamos a File -> New -> New File ...

sábado 4 de febrero de 12

3. CORE DATA

Vemos que se nos genera la clase Persona en dos ficheros .h y .m

Creamos un UIViewController y lo cargamos al principio en el didFinishLaunchingWithOptions del delegate.

coreDataController = [[CoreDataController alloc] initWithNibName:@"CoreDataController" bundle:nil]; [self.window addSubview:coreDataController.view];

sábado 4 de febrero de 12

3. CORE DATACreamos la vista con un botón y un Table View.

sábado 4 de febrero de 12

3. CORE DATA

Añadimos el método del evento del botón para añadir Personas:

-(IBAction)anadirPersona:(id)sender{ AppDelegate *mainDelegate = [[UIApplication sharedApplication] delegate]; NSManagedObject *nuevaPersona = [NSEntityDescription insertNewObjectForEntityForName:@"Persona" inManagedObjectContext:mainDelegate.managedObjectContext]; ((Persona *)nuevaPersona).nombre = @"Miguel"; ((Persona *)nuevaPersona).apellido = @"Gardia"; [personas addObject:nuevaPersona]; [mainDelegate saveContext]; [tableView reloadData];}

sábado 4 de febrero de 12

3. CORE DATAAñadimos un método para cargar los datos

-(void)cargarPersonas{ AppDelegate *mainDelegate = [[UIApplication sharedApplication] delegate]; NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"Persona" inManagedObjectContext:mainDelegate.managedObjectContext]; [request setEntity:entity]; NSError *error; personas = [[mainDelegate.managedObjectContext executeFetchRequest:request error:error] mutableCopy]; currentPersonaCounter = -1; if(personas == nil) personas = [[NSMutableArray alloc] init]; [tableView reloadData]; }

sábado 4 de febrero de 12

4. LOCALIZATION

- Creamos nuevo proyecto Single View Application

- Añadimos algunos labels y otros elementos a la vista

- Después añadimos a la localización de la vista el idioma Español

- Desde la consola usaremos el comando ibtool para generar el fichero de cadenas a partir de nuestro xib ibtool --generate-strings-file ~/Desktop/ViewController.strings ViewController.xib- Ese comando genera un fichero con el siguiente contenido: /* Class = "IBUILabel"; text = "Texto del label"; ObjectID = "8"; */ "8.text" = "Texto del label"; /* Class = "IBUINavigationItem"; title = "Titulo de la vista"; ObjectID = "10"; */ "10.title" = "Titulo de la vista";

sábado 4 de febrero de 12

4. LOCALIZATION

- Editamos el fichero para asignar los valores del idioma al que vamos a traducir/* Class = "IBUILabel"; text = "Texto del label"; ObjectID = "8"; */"8.text" = "Label text";/* Class = "IBUINavigationItem"; title = "Titulo de la vista"; ObjectID = "10"; */"10.title" = "Title of the view";

- Ahora usamos ibtool para crear un nuevo Xib basado en nuestro xib anterioribtool --strings-file ~/Desktop/ViewController.strings --write ../es.lproj/ViewController.xib ViewController.xib

- Esto nos modifica el XIB cuando ese idioma sea el de por defecto utilizando los valores del fichero de texto

sábado 4 de febrero de 12

4. LOCALIZATION

- Para localizar el código de la aplicación utilizaremos la macro

NSLocalizedString

- Vamos a crear un label dinámicamente y queremos que esté localizadoUILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0,0,100,20)];[self.view addSubview:label];[label setText: NSLocalizedString(@"Label añadida",@"El texto de la label queañadimos") ];- Desde la consola usaremos el comando $ genstrings ViewController.m

sábado 4 de febrero de 12

4. LOCALIZATION

- Ese comando nos genera el fichero Localizable.strings que contiene lo siguiente /* El texto de la label que añadimos */ "Label añadida" = "Label añadida";- Lo modificamos /* El texto de la label que añadimos */ "Label añadida" = "Label added";- Añadimos el fichero Localizable.strings a nuestro proyecto

- Si ejecutamos la app en el idioma al que hemos traducido, saldrá localizada, ya que NSLocalizedString lee el fichero Localizable.strings

sábado 4 de febrero de 12

5. SETTINGS

- Guardar preferenciasNSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; standardUserDefaults setObject:@”Hola” forKey:@"clave"]; [standardUserDefaults synchronize]; !

- Cargar preferenciasNSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];NSString *cadena = [[standardUserDefaults objectForKey:@”clave”] retain];

sábado 4 de febrero de 12