Access Instance Variables from Initializer Methods

Things to Remember

 Prefer to read data directly through instance variables internally and to write data through properties internally.

 Within initializers and dealloc, always read and write data directly through instance variables.

 Sometimes, you will need to read data through properties when that data is being lazily initialized.

You should always access the instance variables directly from within an initialization method because at the time a property is set, the rest of the object may not yet be completely initialized. Even if you don’t provide custom accessor methods or know of any side effects from within your own class, a future subclass may very well override the behaviour.

Inyección de dependencias en iOS

¿Que sucede cuando vamos al médico y te inyectan una vacuna? Pues la respuesta es sencilla, entran en tu cuerpo nuevas maneras de reaccionar ante posibles situaciones, sin que esto implique tengas que volver a nacer de nuevo.

Esto consiste el patrón de diseño Inyección de Dependencias, colocar dentro de un objeto vivo otros que puedan cambiar su comportamiento, sin que esto implique volver a crear el objeto de nuevo.

De esta manera, en tiempo de ejecución, creamos un método capaz de definir el nuevo comportamiento, asignando una instancia de objeto diferente a la que tenía hasta el momento.

Tiene dos ventajas fundamentales cuando estamos creando un producto a largo plazo.

Creamos un catálogo de piezas de software que podemos cambiar y modificar en el tiempo por otras mejores. Cuando creamos una aplicación que crecerá gracias a otros programadores está genial cuando se trata de una aplicación grande y que debe resistir a los envites del tiempo y de los programadores que la tocan, pero quizá si es más pequeña y tu vas a ser el responsable de todo, no sea tan buena opción, porque como todo en la vida, no hay nada que sume sin que reste por otro lado.

Así que con inyección de dependencias, más que poseer objetos lo que tenemos son colaboradores que se establecerán en tiempo de ejecución usando un inicializador de conveniencia o con usando el setter de una propiedad.

- (id)initWithTrafficClient:(id<TrafficClient>)trafficClient
{
    self = [super init];
    if (self) 
    {
        _trafficClient = trafficClient;
    }
    return self;
}

Podemos sustituir a un actor para que cumpla un rol, y si quieres cambiar esa implementación en el futuro, sólo tendrás que cambiar esa declaración.

Al eliminar el fuerte acoplamiento, no necesitamos comprender todos los problemas a la vez, y nos será más sencillo evolucionar el diseño de la aplicación según conozcamos los nuevos requisitos.

Las clases serán más sencillas de probar, gracias a usar mocks simples en lugar de colaboradores concretos, incluso los colaboradores reales pero configurados para nuestro escenario de pruebas específico.

Promoveremos la separación de responsabilidades mediante un claro contrato entre las clases, donde es fácil ver que clase necesita a otra para poder hacer su trabajo.Podemos pintar la arquitectura de una aplicación usando roles sencillos, y asignar a cada desarrollador  la responsabilidad de hacer la implementación sin romper la aplicación y sin impactar en el resto del equipo.

 

Como punto negativo destacar que podemos perder simplicidad en la depuración en módulos en proyectos externos ya que es preciso recompilar estos para poder modificarlos. 

Tabla periódica de tipografías en Español

Tabla periódica de tipografías en Español

Tabla periódica de tipografías

// Listing all fonts on iOS 7 sdk

NSArray * familyNames = [[NSArray alloc] initWithArray:[UIFont familyNames]];
// Iterating over the array familyNames
[familyNames enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

NSLog(@”Family %i: %@ “,idx+1, obj);

NSArray * fontNames = [[NSArray alloc] initWithArray:[UIFont fontNamesForFamilyName:[familyNames objectAtIndex:idx]]];

// Iterating over the array fontNames
[fontNames enumerateObjectsUsingBlock:^(id obj, NSUInteger inxFont, BOOL *stop) {
NSLog(@” Font name : %@”, [fontNames objectAtIndex:inxFont]);
UIFont *sampleFont = [UIFont fontWithName:[fontNames objectAtIndex:inxFont] size:14.0]; }];

}];
Continúa leyendo Tabla periódica de tipografías en Español

Rápida guía de referencia de resoluciones de pantalla en iOS

DISPOSITIVO iPhone iPhone Retina iPhone 5 iPad iPad Retina
DISPOSITIVO iPhone 1g-3GS
iPod Touch 1g-3g
iPhone 4
iPhone 4S
iPod Touch 4g
iPhone 5
iPod Touch 5g
iPad
iPad 2
iPad Mini
The New iPad
Resolución 480 x 320 960 x 640 1136 x 640 1024 x 768 2048 x 1536
Nombre fichero file.png or
file~iphone.png
file@2x.png or
file@2x~iphone.png
file-568h@2x~iphone.png file~ipad.png file@2x~ipad.png
 

