martes, 16 de junio de 2015

Relación entre KVC y KVO (Key-Value Coding / Key-Value Object). Relationship between KVC and KVO (Key-Value Coding / Key-Value Object).

//
//  ViewController.m
//  DemoKVC
//  Relación entre KVC y KVO
//  Created by eduardo fulgencio on 16/6/15.
//  Copyright (c) 2015 eduardo fulgencio. All rights reserved.
//

// Al final de la página está la definición de la clase Deposito

#import "ViewController.h"
#import "Deposito.h"

@interface ViewController ()
// Declaramos dos objetos de tipo Deposito
@property (nonatomic, strong) Deposito *depositoAgua;
@property (nonatomic, strong) Deposito *depositoLeche;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.depositoAgua = [[Deposito alloc] init];
    self.depositoLeche = [[Deposito alloc] init];
    
}

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:NO];
    
    // Asignamos nombre y litros a DepositoAgua
    self.depositoAgua.tipo = @"Agua";
    self.depositoAgua.litros = 10;
    // Asignamos nombre y litros a DepositoLeche
    self.depositoLeche.tipo = @"Leche";
    self.depositoLeche.litros = 5;
    
    // Utilización de KVC Key-Value Coding para generar el mismo valor anterior
    
    [self.depositoAgua setValue:@"Agua" forKey:@"tipo"];
    [self.depositoAgua setValue:[NSNumber numberWithInteger:10] forKey:@"litros"];

     // Relacion KVC y KVO ( Key-Value Observing )
    [self.depositoAgua addObserver:self forKeyPath:@"litros" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
  
    // Aumentamos en 1 litro los litros del deposito agua
    [self.depositoAgua setValue:[NSNumber numberWithInteger:11] forKey:@"litros"];
}


// En cuanto se produza un cambio en los litros del depósito de agua
// este método será llamado
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    
    if ([keyPath isEqualToString:@"litros"]) {
        NSLog(@"La cantidad de litros ha cambiado.");
        NSLog(@"%@ : ", change);
    }
    
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end



// ESTA ES LA DEFINICION DE LA CLASE DEPOSITO

/* Clase deposito 

 #import <Foundation/Foundation.h>

 @interface Deposito : NSObject

 @property (nonatomic, strong) NSString *tipo;

 @property (nonatomic) NSUInteger litros;


 @end

 #import "Deposito.h"

 @implementation Deposito

 - (instancetype)init
 {
 self = [super init];
 if (self) {
 self.tipo = @"";
 self.litros = 0;
 }
 return self;
 }

 @end

 */

jueves, 11 de junio de 2015

CGContextSetShadowWithColor dibujar sobra a un Rectángulo. CGContextSetShadowWithColor to draw a rectangle.

/*
 En un UIView asignado 
 @interface TrianguloSombraView : UIView

*/

// En el método drawRect llamamos a dibujarRectanguloConSombra
- (void)drawRect:(CGRect)rect{
    [self dibujarRectanguloConSombra];
}


- (void) dibujarRectanguloConSombra{
  

  CGContextRef currentContext = UIGraphicsGetCurrentContext();
  CGContextSaveGState(currentContext);
    
  // Sombra a aplicar al rectángulo
  CGContextSetShadowWithColor(currentContext, CGSizeMake(15.0f, 15.0f), 12.0f,[[UIColor redColor] CGColor]);
  

  CGMutablePathRef mutablePathRef = CGPathCreateMutable();

  CGRect rectangulo = CGRectMake(55.0f, 60.0f, 150.0f,150.0f);
  
  // Añadidmos el rectángulo al path
  CGPathAddRect(mutablePathRef,  NULL, rectangulo);
  
  CGContextAddPath(currentContext, mutablePathRef);
  
  // Color de rellon para el rectángulo
  [[UIColor colorWithRed:0.20f green:0.60f  blue:0.80f  alpha:1.0f] setFill];
  
  CGContextDrawPath(currentContext,  kCGPathFill);
  
  CGPathRelease(mutablePathRef);
  
  CGContextRestoreGState(currentContext);
  
}

miércoles, 10 de junio de 2015

Creación de un Block Object para centralizar acciones. Creating a Block Object to centralize actions.

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController


- (void)viewDidLoad {
    
    [super viewDidLoad];
    // Llamada al bloque definido
    [self testMetodoMultiplicaPorMil];
    
}

- (void) testMetodoMultiplicaPorMil{
    
    NSString *testBloqueIntToString = multiplicaPorMil(135);
    NSLog(@" Resultado de 135 * 1000  %@", testBloqueIntToString);
    
}

NSString* (^multiplicaPorMil)(NSUInteger) = ^(NSUInteger parametroIn){
    
    NSString *result = [NSString stringWithFormat:@"%lu",(unsigned long)parametroIn * 1000];
    
    return result;
    
};




@end

Añadir una UIButton a una celda UITableViewCell. Adding a UIButton to a cell UITableViewCell.


// En cellForRowAtIndexPath
// de la tableView que mostramos
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
  
  UITableViewCell* result = nil;
  
  static NSString *cellIden = @"cellRow";
  
  result = [tableView dequeueReusableCellWithIdentifier:cellIden];
  
  if (result == nil){
    result = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIden];
  }
  
    result.textLabel.text = @"Contenido de la celda";
  
    // Añadiremos un botón para indicar si pulsa accederá a más información
    
    UIButton *btnInformacion = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    
    btnInformacion.frame = CGRectMake(0.0f, 0.0f, 30.0f, 30.0f);
    btnInformacion.layer.cornerRadius = 10.0f;
    btnInformacion.layer.borderColor = [[UIColor redColor] CGColor];
    btnInformacion.layer.borderWidth = 1.0f;
    [btnInformacion setTitle:@"i" forState:UIControlStateNormal];
    [btnInformacion addTarget:self action:@selector(ejecutarSel:) forControlEvents:UIControlEventTouchUpInside];
    
    result.accessoryView = btnInformacion;
    
    return result;
    
}

- (void) ejecutarSel:(UIButton *)paramSender{
    
    UITableViewCell *perteneceCell = (UITableViewCell*)paramSender.superview;
    
    if (perteneceCell != nil){
        
        // En este caso tratamos el evento de un botón perteneciente a una celda
    }
    

}