Nonatomic y Atomic en Objetive-C

 Este post va dedicado a todos aquellos como yo, los cuales estamos familiarizandonos con iOS y nos cuesta un poquito entender las claúsulas atomic y nonatomic.




ATOMIC VS NONATOMIC

Vamos a entrar en el supuesto de que hacemos una clase clientes :

Clientes.h

#import 
@interface Clientes{
    NSString *id;
    NSString *nombre;
    NSString *direccion;
    
}

Clientes.m

#import "Clientes.h"
@implementation Clientes
-(id) init
{
    if( (self=[super init])) {
        //Inicialización
    }
    return self;
}
-(NSString*) getid{
    return id;
}
-(void) setid:(NSString*) nuevoId{
    id = nuevoId;
}
//... Y así PARA CADA PROPIEDAD
 
@end



Entonces perdemos mucho tiempo implementando getters y setters con cada atributo de la clase, de todas maneras no hace falta hacerlo así, la clase ya sabe que esas propiedades(getters y setters) las tienen los atributos por defecto, en consecuencia al asignar la variable como a continuación, será suficiente.
Veamos como queda el archivo Clientes.h :


@interface Clientes{
    @property (nonatomic) NSString* *id;
    @property (nonatomic) NSString* *nombre;
    @property (nonatomic) NSString* *direccion;
    
}

Y en el Clientes.m para usar el Get y Set

@interface Clientes{
        self.nombre = @"Arturo" ; // Setnombre
        int miedad = self.direccion; // getdireccion
}


Diferencia entre atomic y nonatomic 

Mediante la propiedad atomic hace que los metodos GET y SET sean "Safe-Thread", es decir que pone un semaforo a cada método para que no se pueda llamar al SET desde 2 hilos diferentes.
Si tus metodos GET y SET sólo dan y devuelven el atributo no es necesario ese control de Threads porque no va a dar errores, entonces en este caso, se usa nonatomic





iOS : Ejercicio 7. Creando Table View I

Blog >Lista ejercicios >  Ejercicio 7


Hola developer, hoy en este ejercicio vamos a aprender a usar el UITableContoller, por un lado vamos a ver una lista de elementos y por otro sus detalles.




Ejercicio 7 : Aprendiendo a hacer una tabla de contenidos mediante UITableView

Creamos un proyecto nuevo : file - new - proyect - Simple View Application. Como todos los tutoriales nos centramos sólo en iPhone.

Para comenzar agregamos un objeto Table View y conectamos el dataSource y el delegate al controlador



Ahora abriremos el ViewController.h y añadimos la conexion de la tabla y las propiedades UITableViewDelegate y UITableViewDataSource, además del array que contendrá los datos.


@interface ViewController : UIViewController {
 IBOutlet UITableView *tabla;
 NSMutableArray *items;
}
@end


Asignamos ahora la conexion de la table mediante IBOutlet a la tabla en el StroyBoard




Bien, ahora iremos al código del ViewController.m para inicializar el array en el metodo viewDidLoad, y pasamos a implementar los métodos principales para cumplir con el UITableViewDelegate y mostrar los datos.


 #import "ViewController.h"


@interface ViewController ()


@end

@implementation ViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
    items = [NSMutableArray arrayWithObjects:@"Item 0",@"Item 1",@"Item 2",@"Item 3",@"Item 4",@"Item 5",@"Item 6",@"Item 7",@"Item 8",@"Item 9",@"Item 10",@"Item 11",@"Item 12",@"Item 13",@"Item 14",nil];

}

//METODO NECESARIO PARA DEVOLVER EL NÚMERO DE SECCIONES DE LA TABLA
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 1;
}