Table View con dos secciones

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 2;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (section == 0)
    {
        return 1;
    }
    else {
        return self.googleAnswersArray.count;
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    UITableViewCell * cell;
    if (indexPath.section == 0) {
        
        cell = [self.tableView dequeueReusableCellWithIdentifier: @"userQuestionCell"];
        
        [self configureUserQuestionCell:(UserQuestionCell *)cell];
        
    }
    else if (indexPath.section == 1) {
        
        cell = [self.tableView dequeueReusableCellWithIdentifier: @"googleAnswerCell"];
        GoogleAnswer *googleAnswer = [self.googleAnswersArray objectAtIndex:indexPath.row];
        [self configureCell:(GoogleAnswerCell *)cell forGoogleAnswer:googleAnswer];
    }
    return cell;
}

- (void)configureCell:(GoogleAnswerCell *)cell forGoogleAnswer:(GoogleAnswer *)googleAnswer {
    
   // cell.textLabel.text = [[managedObject valueForKey:@"title"] description];
    
    cell.titleLabel.text = googleAnswer.title;
    cell.snippetLabel.text = googleAnswer.snippet;

    
    cell.linkToOpenURL =[NSURL URLWithString:googleAnswer.link];
    
}

- (void) configureUserQuestionCell:(UserQuestionCell *)cell
{
    if (editingModeFlag)
    {
        cell.userQuestionTextField.text = _userQuestion;
    }
    else {
        if ([_userQuestion length]>0)
        {
//            cell.userQuestionTextField.text = _userQuestion;
               cell.userQuestionTextField.text  = [NSString stringWithFormat:@"%@\n\nPulse Para Editar",_userQuestion];
            

        }
        else {
            cell.userQuestionTextField.text = @"Pregúntaselo a Susan";
        }
    }
    cell.userQuestionTextField.delegate = self;
}


Personalización de celdas con storyboard

Personalización de la celda.

En el Inspector de atributos de XCode, configuramos el comportamiento:

1.- Queremos personalizar nuestra celda, indicamos Style es Custom.

2.- En identifier, la clase que mapea el comportamiento de la celda.

3.- En accesory, Disclosure Indicator, que corresponde a la flecha >

Como no nos interesa que sea editable, indicamos que la acción es de no edición.

CellView Setting with Storyboard

Ahora tenemos que gestionar la llamada desde el Controlador hacia el nuevo view controller.

Como necesitamos pasarle los parámetros de la celda seleccionada por el usuario, debemos preparar el destino del segué con el parámetro que deseamos que trabaje. El parámetro en este caso es la respuesta de google que se deberá mostrar en el View Controller destino.

]
// Asking the tableView for the <strong>IndexPathForCell</strong>, which returns an index path representing the row and section of a given table-view cell.
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    if ([sender isKindOfClass:[GoogleAnswerCell class]])
    {
        // Setting de destination View Controller
        DetailedAnswerViewController * detailedAnswerViewController = segue.destinationViewController;

        NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
        detailedAnswerViewController.googleAnswerToShow = [self.googleAnswersArray objectAtIndex:indexPath.row];
    }
}

Un plan diferente, aprende a hacer jabones con tus manos

¿Mis planes para el finde? Pues es un plan divertido, mañana voy a pasa el día en familia a la sierra de Madrid haciendo cosas diferentes con una escuela rural  llamada Espíritu del Bosque.

Además de pasar un día fresquito y refrescante voy a aprender a realizar de forma natural jabón, gel y champú. Es algo que me llama mucho la atención y que voy a tener la oportunidad de aprender.

El jabón generalmente es el resultado de la reacción química entre un álcali (generalmente hidróxido de sodio o de potasio) y algún ácido graso; esta reacción se denomina saponificación, aunquel las ranas y sapos no tienen nada que ver.

El ácido graso puede ser de origen vegetal o animal, por ejemplo, manteca de cerdo o aceite de coco.

Imagen

Si te pica la curiosidad puedes verlo en su canal de videos en youtube

http://www.youtube.com/user/elespiritudelbosque1?feature=mhee 

FACEBOOK:https://www.facebook.com/elespiritudelbosque También os dejo el contacto por si alguien le apetece ir: www.espiritubosque.es 918908781 / 616552735