Mostrando entradas con la etiqueta developer iOS. Mostrar todas las entradas
Mostrando entradas con la etiqueta developer iOS. Mostrar todas las entradas

iOS : Ejercicio 23. Acceder al directorio Documents de nuestro iPhone


Blog >Lista ejercicios >  Ejercicio 23





Ejercicio 23 : Accediendo al directorio Documents de nuestro proyecto

Acceder al directorio de la aplicación:
El directorio de la aplicación nos permiten guardar datos en cuatro lugares distintos :

  • DOCUMENTS : Ubicación principal donde la aplicación guarda sus datos.
  • PREFERENCES : No ha sido creado para manipular directamente los archivos.
  • CACHES : Guarda temporalmente los archivos que tienen que existir cuando se abre la aplicación.
  • TMP : Se usa para guardar los archivos temporales innecesarios una vez se abre la aplicación.


Las aplicaciones son las encargadas y únicas responsables de 
limpiar el contenido de estas carpetas para que el dispositivo se encuentre optimizado.

NSSearchPathForDIrectoriesInDomains : Sirve para obtener la ruta de los directorios Caches y Documents. La función devuelve una instancia de NSArray con el listado de directorios.

NSTemporalyDirectory : Sirve para obtener la ruta de la carpeta tmp.

stringByAppendingPathComponent:@"Datos.dat" : Nos permite acceder a Datos.dat  contenido en un directorio en concreto.


CLASE NSFileManager
Sólo puede haber una instancia única durante el ciclo de vida de la aplicación. Esta es la clase que nos permite manipular los archivos contenidos en los directorios de la aplicación.

Una vez leida esta pequeña introducción, vamos a empezar con el ejercicio.Comenzamos agregando una nueva clase de Objective C que herede de NSObject,hay que destacar que si hay alguna referencia a outlets no funcionará.Además hacemos que herede de NSCoding







En el .h creamos 2 variables para almacenar los datos, una para el nombre y otra para el teléfono.
NSCoding nos obliga a usar dos métodos de instancia encodeWithCoder y initWithCoder, cada uno de estos métodos codifican y decodifican sus propiedades. Para que quede más claro es como crear una especie de "almacen".

Un objeto puede recibir estos métodos cualquier número de veces. initWithCoder instruye al objeto para inicializar a partir de datos del codificador proporcionado sustituyendo a cualquier otro método de inicialización y sólo se envía una vez al objeto.

.h
//  Datos.h
//  Documents
//
//  Created by makone moreno on 20/09/14.
//  Copyright (c) 2014 makone moreno. All rights reserved.
//
#import 
@interface Datos : NSObject 
@property (nonatomic,strong) NSString *nombre;
@property (nonatomic,strong) NSString *telefono;

@end

.m
//  Datos.m
//  Documents
//
//  Created by makone moreno on 20/09/14.
//  Copyright (c) 2014 makone moreno. All rights reserved.
//
#import "Datos.h"
@implementation Datos

@synthesize nombre;
@synthesize telefono;

//METODO PARA  INICIALIZARLAS, SUPERCLASE
-(id)initWithCoder:(NSCoder *)aDecoder{
    if (self = [super init]){
        nombre = [aDecoder decodeObjectForKey:@"nombre"];
        telefono = [aDecoder decodeObjectForKey:@"telefono"];
    }
    return self;
}

//METODO QUE SIRVE PARA CODIFICAR LAS VARIABLES DEL OBJETO
- (void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeObject:nombre forKey:@"nombre"];
    [aCoder encodeObject:telefono forKey:@"telefono"];
    
}
@end

Abrimos nuestro storyboard e insertamos un botón, creamos la conexión y creamos un NSArray para guardar los contactos del telefono.




.H

//  ViewController.h
//  Documents
//
//  Created by makone moreno on 20/09/14.
//  Copyright (c) 2014 ___FULLUSERNAME___. All rights reserved.
//

#import 
#import "Datos.h"

@interface ViewController : UIViewController
@property (strong, nonatomic)NSArray *lista;
- (IBAction)BotonGuardar:(id)sender;
@end


.M