//METODO NECESARIO PARA MOSTRAR EL NUMERO DE FILAS DE LA TABLA

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return [items count];
}
//METODO QUE INTRODUCE LOS VALORES DEL ARRAY EN LAS CELDAS
-(UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    //RECUPERAMOS ARRAY SEGUN LA POSICION DE LA FILA
    NSString *fila = [items objectAtIndex:indexPath.row];
    //CREAMOS LA CELDA
    UITableViewCell *celda =[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
    //COPIAMOS LA VARIABLE DEL ARRAY EN LA FILA
    celda.textLabel.text=fila;
    //DEVOLVEMOS LA CELDA
    return celda;
}
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end


Y por último implementamos el método por el cual al clickar en cualquier item realiza una acción

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
   // En este método haremos lo que creamos oportuno. Por lo general pasaremos a una vista detalle del elemento seleccionado. Haciendo uso de  UINavigationController que se puede ver en el correspondiente tutorial.
   NSString *dato = [datos objectAtIndex:indexPath.row];
 
   UIAlertView *alerta = [[UIAlertView alloc]
    initWithTitle:[NSString stringWithFormat:@"Has pulsado la fila %d",indexPath.row]
    message:[NSString stringWithFormat:@"¡No te olvides de visitar ThebestAndroide!"]
    delegate:nil
    cancelButtonTitle:@"Aceptar"
    otherButtonTitles:nil, nil];
  [alerta show];
}

Y este es el resultado :







Compartir Compartir Compartir Compartir




Thebestandroide Indice Thebestandroide Ejercicio anterior Thebestandroide Siguiente ejercicio

Mensajes y tipos de datos de Objetive-C para iOS

Los mensajes y los datos se relacionan de una forma especial con los objetos en Objetive-C




Tipos de datos y mensajes

  •  Mensajes 
Los objetos son muy autónomos comportándose como contenedores activos de estados y comportamientos. Cualquier mensaje puede ser pasado a cualquier objeto, un mensaje es una solicitud para desarrollar una acción en particular.
Las expresiones de mesajes en Objetive-C se encierran entre [ ].
Las expresiones tienen varias partes
  • El objeto al que se le envia : RECEPTOR
  • Cada objeto tiene un NOMBRE
  • Opcionalmente pueden tener PARÁMETROS




  • Datos
