lunes, 26 de agosto de 2013

UIViewController - UINavigationController

(contenido parcial, pendiente de finalizar)

 UIViewController 


La presentación y gestión de Views se realiza mediante UIViewController. 

UIViewController gestiona la relación entre la View y los datos (model).

UIView es el contenido mostrado al usuario, el Model son los datos gestionados por la aplicación, y el UIViewController es el intermediario entre esos componentes, así se forma el Model-View-Controller.


Si creamos un UIViewController y le nombramos RootViewController. En el fichero .h del application delegate.

#import <UIkit/UIkit.h>

@class RootViewController  // referencia al UIViewControlle creado

@interface AplicacionAppDelegate: UIRespondeer <UIApplicationDelegate>

@property (nonatomic, strong) UIWindows *window;
@property (nonatomic, strong) RootViewController *rootViewController;

@end

Ya tenemos declarada un propiedad RooViewController que es la clase UIViewController que hemos creado en el XCode mediante File New ...



Ahora en el fichero .m del application delegate en el método didFinishLaunchingWithOptions instanciamos el UIViewController que hemos creado y se lo añadimos a nuestro windows.

- (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{


self.windows = [[UIWindow alloc] 
initWithFrame:[UIScreen mainScreen] bounds]];


[self.windows makeAndVisible];

self.rootViewController = [[RootViewController alloc]
initWithNibName:nil
bundle:NULL];

[self.window addSubview:self.rootViewController.view];

return YES;

}

Ya hemos iniciado la aplicación con nuestro UIViewController creado.

En la creación del UIViewController se indico que "With XIB for user interface" en este caso XCode creo un fichero que podemos ver el diseño en interface builder. Podemos cargar ese fichero en el método didFinishLaunchingWithOptions del application delegate.

En lugar de:

self.rootViewController = [[RootViewController alloc]
initWithNibName:nil
bundle:NULL];

Quedaría así, indicando en nombre del fichero .xib:

self.rootViewController = [[RootViewController alloc]
initWithNibName:@"RootViewController"
bundle:NULL];



 UINavigationController 


UINavigationController permite al usuario desplazarse por los distintos UIViewController de la aplicación. 

Realiza llamadas push y pop para añadir y extraer elementos UIViewController que gestiona para que sean visualizados. El UIViewController situado arriba de la pila es la pantalla que visualiza el usuario.

Añadiremos un UINavigationController. En el dichero .h del app delegate añadimos una property UINavigationController.


#import <UIkit/UIkit.h>

@class RootViewController  // referencia al UIViewControlle creado

@interface AplicacionAppDelegate: UIRespondeer <UIApplicationDelegate>

@property (nonatomic, strong) UIWindows *window;
@property (nonatomic, strong) RootViewController *rootViewController;
@property (nonatomic, strong) UINavigationController *navigationController;

@end


Inicializamos el UINavigationController con el método initWithRootViewController pasandole el rootViewController.



- (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

self.windows = [[UIWindow alloc] 
initWithFrame:[UIScreen mainScreen] bounds]];


[self.windows makeAndVisible];

self.rootViewController = [[RootViewController alloc]
initWithNibName:nil
bundle:NULL];

self.navigationController = [[UINavigationController alloc]
initWithRootViewController:self.rootViewController];

[self.window addSubview:self.navigationController.view];

return YES;

}

Ahora tendremos una pantalla con una barra de navegación en la que podemos colocar botones.



Crearemos un segundo UIViewController que lo añadiremos a nuestro NavigationController. En el fichero .m de implementación del RootViewContoller tendremos la llamada a esta segunda UIVIewController.

#import "RootViewController.h"
#import "NuevoViewController.h"

@implementation RootViewController....

En el método viewDidApperar del rootViewController.

- (void) viewDidAppear:(BOOL)paramAnimated{

 [super viewDidAppear:paramAnimated];
 [self performSelector:@selector(pushNuevoViewController)
withObject:nil
afterDelay:3.0f];
}