//  ViewController.m
//  Documents
//
//  Created by makone moreno on 20/09/14.
//  Copyright (c) 2014 ___FULLUSERNAME___. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize lista;++
- (void)viewDidLoad
{
    [super viewDidLoad];
    //OBJETO PARA ALMACENAR RUTA
 NSArray *ruta= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    //RUTA DOCUMENTS
    NSString *directorioDocuments = [ruta objectAtIndex:0];
    //BUSCAMOS EL ARCHIVO DatosContacto.dat
    NSString *rutaArchivo = [directorioDocuments stringByAppendingPathComponent:@"DatosContacto.dat"];
    
    //MENSAJE PARA SABER SI EL ARCHIVO EXISTE
    if([[NSFileManager defaultManager] fileExistsAtPath:rutaArchivo]==NO){
        UIAlertView *msgError = [[UIAlertView alloc] initWithTitle:@"DatosContacto.dat no encontrado" message:@"Creandolo..." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
        
        [msgError show];
        //CONTACTO1
        Datos *d1 = [[Datos alloc]init];
        d1.nombre = @"Paca";
        d1.telefono = @"666666666";
        //CONTACTO2
        Datos *d2 = [[Datos alloc]init];
        d2.nombre = @"Eugenia";
        d2.telefono = @"777777777";
        //CONTACTO3
        Datos *d3 = [[Datos alloc]init];
        d3.nombre = @"Atapuerca";
        d3.telefono = @"888888888";
        
        lista = [NSArray arrayWithObjects:d1,d2,d3, nil];

    }else{
        //SI EL ARCHIVO EXISTE NO HAY QUE CREARLO, SIMPLEMENTE RECOGEMOS LOS CONTACTOS
        lista = [NSKeyedUnarchiver unarchiveObjectWithFile:rutaArchivo];
        //CREAMOS MENSAJE
        NSString *mensaje = [NSString stringWithFormat:@"Cargados %d objetos", [lista count]];
        //VENTANA DE AVISO
        UIAlertView *toast= [[UIAlertView alloc] initWithTitle:@"Archivo encontrado!" message:mensaje delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [toast show];
    }
}
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
- (IBAction)BotonGuardar:(id)sender {
    NSArray *ruta = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    //RUTA DOCUMENTS
    NSString *directorioDocuments = [ruta objectAtIndex:0];
    //BUSCAMOS EL ARCHIVO DatosContacto.dat
    NSString *rutaArchivo = [directorioDocuments stringByAppendingPathComponent:@"DatosContacto.dat"];
    //ALMACENAMOS EN UNA VARIABLE BOOLEANA EL RESULTADO DE SI SE HA ENCONTRADO O NO EL ARCHIVO
    BOOL result = [NSKeyedArchiver archiveRootObject:lista toFile:rutaArchivo];
    if (result == YES) {
        UIAlertView *msgError = [[UIAlertView alloc] initWithTitle:@"El archivo ya ha sido guardado" message:@"Creandolo..." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
   [msgError show];
    }else{
        UIAlertView *msgError = [[UIAlertView alloc] initWithTitle:@"Error al guardar el archivo" message:@"" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
   [msgError show];
    }
}
@end



Bien, vemos el resultado, la primera vez que se ejecuta la aplicación, no está creado el archivo, entonces :





Si pulsamos en el botón guardar, veremos esto :




Y por último, si volvemos a ejecutar la aplicación, veremos que ya se ha creado el archivo anteriormente :







Compartir Compartir Compartir Compartir 


Thebestandroide Indice Thebestandroide Ejercicio anterior Thebestandroide Siguiente ejercicio

iOS : Ejercicio 22. Twitter & Facebook en nuestro iPhone

Blog >Lista ejercicios >  Ejercicio 22




Ejercicio 22 : Poniendo botones sociales Twitter & Facebook en nuestro iPhone 
 

Configuramos cuenta twitter en emulador de XCode, sino no funcionará, también insertamos una cuenta sino, tampoco funcionará. 

Creamos un nuevo proyecto : single view application. Ahí abrimos el storyboard y añadimos dos botones, yo he insertado dos imágenes de mi blog para ponerlas de background en los botones y además dos labels :


Twitter
Desde la versión 5 de iOS, Apple incluye la integración de Twitter en el sistema operativo de los dispositivos. 

Este framework proporciona una hoja para los tweets que tendremos que usar para que las aplicaciones desarrolladas envien tweets. 

Usaremos una instancia de TWTwitterComposerViewController, que tiene una interfad de usuario que permite escribir el mensaje a enviar, así como añadir la ubicación e incluso adjuntar alguna imagen. Para verificar si se ha llevado a cabo con éxito la operción, usaremos estos métodos, que son booleanos : 

  • setInitialText
  • addImage
  • TwiaddUrl
  Y en el caso de que queramos descartar la hoja de tweets usaremos el método dismissViewControllerAnimated

Establecemos las conexiones de los dos botones y los dos labels, además importamos la libreria de Twitter :






Y este es el código para escribir un tweet en twitter, he añadido una imágen al proyecto para twittear en twitter:

 

.h

//
//  ViewController.h
//  FacebookTwitter
//
//  Copyright (c) 2014 ___FULLUSERNAME___. All rights reserved.
//

#import 
#import 
@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *labelDisponibleTwitter;
@property (weak, nonatomic) IBOutlet UILabel *labelDisponibleFacebook;
- (IBAction)botonTwitter:(id)sender;
- (IBAction)botonFacebook:(id)sender;
@end

.m
//
//  ViewController.m
//  TwitterFacebook
//
//  Created by makone moreno on 15/09/14.
//  Copyright (c) 2014 ___FULLUSERNAME___. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@end

@implementation ViewController
@synthesize labelDisponibleFacebook;
@synthesize labelDisponibleTwitter;
- (void)viewDidLoad
{
    [super viewDidLoad];
    //Si se puede enviar Tweets
    if([TWTweetComposeViewController canSendTweet]){
        labelDisponibleTwitter.text=@"Iniciando servicio";
    }else{
        labelDisponibleTwitter.text=@"No se puede iniciar el servicio";
    }
}
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
- (IBAction)botonTwitter:(id)sender {  if ([TWTweetComposeViewController canSendTweet]==NO) {
    //MENSAJE NO DISPONIBLE
    UIAlertView *mensaje=[[UIAlertView alloc]initWithTitle:@"Servicio no disponible"
                                                   message:@"No se puede realizar la conexion"
                                                  delegate:nil
                                         cancelButtonTitle:@"Ok"
                                         otherButtonTitles:nil, nil];
    [mensaje show];
    //Salimos
    return;
}
    //Sino entra en el if, carga la hoja para escribir el tweet
TWTweetComposeViewController *HOJATWEET=[[TWTweetComposeViewController alloc] init];
    //AÑADO TEXTO
    [HOJATWEET setInitialText:@"Programando en iOS"];
    //AÑADO IMAGEN
    [HOJATWEET addImage:[UIImage imageNamed:@"logo_PURO.png"]];
    //AÑADO URL
    [HOJATWEET addURL:[NSURL URLWithString:@"http//:www.thebestandroide.blogspot.com.es"]];
    [self presentViewController:HOJATWEET animated:YES completion:^{
        //CODIGO A EJECUTAR EN CUANTO SE ENVIE EL TWEET
    }];
}
- (IBAction)botonFacebook:(id)sender {

}

@end



.m

Ahora al iniciar el emulador:










Facebook
El método es muy similar al de twitter, pero en este caso no hay que añadir ningún framework, aun así hay que configurar nuevamente el emulador para que tenga una cuenta en facebook, después sólo hay que rellenar el botón correspondiente a la conexión del botón de facebook,veamos como queda :

.m
- (IBAction)botonFacebook:(id)sender {
    //Si se puede enviar post en facebook
    if([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]==NO){
        //MENSAJE NO DISPONIBLE
        UIAlertView *mensaje=[[UIAlertView alloc]initWithTitle:@"Servicio no disponible"
                                                       message:@"No se puede realizar la conexion"
                                                      delegate:nil
                                             cancelButtonTitle:@"Ok"
                                             otherButtonTitles:nil, nil];
        [mensaje show];
        //Salimos
        return;
    }
    SLComposeViewController *HOJAFACE =[SLComposeViewController composeViewControllerForServiceType:SLServiceTypeFacebook];
    //AÑADO TEXTO
    [HOJAFACE setInitialText:@"Programando en iOS"];
    //AÑADO IMAGEN
    [HOJAFACE addImage:[UIImage imageNamed:@"logo_PURO.png"]];
    //AÑADO URL
    [HOJAFACE addURL:[NSURL URLWithString:@"http//:www.thebestandroide.blogspot.com.es"]];
    [self presentViewController:HOJAFACE animated:YES completion:^{
        //codigo que se ejecuta segun se ha publicado
    }];
}








Compartir Compartir Compartir Compartir




Thebestandroide Indice Thebestandroide Ejercicio anterior Thebestandroide Siguiente ejercicio

iOS : Ejercicio 19. Reproducción .mp3 en XCode

Hola developers, continuamos con los ejercicios básicos en iOS con el numero 19.

Blog >Lista ejercicios >  Ejercicio 19




Ejercicio 19 : Reproducción audio en nuestro iPhone

Para reproducir sonidos el software de iOS nos proporciona el framework AVFoundation. Este software puede reproducir casi la mayoría de los formatos de audio, y aunque el principal es el .mp3, también puede reproducir .caf, .aiff o .wav . 

Clases del framework AVFoundation :

  • AVAudioMix : Clase que maneja los parámetros de entrada para mezclar distintas pistas de audio.
  • AVMutableAudioMix : Clase que gestiona los parámetros de entrada para mezclar el audio.
  • AVAsset : Clase abstracta que representa medios como videos o audios cronometrados.
  • AVCaptureDevice : Clase que representa un dispositivo físico de captura junto a sus propiedades asociadas.
  • AVPlayer : Clase para implementar controladores o interfaces para reproducir uno o varios sonidos.
  • AVPlayerLayer : Subclase de CALayer a la cual un objeto AVPlayer puede dirigir su salida visual.

Creamos un proyecto de la forma habitual: create new proyect - single view application 



Agregamos el framework necesario para hacer el objeto AVFoundation, así que sobre el proyecto hacemos click y en Build Phases, en la opción Link Binary With Libraries pulsando el + añadimos la libreria framework AVFoundation e importamos la libreria, seguidamente arrastramos .mp3 al proyecto.



Vamos a nuestro storyboard y agregamos 2 botones y 2 labels con sus conexiones pertinentes



Ahora tenemos que hacer una variable global de AVAudioPlayer para poder reproducir el sonido, añadimos una cancion al proyecto pulsando botón derecho sobre la carpeta del proyecto y pulsando sobre "Add files to "nombreproyecto"
 
Y este es el código para reproducir el sonido :

.h

#import 
#import 
@interface ViewController : UIViewController 
@property (nonatomic,strong) AVAudioPlayer *reproductor;
@property (weak, nonatomic) IBOutlet UILabel *nombre;
@property (weak, nonatomic) IBOutlet UILabel *duracion;
- (IBAction)play:(id)sender;
- (IBAction)Stop:(id)sender;
@end


.m

#import "ViewController.h"
@interface ViewController ()

@end

@implementation ViewController
@synthesize reproductor;
@synthesize duracion;
- (void)viewDidLoad
{
    [super viewDidLoad];
    NSError *error;
    //INSTANCIA DE LA CANCION
    NSString *ruta = [[NSBundle mainBundle] pathForResource:@"Enloquecer" ofType:@"mp3"];
    //NSLog(@"LA RUTA ES %@",ruta);
    //LO CONVERTIMOS EN URL
    NSURL *direccion = [[NSURL alloc] initFileURLWithPath:ruta];
    //Lo asociamos al reproductor
    self.reproductor = [[AVAudioPlayer alloc]initWithContentsOfURL:direccion error:&error];    
    //ES para darle balance
    //0 - Igual altavoz izquierdo que altavoz derecho
    //-1 - Solo izquierdo
    //1 - solo derecho
    self.reproductor.pan=0;
    self.reproductor.numberOfLoops=1; //NUMERO DE REPETICIONES : VALOR NEGATIVO INFINITAS VECES
    self.reproductor.volume=1;        //MANEJA VOLUMEN rango 0 - 1
    [self.reproductor prepareToPlay]; //Preparamos la reproducción
}
- (IBAction)play:(id)sender {
    [self.reproductor play];
}
- (IBAction)Stop:(id)sender {
    [self.reproductor stop];
}
@end


Bien, vamos a mostrar ahora el tiempo que queda para que acabe la canción, haremos un timer, lo que pasa que nos dará el resultado en segundos y milisegundos, además que queremos hacerlo regresivo, es decir desde el final a 0. Esto lo conseguimos restando el tiempo transcurrido al tiempo total de la canción, y aplicandole el formato correcto para que aparezcan minutos y segundos, ¿Como se hace? Así...

.m
#import "ViewController.h"

@interface ViewController ()
@end

@implementation ViewController
@synthesize reproductor;
@synthesize duracion;
NSTimer *timer ;
- (void)viewDidLoad
{
    [super viewDidLoad];
    NSError *error;
    //INSTANCIA DE LA CANCION
    NSString *ruta = [[NSBundle mainBundle] pathForResource:@"Enloquecer" ofType:@"mp3"];
    //NSLog(@"LA RUTA ES %@",ruta);
    //LO CONVERTIMOS EN URL
    NSURL *direccion = [[NSURL alloc] initFileURLWithPath:ruta];
    //Lo asociamos al reproductor
    self.reproductor = [[AVAudioPlayer alloc]initWithContentsOfURL:direccion error:&error];
    //ES para darle balance
    //0 - Igual altavoz izquierdo que altavoz derecho
    //-1 - Solo izquierdo
    //1 - solo derecho
    self.reproductor.pan=0;
    self.reproductor.numberOfLoops=1; //NUMERO DE REPETICIONES : VALOR NEGATIVO INFINITAS VECES
    self.reproductor.volume=1;        //MANEJA VOLUMEN rango 0 - 1
    [self.reproductor prepareToPlay]; //Preparamos la reproducción
    //CREAMOS TIMER PARA MOSTRAR EL TIEMPO TRANSCURRIDO
    timer = [NSTimer scheduledTimerWithTimeInterval:1.0
                              target:self
                              selector:@selector(updateTime)
                              userInfo:nil
                              repeats:YES];
    //Texto label action
    self.nombre.text = [NSString stringWithFormat:@"Cargando..."];
}
//FUNCION TIMER
-(void)updateTime{
    //DURACION CANCION - DURACION TIEMPO TRANSCURRIDO
    NSTimeInterval timeLeft = self.reproductor.duration - self.reproductor.currentTime;
    //FORMATO MINUTOS
    div_t m = div(timeLeft, 60);
    int minutos =m.quot;
    //FORMATO SEGUNDOS
    int seconds =m.rem;
    //ACTUALIZAR TIEMPO CONSTANTEMENTE
    self.duracion.text=[NSString stringWithFormat:@"%d.%d",minutos,seconds];
}
- (IBAction)play:(id)sender {
    [self.reproductor play];
    self.nombre.text = [NSString stringWithFormat:@"Reproduciendo"];
}
- (IBAction)Stop:(id)sender {
    [self.reproductor pause];
    self.nombre.text = [NSString stringWithFormat:@"Pausado"];
}
@end


Y este es el resultado...







Compartir Compartir Compartir Compartir



Thebestandroide Indice Thebestandroide Ejercicio anterior Thebestandroide Siguiente ejercicio

iOS : Ejercicio 18. Haciendo transición entre vistas

Blog >Lista ejercicios >  Ejercicio 18


Hola developers, continuamos con el tutorial de ejercicios básicos de iOS, esta vez vamos a hacer una transición entre vistas mediante Core Animation.




Ejercico 18 : Transición entre vistas mediante Core Animation 

Creamos un proyecto de la forma habitual : create new Proyect - Single View Application.



Vamos a nuestro storyboard, y ahi insertamos una View y un label, a esa View la cambiamos el color : 



Repetimos el mismo proceso, solo que ahora en el label pondremos Vista 2 y un botón :



Ahora realizamos las conexiones pertinentes :



Bien es hora de llevar a cabo el cambio de vista mediante la programación, crearemos una variable booleana, que es la que nos va a decir que vista hay puesta, y después usaremos el método UIView transitionFromView para realizar el cambio. Bien, ahora ejecutamos el proyecto :



Y al pulsar el botón : 



Pero si volvemos a pulsar el botón : 



Vemos que se ha ocultado, por ahí dicen las malas lenguas que este error se produce porque las vistas no estan cuadradas una con la otra... así que a cuadrarlo hasta que funcione (tarde 40 minutos... es lo que tiene) 



Compartir Compartir Compartir Compartir


Thebestandroide Indice Thebestandroide Ejercicio anterior Thebestandroide Siguiente ejercicio