DATOS PRIMITIVOS : Ni se tiene que reservar memoria ni se tienen que inicializar.
  • int : número entero positivo o negativo.
  • unsigned :  entero positivo.
    • double :  número con punto flotante (decimal).
    • char : Carácter
    • Bool :  Booleano

    OBJETOS BÁSICOS : Se usa alloc para reservarles memoria, e init para inicializarlos.
    • NSObject : Tipo básico del cual todos heredan.
    • NSString : Cadena de caracteres.
    • NSInteger : Números enteros.
    • NSArray :  Colección de elementos de tamaño fijo.
    • NSMutableArray : Colección de elementos de tamaño variable.
    • NSDictionary :  Colección de pares de elementos clave-valor, de tamaño fijo.
    • NSMutableDictionary : Colección de de pares de elementos clave-valor, de tamaño variable.
    • NSSet : Colección de datos únicos sin orden alguno.
    • NSData : Datos binarios.
    • Id :  Este dato puede apuntar a cualquier tipo de objeto.

    OTROS TIPOS DE DATOS
    • NSUrl : Objeto tipo URL.
    • NSNumber : Almacena tipos numéricos como objetos.
    • NSDate :  Inicializa un objeto tipo fecha y hora actual, para darla formato o convertirla a cadena, se usa NSDataformatter.


    OBJETOS
     En Objetive-C sólo podemos referirnos a los objetos mediante putneros. (int *variable)
    @interface NOMBRECLASE : NOMBRECLASEPADRE
    @interface Clientes:NSObject{
    int id;
    NSString nombre;
    NSString direccion;
    }@end


    FUNCIONES O MÉTODOS
    Usan la palabra self para referirse a la propia instancia del objeto y la palabra super para la clase de la que hereda. Los métodos que empiezan por - son métodos de instancia, mientras que los que empiezan por + son métodos de clase. Estos se pueden llamar igual sin que se produzcan errores.
     [ object metodoConEntrada : entrada ];
    Salida = [object metodoConSalida ];
    Salida = [object metodoConEntradaSalida : entrada ];
     Y se declaran así
     TIPO IDENTIFICACION(-/+) (TIPO RETORNO) insertObject:(id) onObject NOMBREMETODO :(TIPO PARAMETRO) NOMBREPARAMETRO
    -(void)insrtObject:(id) onObject NOMBREMETODO : (NSUInteger) parámetro1


    Snippets en XCode

    Snippets



    Cualquier programador que trabaje con IDE debe dedicar un tiempo a aprender para que valen todas las opciones que aparecen en tu id.

    A veces ciertas opciones ni las tocas porque no quieres o por desconocimiento, pero la realidad que una vez sabiendo como se usan, seguramente te ahorren tiempo y esfuerzo a la hora de programar.Este caso es el de los Snippets.

    Entre las virtudes que tiene XCode para el auto-completar código, podemos llegar a Code Snippet Library, se puede encontrar en la parte de abajo a la derecha de vuestra herramienta XCode. De entre los 4 iconos que te aparecen, pulsa el de las llaves.





    Un Snippet es una porción de código guardado con un nombre, y con un simple click nos introduce el código sin errores en el bloque que elijamos de nuestras clases.

    Además de traer la opción edit para retocar el código según nuestro gusto.

    ¿Como creamos un Snippet?

    Por ejemplo tenemos un código que usamos a menudo y nos interesa mucho guardarle, entonces arrastramos el código hasta el  code snippet library  y los campos que vayamos a modificar según se usen para una cosa u otra, es decir para casos particulares, los sustituimos por <# algo #>








    En el ejemplo anterior, vemos como guardando una declaración de array, sustituyendo el nombre del array por <# nombreArray #> después, al insertar de nuevo ese codigo, nombreArray se sustituirá automáticamente por el nombre que deseemos darle.

    Importar los fragmentos de código

    Hay varias páginas, aquí pongo varias de ellas

    En estas páginas descargamos los .zip y metemos todos los ficheros en la carpeta de finder ~/Library/Developer/Xcode/UserData/CodeSnippets.

    Ahora ya podemos explotar un poquito más las funcionalidades de nuestro XCode.


    iOS : Ejercicio 5. Arquitectura Tab Bar Application (Tabbed Application)

    Blog >Lista ejercicios >  Ejercicio 5


    Hola developers, ya nos metemos con la arquitectura MultiView, ahora crearemos una aplicación con pestañas.




    EJERCICIO 5 : Aplicación con arquitectura Tabbed - Application
    Comenzamos explicando un poquito esta arquitectura :

    Estas plantillas permiten desarrollar una aplicación que se basa en unas pestañas en una barra para presentar distintas vistas, cada una tendrá un contenido distinto.




    Hay un controlador de tipo Tab BarController (UITabBarController) que nos permite activar la vista deseada.

    Cada botón está asociado a una vista y podemos modificar el nombre y la imagen de cada pestaña en el inspector de atributos situado en la parte derecha.

    Por defecto se mostrarán 2 vistas por defecto, pero se pueden añadir nuevas vistas arrastrando al storyboard objetos UIViewController y asociándolos de manera conveniente.
    Cada vez que agregamos un View Controller solo nos queda realizar la conexión. (Tab Bar Controller)

    Creamos un nuevo proyecto : Create new proyect - Tabbed Application

    Esta es la apariencia de nuestro storyboard





    Bien, ahora personalizamos un poco las vistas y añadimos un par de ViewControllers al storyboard para proceder a añadir más opciones en el Tab Bar, hacemos doble click en la vista principal y abajo del View Controller donde pone Tab Bar Controller hay 3 iconos, pues bien en el amarillo clickamos con el botón derecho del ratón y lo arrastramos a las nuevas View Controllers que hemos creado y personalizado, ahi seleccionamos View Controller :




    Si queremos añadir alguna funcionalidad a las opciones que hemos agregado manualmente mediante código, tenemos que ir al proyecto - create new file - Objetive-C.class, sin marcar la opcion de generar el archivo .XIB seleccionar nombre clase, y subclass of UIViewController, movemos los dos archivos al proyecto, y en el panel de la derecha arriba en Custom Class, asociamos la clase creada con la view.


    Ahora, ¿Como modificar el icono y el nombre de los items del Tab Bar? Lo tendremos que hacer es hacer doble click en el icono e item de cada View Controller, y aparecerá el panel de abajo, simplemente arrastramos nuestras imagenes al proyecto y los referenciamos desde ahí :



    Además, si conectas mas de cinco View Controller a un Tab Bar Controller, automáticamente se crea una pestaña “More…” al momento de ejecutar la aplicación.





    Compartir Compartir Compartir Compartir




    Thebestandroide Indice Thebestandroide Ejercicio anterior Thebestandroide Siguiente ejercicio

    iOS : Ejercicio 4 Cambio de imagen ImageView click button

    Blog >Lista ejercicios >  Ejercicio 4



    Hola developers, continuamos el tutorial de ejercicios básicos con este nuevo post:



    Ejercicio 4: Cambio y gestion de ImageView además de varias propiedades de objetos.

    Comenzamos el ejercicio creando un proyecto de la forma habitual :create new proyect - view single apliccation.
    Después haciendo click en Main_iPhone.storyboard, configuramos la vista introduciendo desde el panel de los objetos un ImageView y 3 botones, de tal manera que quede así :




    A continuación vamos a ver como insertar en nuestro proyecto imágenes para poder utilizarlas como recursos, aquí tengo estas 2 imágenes con las que vamos a trabajar :




    Ahora arrastramos desde el escritorio las imágenes a la carpeta Images.xcassets, y despues en Main_iPhone.storyboard seleccionando la propiedad del ImageView que se llama image y seleccionando la primera, quedando así



    Este es el momento de hacer las conexiones, sino has visto los ejercicios anteriores es posible que no sepas hacerlas, así que abajo del post, con hacer click en el ejercicio anterior, podrás ver como se hacen. Ahora vamos al código, en el ViewControler.h declaramos las variables que debemos usar, tenemos 3 botones, osea 3 acciones y un ImageView.

    #import 
    
    @interface ViewController : UIViewController{
     //REFERENCIA A IMAGEN
        IBOutlet UIImageView *imagen;
    }
    
    //ACCIONES A BOTONES
    //BOTON1
    -(IBAction)imagenuno;
    //BOTON2
    -(IBAction)imagendos;
    //BOTON "CAMBIAR IMAGEN"
    -(IBAction)cambiarimagen;
    
    @end
    


    Bien para cualquier programador que haya programado algo, dirá que con una variable de clase, va cambiando segun se pulse en los dos botones, despues en el tercero se hace la condición y listo, como por ejemplo así


    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    NSInteger variable=0;
    @implementation ViewController
    
    -(IBAction) imagenuno{
        imagen.image= [UIImage imageNamed:@"logoSoloRuedas.png"];
     variable=0;
    }
    
    -(IBAction) imagendos{
        imagen.image=[UIImage imageNamed:@"images.png"];
     variable=1;
    }
    
    -(IBAction) cambiarimagen{
        //ACCION PRESIONAR BOTON CAMBIAR IMAGEN
     //SI LA IMAGEN ES LA 1, CABIAR A LA SEGUNDA
        if(variable==0){
       imagen.image=[UIImage imageNamed:@"logoSoloRuedas.png"];
     //SINO, CAMBIAR POR LA SEGUNDA
        }else{
             imagen.image=[UIImage imageNamed:@"images.png"];
        }
    }
    


    Pues bien, así NO FUNCIONA, esto tiene que ver con que Objetive-C NO ADMITE VARIABLES DE CLASE.


    Por lo tanto tendremos que hacerlo de cualquier otro modo, por ejemplo : 

    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    -(IBAction) imagenuno{
        imagen.image= [UIImage imageNamed:@"logoSoloRuedas.png"];
    }
    -(IBAction) imagendos{
        imagen.image=[UIImage imageNamed:@"images.png"];
    }
    -(IBAction) cambiarimagen{
        //ACCION PRESIONAR BOTON CAMBIAR IMAGEN
     //SI LA IMAGEN ES LA 1, CABIAR A LA SEGUNDA
        if(imagen.image==[UIImage imageNamed:@"logoSoloRuedas.png"]){
            imagen.image=[UIImage imageNamed:@"images.png"];
     //SINO, CAMBIAR POR LA SEGUNDA
        }else{
            imagen.image=[UIImage imageNamed:@"logoSoloRuedas.png"];
        }
    }
    Y bien, aquí está el resultado :





    Podeis descargar el código fuente de thebestandroide con sólo compartir en facebook,twitter,linkedin o suscribirte a nuestro canal RSS más abajo. 



    Compartir Compartir Compartir Compartir




    Thebestandroide Indice Thebestandroide Ejercicio anterior Thebestandroide Siguiente ejercicio

    iOS : Ejercicio 3 cambiar texto label II

    Blog >Lista ejercicios >  Ejercicio 3
    Continuamos el tutorial de iOS con el tercer ejercicio



    EJERCICIO 3 : Introducir el valor de un imputText y mostrarlo al hacer click en un Label

    A diferencia del ejercicio anterior, aquí vamos a cambiar el texto del label, de la "forma correcta" para no tener problemas de memoria a la larga, y usando de contenedor un NSSTRING.

    Creamos un nuevo proyecto en la forma habitual, create new proyect-single view application-universal.
    Ahora en el archivo de la vista, osea en Main_iPhone.storyboard arrastramos 4 objetos, 3 botones, un label y un input text de tal manera que quede así:


    Ahora vamos al viewControler.h a declarar los objetos y las acciones


    #import 
    @interface ViewController : UIViewController{
        //OBJETOS
    
        IBOutlet UILabel *label;
    
        IBOutlet UITextView *input;
    }
    
    //ACCIONES Y PROPIEDADES
    
    -(IBAction)botontextoinput;
    
    -(IBAction)botontextoinputConVariable;
    
    -(IBAction)botontextofijo;
    
    @end
    


    Y en el .m ponemos el código siguiente :
    #import "ViewController.h"
    
    @interface ViewController ()
    @end
    @implementation ViewController
    
    -(IBAction)botontextofijo{
        //TEXTO FIJO
        label.text=@"TheBestAndroide";
    }
    //boton del texto en el imput
    -(IBAction)botontextoinput{
    
        //TEXTO INPUT
        //Se recoge el valor directamente del imput
    
        label.text=input.text;
    }
    //boton del texto del input mediante variable
    
    -(IBAction)botontextoinputConVariable{
    
        //TEXTO DEL LABEL= VARIABLE STRING CON FORMATO :FORMATO ESPERADO,FORMATO QUE SE ESPERA
    
        label.text=[NSString stringWithFormat:@"%@",input.text];
    }
    @end
    

    }
    @end

    Así que ya solo nos faltan las conexiones, en el archivo Main_iPhone.storyboard, en el panel de la derecha, donde esta el circulillo con la flecha, hacerlas así :




    Label, arrastra del circulo en Referencing Outlets hasta el label, seleccionar la variable que hemos declarado en el .h con nombre label.

    InputText, arrastra del circulo en Referencing Outlets hasta el inputText

    Boton1, en sent Events, seleccionar el circulo de Touch Up Inside y arrastrarlo hasta el boton1, seleccionar botontextofijo, como la función declarada en los viewController.

    Boton2, en sent Events, seleccionar el circulo de Touch Up Inside y arrastrarlo hasta el boton2, seleccionar botontextoinput, como la función declarada en los viewController.

    Boton3, en sent Events, seleccionar el circulo de Touch Up Inside y arrastrarlo hasta el boton3, seleccionar botontextoinputConVariable, como la función declarada en los viewController.

    Una vez implementadas las conexiones, usamos el emulador para probar la aplicacion (iPhone)

    Y este es el resultado :







    Podeis descargar el código fuente de thebestandroide con sólo compartir en facebook,twitter,linkedin o suscribirte a nuestro canal RSS más abajo. 



    Compartir Compartir Compartir Compartir




    Thebestandroide Indice Thebestandroide Ejercicio anterior Thebestandroide Siguiente ejercicio