En el método pushNuevoViewController

- (void) pushNuevoViewController{

NuevoViewController *nuevoViewController = [[NuevoViewController alloc]
initWithNibName:nil
bundle:NULL];        


[self.navigationController 
pushViewController:nuevoViewController 
animated:YES];                                 

}


Ahora ya tenemos un nuevo UIViewController en la pila del UINavigationCotroller añadido mediate pushViewController

Para eliminarlo de la pila tenemos que utilizar el método popViewControllerAnimated.

En el método viewDidAppear del UIViewController nuevoViewController añadir este código.

- (void) viewDidAppear:(BOOL)paramAnimated{

[super viewDidAppear:paramAnimated];

[self performSelector:@selector(decargarPila)
withObject:nil       
afeterDelay:10.0f];

}

- (void) descargarPila
{
  [self.navigationController popViewControllerAnimated:YES];
}
Después de descargar nuevoViewController aparecerá rootViewController que es el UIViewController que pasará a ser el UIViewController que está en la parte superior de la pila.
















sábado, 24 de agosto de 2013

UIAlertView - UISwitch - UIPickerView - UIDatePicker - UISlider - UISegmentedControl

(contenido parcial, pendiente de finalizar)


 UIAlertView 


Ver: más información acerca de UIViewAlert

Ejemplo de inicializar un UIAlertView:

UIAlertView *infUsuario= [[UIAlertView alloc] initWithTitle:@"Título Alerta"
message:@"Mensaje a mostrar al usuario"
delegate:nil
cancelButtonTitle:@"Cancelar"
otherButtonTitle:@"Aceptar", nil];

Mostrar la alerta mediante el método show  de UIAlertView:

[infUsuario show]; 


Los UIAlertView pueden aplicarse alguno de los siguientes estilos, en la propiedad alertViewStyle de tipo UIAlertViewStyle.


  • UIAlertViewStyleDefault
  • UIAlertViewStyleSecureTextInput
  • UIAlertViewStylePlainTextInput
  • UIAlertViewStyleLoginAndPasswordInput

El método setAlertViewStyle establece el estilo. 

[infoUsuario setAlertViewStyle:UIAlertViewStylePlainTextInput];



Para obtener la respuesta del usuario cuando interactua con el UIAlertView el UIViewController debe implementar el protocolo UIAlertViewDelegate, y el delegate del alert apuntar a self.

El método alertView:clickedButtonAtIndex es llamado inmediatamente después de que el usuario pulsa un botón del Alert View.

// El delegate es asingnado en este caso.

UIAlertView *infUsuario= [[UIAlertView allocinitWithTitle:@"Título Alerta"
message:@"Mensaje a mostrar al usuario"
delegate:self  // el delegate apunta al UIViewController que lo contiene
cancelButtonTitle:@"Cancelar"
otherButtonTitle:@"Aceptar", nil];

// El método que obtiene la opción seleccionada del usuario

- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger) buttonIndex{

  NSString *tituloBtnPulsado = [alertView buttonTittleAtIndex:buttonIndex];

  if([tituloBtnPulsado isEqualToString:@"Aceptar"]){
       // ha pulsado boton acceptar
  } 
  else if([tituloBtnPulsado isEqualToString:@"Cancelar"])
  {
       // ha pulsado el botón cancelar
   }

}



 UISwitch 


UISwitch permite mostrar opción on/off, yes/no al interfaz de usuario.

Ejemplo de inicializar un UISwitch:


UISwitch *indicador = [[UISwich alloc

initWithFrame:CGRectMake(50,50,0,0)];

Por defecto muestra el estado off.

Para cambiar a estado on llamar al método setOn.

[indicador setOn:YES];


Para obtener la opción seleccionada del usuario hay que utilizar el addTarget:action:forControlEvents.


Ejemplo para captar la acción del usuario:

[indicador addTarget:self 
action:@selector(indicadorSeleccionado:)
forControlEvents:UIControlEventValueChanged];


- (void) indicadorSeleccionado:(UISwitch *)paramSender{

  if([paramSender isOn]){
    // el indicador está on
  }else{
    // el indicador está off
  }

}


Para cambiar el aspecto de un control UISwitch hay que actuar sobre las propiedades que afectan a las imagenes y al color del UISwitch.


En el caso de las imágenes.


  • On Image, que representa el estado On. Ancho 77p, alto 22 p.
  • Off Image, que representa el estado Off. Ancho 77p, alto 22 p.

En en caso del color.

  • tintColor, es el color aplicado al estado Off.
  • thumbTintColor, es el color aplicado al botón del UISwitch.
  • onTintColor, es el color aplicado al estado On


Ejemplo para cambiar el color y la imagen del UISwitch:


UISwitch *indicador = [[UISwich alloc

initWithFrame:CGRectMake(50,50,0,0)];




indicador.tintColor = [UIColor redColor];
indicador.onTintColor = [UIColor brownColor];
indicador.thumbTintColor = [UIColor greenColor];

indicador.onImage = [UIImage imageNamed:@"imagenOn"];
indicador.offImage = [UIImage imageNamed:@"imagenOff"];



 UIPickerView 


Ver: más información acerca de UIPickerView


Es necesario implementar el protocolo UIPickerViewDataSource protocolo para informar al UIPickerView de los elementos a mostrar.

@interface ContendorViewController : 
UIViewController <UIPickerViewDataSource>


@property (nonatomic, strong) UIPickerView *seleccioneElemento;


En el método viewDidLoad 

self.seleccioneElemento = [[UIPickerView alloc] init];
self.seleccioneElemento.dataSource = self;
self.seleccioneElemento.center = self.view.center;

[self.view addSubview:self.seleccioneElemento];


Los métodos del protocolo UIPickerViewDataSource a implementar son numberOfComponentsInPickerView, y numberOfRowsInComponent.

- (NSInteger) numberOfComponentsInPickerView:(UIPickerView *)pickerView{

  NSInteger result = 0;

  if([pickerView isEqual:self.seleccioneElemento]){
     result = 1;
  }

  return result;
}

- (NSInteger) pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{

  NSInteger result = 0;

  if([pickerView isEqual:self.seleccioneElemento]){
     result = 5;
  }

  return result;
}


Ahora que tenemos el valor del número de lineas y de componentes (columnas) tenemos que implementar el método view:titleForRow:forComponent del protocolo UIPickerViewDelegate.


Si en el viewDidLoad rellenamos el array de elementos:


- (void) viewDidLoad {
  
 NSArray *enNumero = [[NSArray alloc]
 initWithObjects:@"1",@"2",@"3",nil];
 NSArray *enLetra = [[NSArray alloc] 
initWithObjects:@"uno",@"dos",@"tres",nil];

 [super viewDidLoad];
}


// Número de componentes 2, el array de enNumero y la de enLetra

- (NSInteger) numberOFComponentsInPickerView(UIPickerView *) pickerView{
  return 2;
}

// El número de filas para cada columna

- (NSInteger) pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{

  if(component == 0){ // para la primera columna el array de numeros

     return [enNumero count];

  }else{

     // la segunda columna tantas líneas como el tamaño del array enLetra
     return [enLetra count]; 

  }

}


// Para rellenarlo con el valor de los arrays


- (NSInteger) pickerView:(UIPickerView *)pickerView 
titleForRow:(NSInteger) row
forComponent:(NSInteger) component {

  if(component == 0){

    // para la primera columna valores del array  enNumero

     return [enNumero objectAtIndex:row];

  }else{

     // para la segunda columna valores del array enLetra

     return [enLetra objectAtIndex:row];

  }

}


Ahora nos toca conocer el elemento seleccionado.
Por defecto el indicador del UIPickerView no se visualiza. Para visualizarlo:


self.seleccioneElemento.showsSelectionIndicator = YES;


Implementamos el método selectedRowInComponent de UIPickerView.

- (void) pickerView:(UIPickerView *)pickerView 
didSelectedRow:(NSInteger) row
inComponent:(NSInteger) component {

NSString *valorNumero;
NSString *valorLetra;

  if(component == 0){

    // de la selección obtengo la columna de los números
       valorNumero = [enNumero objectAtIndex:row];

  }else{

    // de la selección obtengo la columna de las letras
       valorLetra = [enLetra objectAtIndex:row];     

  }


}



 UIDatePicker 


UIDatePicker permite al usuario seleccionar una fecha y hora de forma intuitiva.

Ejemplo para inicializar un UIDatePicker:

UIDatePicker *selectorFecha = [[UIDatePicker allocinit]; 

Por defecto muestra la fecha actual. 
La propiedad datePickerMode permite establecer el tipo UIDatePickerMode.


  • UIDatePickerModeTime
  • UIDatePickerModeDate
  • UIDatePickerModeDateAndTime
  • UIDatePickerModeCountDownTimer

Para obtener la fecha seleccionada:

NSDate *fechaSeleccionada = selectorFecha.date;


UIDatePicker puede indicar cuando se ha cambiado de fecha utilizando el método addTarget:action:forControlEvents:.



Ejemplo para declarar un selector de un UIDatePicker:



- (void) viewDidLoad {

 [super viewDidLoad];



 UIDatePicker *selectorFecha = [[UIDatePicker allocinit]; 
 selectorFecha.center = self.view.center;
 selectorFecha.datePickerMode UIDatePickerModeDate;

 [self.view addSubview:selectorFecha];

 [selector addTarget:self
 action:@selector(cambioFecha:)
 forControlEvents:UIControlEventValueChanged];

}


// El método selector declarado

- (void) cambioFecha:(UIDatePicker *)paramDatePicker {

  NSLog(@"Fecha seleccionada = %@", paramDatePicker.date);
}



UIDatePicker permite establece una fecha mínima y máxima para limitar al usuario un margen de fechas.


Ejemplo para determinar la fecha mínima y maxima en un UIDatePicker:

 UIDatePicker *selectorFecha = [[UIDatePicker allocinit]; 
 selectorFecha.center = self.view.center;
 selectorFecha.datePickerMode UIDatePickerModeDate;

 NSTimeInteval intervaloAnual = ( 24 * 60 * 60 ) * 365;
 NSDate *minimaFecha = [NDate date];

 [minimaFecha dateByAddingTimeInterval:intervaloAnual];

 NSDate *maximaFecha =
 [[NSDate date] dateByAddingTimeInter: 2 * intervaloAnual];

 selectorFecha.minimumFecha = minimaFecha;
 selectorFecha.maximaFecha = maximaFecha;



 UISlider 


UISlider permite especificar un rango de valores.

Ejemplo para instanciar un UISlider estableciendo un valor mínimo y máximo:


- (void) viewDidLoad{

[super viewDidLoad];

UISlider *valorNumerico = [[UISlider alloc]

initWhitFrame:CGRectMake(5.0f, 5.0f, 220.0f, 30.0f)];


valorNumerico.minimumValue = 0.0f;
valorNumerico.maximumValue = 80.0f;

valorNumerico.value = 10.0f; // estableciendo un valor inicial

[self.view addSubview:valorNumerico];

}


Para capturar la interacción del usuario indicar el método addTarget:action:forControlEvents:.



[valorNumerico addTarget:self
action:@selector(seleccionValorNumerico:)
forControlEvents:UIControlEventValueChanged];


// el selector seleccionValorNumerico

- (void) seleccionValorNumerico:(UISlider *)paramSender{

    NSLog(@"Se ha seleccionado %f, paramSender.value);

}

Para evitar que continuamente se llame a este selector cuando la imagen del UISlider está desplazandose y que solo se llame cuando finalice la selección.

valorNumerico.continuous = NO;



Para cambiar el aspecto de UISlider, es posible asignar una imagen al desplazador según el estado, normal o cuando el usuario está desplazando la imagen para seleccionar un valor. 


  • UIControlStateNormal
  • UIControlStateHighlilghted

Ejemplo para asignar imagen según el estado:


[valorNumerico setThumbImage:[UIImage imageNamed:@"verde.png"] forState:UIControlStateNormal];

[valorNumerico setThumbImage:[UIImage imageNamed:@"rojo.png"] forState:UIControlStateHighlighted];


Además de modificar la imagen también es posible modificar el color de las distintas partes el UISlider. 


Propiedades para aplicar el tintColor:


  • minimumTrackTintColor, se aplica a la zona del valor mínimo.
  • thumbTintColor, se aplica a la zona de indicador de desplazamiento.
  • maximumTrckTintColor, se aplica a la zona del valor máximo.


Ejemplo para asignar el tintColor:

valorNumerico.minimumTrackTintColor = [UIColor blueColor];
valorNumerico.thumbTintColor = [UIColor greenColor];
valorNumerico.maximumTrackTintColor = [UIColor yellowColor];


Además es posible asignar imágenes que aparecerán en el lado del valor mínimo y al lado del valor máximo. Las imágenes tienen que ser de un tamaño 23 x 23.

Métodos para asignar esas imágenes:


  • setMaximumValueImage:forState
  • setMinimumValueImage:forState

[valorNumerico setMaximumValueImage:
[UIImage imagenNamed:@"sol.png"]];

[valorNumerico setMinimumValueImage:
[UIImage imagenNamed:@"luna.png"]];




 UISegmentedControl 


UISegmentedControl permite selección una opción de forma rápida, en un conjunto de pocas opciones.

Ejemplo para instanciar un UISegmentedControl:

- (void) viewDidLoad {

[super viewDidLoad];

NSArray *diasSemana = [[NSArray alloc] initWithObjects:
@"lunes", @"martes", @"miercoles", @"jueves", @"viernes", nil]];

UISegmentedControl *peticionControl =
 [[UISegmentedControl alloc]
initWhitItems:diasSemana];

peticionControl.center = self.view.center;

[self.view addSubview:peticionControl];

}

Para capturar la selección del usuario el método addTarget:action:forControlEvents:


[peticionControl addTarget:self
action:@selector(diaSeleccionado:)
forControlEvents:UIControlEventValueChanged];


El selector declarado.

- (void) diaSeleccionado(UISegmentedControl *)paramSender{

NSInteger indiceSeleccion = [paramSender selectedSegmentIndex];

NSString *textoDia = 
[paramSender titleForSegmentAtIndex:indiceSeleccion];

}


Estilo asignado a los UISegmentedControl mediante la propiedad segmentedControlStyle. Estilos definidos para UISegmentedControl :



  • UISegmentedControlStylePlain
  • UISegmentedControlStyleBordered
  • UISegmentedControlStyleBar
  • UISegmentedControlStyleBezeled

Ejemplo de la propiedad segmentedControlStyle:

peticionControl.segmentedControlStyle = UISegmentedControlStyleBar;


También se puede aplicar un tintColor para cambiar su color.

peticionControl.tintColor = [UIColor redColor];

























miércoles, 21 de agosto de 2013

OBJECTIVE C (NSString, NSArray, NSDictionary, ...)

(contenido parcial, pendiente de finalizar)
_________________________________________________________________________

Declaración de Variables

Se declara las variables con la siguiente sintaxis:

<tipo> <nombre_de_la_variable>;

Ejemplos:

NSInteger consignoInteger = -345; 
NSUInteger sinsignoInteger = 345;

NSInteger puede contener números con signo negativo.
NSUInteger no pueden contener números negativos.


El tipo de variable informa al compilador.

Tipos de variables en Objective-C:

int: enteros sin decimales (ejemplo: 20, -85)
float: números de coma flotante (números con decimales)
double: números de coma flotante que pueden contener un número elevado de dígitos.

NSString: cadenas con números, letras, símbolos.

ejemplos crear instancias de NSString: 
  • NSString *cadena = @"Contenido de la cadena";
  • NSString *cadena = [NSString stringWithString:@"Contenido de la cadena"];
  • NSString *cadena = [[NSString alloc] initWithString:@"Contenido de la cadena"];
ejemplos de como convertir cadenas en valores numéricos:

NSString *cadenaDeNumeros = @"258.45";
  • NSInteger valorNumerico = [cadenaDeNumeros integerValue]; 
  • CGFloat valorNumerico = [cadenaDeNumeros floatValue]; 
  • double valorNumerico = [cadenaDeNumeros doubleValue]; 

ejemplos de como buscar si existe una subcadena en una cadena de NSString:

NSString *cadena = @"Contenido del objeto instanciado";
NSString *aBuscar = @"objeto";
NSRange posicion = [cadena rangeOfString:aBuscar];

if (posicion.location == NSNotFound){
   // No existe cadena "objeto" en cadena
}else{
   NSLog(@"El texto %@ existe en %@ en la posición %lu", aBuscar, cadena, (unsigned long) posicion.location);
}



NSMutableString: cadenas que pueden ser modificadas - ampliada, reducida, sustutida, etc -.

ejemplos crear instancias de NSMutableString: 
  • NSMutableString *cadena = @"Contenido de la cadena mutable";
  • NSMutableString *cadena = [NSMutableString stringWithString:@"Contenido de la cadena mutable"];
  • NSMutableString *cadena = [[NSMutableString allocinitWithString:@"Contenido de la cadena mutable"];

ejemplo para modificar instancias de NSMutableString: 

NSMutableString *cadena = [[NSMutableString alloc] initWithString:@"Contenido inicial"];

[cadena appendString:@" esta cadena se añade al contenido];


// Si quiero cambiar  "se añade" del contenido del objeto cadena por "modificado"

[cadena replaceOccurrencesOfString:@"se añade"
withString:@"modificado"
options:NSCaseInsensitiveSearch 
posicion:NSMakeRange(0, [cadena length])
];


NSInteger: números enteros con signo 

NSUInteger: números enteros sin singo, cero o positivo. 

NSArray: colección de objetos, accesible mediante índices. Se pueden añadir cualquier objeto de tipo NSObject. Un array puede contener una mezcla de tipos diferentes de objetos. No todos los objetos deben de ser del mismo tipo.

ejemplos crear instancias de NSArray (nil finaliza la lista de objetos): 


  • NSArray *coleccion = [[NSArray alloc] initWithObjects:@"objecto 1", @"objeto 2", @"objeto 3", nil];
  • NSArray *coleccion = @[@"cadena", @-20, @45]; // no necesita el nil final
  • NSArray *coleccion = [NSArray arrayWithObjects:@"objecto 1", @-20, @45, nil];

ejemplo para recorrer el contenido de NSArray utilizando variable: 


NSArray *coleccion = @[@"cadena", @-20, @45]; 

NSUInteger posicion = 0;
for (posicion = 0; posicion < [coleccion count]; posicion++){
   id elemento = coleccion[posicion];
}

ejemplo para recorrer el contenido de NSArray mediante enumeration: 


for (id elemento in coleccion){
   id elemento = coleccion[posicion];
}



NSMutableArray: colección de objetos, accesible mediante índices, permite modificarse después de su creación.



ejemplos crear instancias de NSMutableArray: 
  • NSMutableArray *coleccionMutable = [NSMutableArray arrayWithArray:@[@"cadena", @-20, @45]];
añadimos un elemento: 

[coleccionMutable addObject:@75];

eliminamos un elemento:

[coleccionMutable removeObject:@-20];

añadimos un NSArray:

NSArray *coleccion = @[@"nuevo valor 1", @"nuevo valor 2"];

[coleccionMutable addObjectsFromArray:coleccion];



ejemplo ordenar un NSArray :

Para ordenar un NSArray o NSMutableArray utilizar el método de ordenación utilizando un bloque de código. Ordenar NSArray devuelve una nueva instancia de NSArray dejando la original intacta. En el caso de NSMutableArray el original es el destino de la ordenación y no devuelve un nuevo array.


NSMutableArray *coleccion = [NSMutableArray arrayWithArray:@[@"Letra B", @"Letra C", @"Letra A"]];

[coleccion sortUsingComparator: ^NSComparisonResult(__strong id obj1, __strong id obj2){

NSString *valor1 = (NSString *)obj1;
NSString *valor2 = (NSString *)obj1;

return [valor1 compare:valor2];

}];

El array mutable coleccion estará ordenado, Letra A, Letra B, Letra C.



NSDictionary: colección de objetos accesibles mediante una clave. Son colecciones objeto/clave.

ejemplos crear instancias de NSDictionary (nil finaliza la lista de objetos): 


  • NSDictionary *coleccion = [[NSDictionary alloc] initWithObjectsAndKeys:@"objecto 1", @"key 1", @574, @"key 2", @"objeto 3", @"Key 3", nil];
  • NSDictionary *coleccion = @{@"objecto 1": @"key 1", @574: @"key 2", @"objeto 3": @"Key 3"};
Para acceder al objeto 2:


 [coleccion objectForKey:@"key 2"];
 coleccion[@"key 2"];


NSMutableDictionary: colección de objetos accesibles mediante una clave. Son colecciones objeto/clave. Puede ser modificado después de su inicialización.


  • NSMutableDictionary *coleccion = [@{@"rojo":@"color", @"peso":@84, @"tipo":@"normal" } mutableCopy];

ejemplo para recorrer una NSMutableDictionary: 

// el método keyEnumerator para obtener un objeto de tipo NSEnumeratot


NSEnumerator *clavesDelDictionary = [coleccion keyEnumerator];

id clavesEnDictionary = nil;

while ((clavesEnDictionary = [clavesDelDictionary nextObject] != nil){

  id elemento = [coleccion objectForKey:clavesEndDictionary];

  // clavesEnDictionary contiene la clave
 // elemento contiene el valor relacionado con la clave

 NSLog("clave %@ ", clavesEnDictionary);
 NSLog("valor %@ ", elemento);

}

otro ejemplo para recorrer una NSMutableDictionary: 

// utilizando enumerateKeyAndObjectsUsingBlock método del diccionario

[coleccion enumerateKeysAndObjectsUsingBlock:
^(__strong id key, __strong id obj, BOOL *stop){

 NSLog("clave %@ ", key);
 NSLog("valor %@ ", obj);

}]



NSNumber: toma un dato numérico de C y lo almacena como objeto NSNumber. Posteriormente se puede almacenar en matrices, diccionarios, etc.
Si sólo se quieren valores numéricos y no objetos utilizar NSInteger, CGFloat y double.

ejemplos crear instancias de NSNumber: 


  • NSNumber *numero = [[NSNumber allocnumberWhitInt: 100];
  • NSNumber *numeroConSigno = @-524; // con singo
  • NSNumber *numeroSinSigno = @1574; // sin singo
  • NSNumber *numeroFloat = @264.455845f; // float
  • NSNumber *numeroDouble = @264.455845458456; // double

para obtener los valores numéricos, que dejan de ser objetos:
  • NSInteger numeroNoObjetoConSigno = [numeroConSigno integerValue];
  • NSNumber  numeroNoObjetoSinSigno = [numeroSinSigno unsignedIntegerValue];
  • NSNumber  numeroNoObjetoFloat = [numeroFloat floatValue];
  • NSNumber  numeroNoObjetoDouble = [numeroDouble doubleValue];


NSDecimalNumber: una subclase de NSNumber para tratar números muy extensos.

NSDate: almacena objetos para tratar datos de tipo fecha.

ejemplos crear instancias de NSDate (en este caso contendrá la fecha actual): 


  • NSDate *numero = [[NSDate alloc] init];

NSURL: nos permite gestionar URL.