Cómo conectar manualmente una property IBOutlet de un ViewController a un XIB o Storyboard en Objective-C

Un IBOutlet sirve para conectar un elemento visual a un elemento del controlador, en este caso, conectar un elemento de nuestro XIB o Storyboard a nuestro ViewController.

En esta ocasión, se describirá como hacerlo de forma manual y después crear la conexión, en otro post se indicará cómo hacerlo de una manera más sencilla y casi automática.

Pre requisitos:

  • Tener creado un proyecto.
  • Contar con un Storyboard o un archivo XIB con su respectivo ViewController.

Este ejemplo cuenta con un archivo XIB y un controlador llamados ViewController.

Lo primero que haremos es abrir el archivo ViewController.h y crear la siguiente propiedad:

@property (strong, nonatomic) IBOutlet UILabel *labelNombre;

Ahora iremos al archivo de la interfaz gráfica ViewController.xib y crearemos un UILabel.
jx_post_476_01
Lo siguiente será crear el conexión de la propiedad labelNombre definida en el archivo ViewController.h y el elemento UILabel agregado a la interfaz gráfica.
Para ello, presionaremos sobre File’s Owner que se encuentra en:
Placeholers -> File’s Owner
junto con la tecla Ctrl, lo cual hará que se muestre una línea azul y dirigimos hacia donde está el UILabel.
jx_post_476_02
dejamos de presionar y nos aparecerá un menú:
jx_post_476_03
Nos aparecerán todos los elementos visuales que con los que se puede relacionar, en este caso como podemos observar, se muestra el nombre de la propiedad que definimos en nuestro ViewController. Bastará con presionar sobre el nombre de nuestra propiedad para que quede hecha la conexión.
jx_post_476_04
Con eso quedará realizada la relación entre nuestro elemento visual y un objeto del controlador.

Crear un proyecto en Xcode 6 usando Xib en lugar de Storyboard con Objective-C

Para todos aquellos que como yo, les sigue gustando trabajar con archivos XIB en lugar de Storyboard en la programación de apps en iOS. Aquí presento la forma en que pueden crear un proyecto usando archivos XIB en la vista y Objective-C como lenguaje de programación, debido a que con las nuevas versiones de Xcode, sólo podemos crear proyectos con Storyboard’s por default.

Abriremos Xcode:

jx_post_421_01

 

Creamos un nuevo proyecto:

Create a new Xcode project

Ahora crearemos un Single View Application:

iOS -> Application -> Single View Application

jx_post_421_02

Presionamos en Next y en la siguiente pantalla ingresamos los datos que deseamos para nuestro proyecto, donde deberemos verificar que este seleccionado en el lenguaje de programación Objective-C.

Language: Objective-C

jx_post_421_03

Presionamos Next y la siguiente pantalla es para decidir en donde guardar el proyecto.

jx_post_421_04

Ahora sólo presionamos en Create y quedará creado nuestro proyecto.

Lo siguiente por hacer es borrar los archivos:

ViewController.h

ViewController.m

Main.storyboard

jx_post_421_05

Ahora que hemos borrado los archivos, crearemos un ViewController con su archivo XIB, para esto, seleccionamos el nombre del proyecto con la carpeta amarilla, en este ejemplo:

ProyectoXib -> ProyectoXib

jx_post_421_10

presionamos con botón derecho y en el menú presionamos en:

File -> New -> File…

jx_post_421_06

 

Aparecerá una pantalla donde seleccionamos la opción Cocoa Touch Class:

iOS -> Source Cocoa Touch Class

jx_post_421_07

Presionamos Next y se mostrará una pantalla donde nos pide los datos del ViewController a crear, en este caso le pondré el nombre ViewControllerPrincipal y hay que cerciorarse en marcar la opción Also create XIB file.

jx_post_421_08

Presionamos Next y por último se nos preguntará donde crear los archivos, aquí sólo hay que presionar en Create.

jx_post_421_09

Ya que tenemos estos archivos creados, abriremos el archivo AppDelegate.m e importamos el controlador que acabamos de crear, que en este caso es ViewControllerPrincipal, y lo colocaremos como sigue:

#import “AppDelegate.h”

#import “ViewControllerPrincipal.h”

jx_post_421_10

 

Ahora en el método:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    return YES;
}

Lo modificaremos para crear un objeto del controlador que creamos y lo asignaremos para que esta sea la pantalla que deberá de mostrarse.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.

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

ViewControllerPrincipal *viewPrincipal = [[ViewControllerPrincipal alloc] initWithNibName:@"ViewControllerPrincipal" bundle:nil];
[self.window setRootViewController:viewPrincipal];

[self.window makeKeyAndVisible];

return YES;
}

jx_post_421_11

Por último habrá que quitar dentro de la información general del proyecto que la interfaz principal sea Main. Esto se encuentra en:

Nombre del proyecto -> TARGETS -> Nombre del proyecto -> General -> Main interface

En el ejemplo que tenemos, sería:

ProyectoXib -> TARGETS -> ProyectoXib -> General -> Main interface

En Main Interface deberemos quitar Main para así permitir que la pantalla que creamos, sea la que se vea.

 

jx_post_421_12

Bastará con borrarla y ahora si podemos ejecutar nuestro proyecto y ver la interfaz XIB que creamos.

Error libz.so.1 en Android Studio y Debian/Ubuntu al abrir o ejecutar una app

Al tratar de ejecutar una app en Android Studio, éste manda el siguiente error:

appt: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory

jx_post_328_01

Este mensaje de error es presentado debido a que faltan algunas bibliotecas por instalar en nuestro GNU/Linux, para resolver este problema en plataformas basadas en Debian, bastará con ejecutar lo siguiente:

sudo apt-get install lib32z1

Con ésto, se eliminará el mensaje de error y se podrá ejecutar la app.

Error al abrir Android Device Monitor y ejecutar adb en Debian/Ubuntu

En Ubuntu de 64 bits y lanzar Android Studio y abrir el Adroid Device Monitor, manda el siguiente error:

adb: error=2, No such file or directory

jx_post_324_01

Este mensaje de error es producido, debido a que el sistema operativo es a 64 bits y requiere manejar la compatibilidad a 32 bits para que pueda ejecutar adb correctamente.

Lo que se debe instalar es lo siguiente:

sudo apt-get install libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5

Eso permitirá ejecutar adb sin problemas.

Cambiar la ruta del SDK de Android en Android Studio

Ahora que me encuentro haciendo la migración de Eclipse a Android Studio,  me encontré que al aplicar algunas actualizaciones de éste último, es necesario que el SDK de Android no se encuentre dentro de la estructura de archivos de Android Studio. Una vez que coloqué el SDK en otra parte me encontré con la duda motivo de este post. ¿Ahora donde encuentro la opción para especificar la nueva ruta del SDK al Android Studio?, pues bueno, la respuesta es sencilla, simplemente hay que seguir los siguientes pasos:

Abrir Android Studio

jx_post_316_01

y ahora ir a Configure -> Project Defaults -> Project Structure

jx_post_316_02 jx_post_316_03 jx_post_316_04 jx_post_316_05

Y justo en Android SDK Location podremos hacer el cambio que se desea.

Copiar un texto al portapaples en Android

Para realizar esta acción en Android se puede hacer de dos formas debido a que en versiones anteriores al SDK 11 se maneja una sintaxis y a partir de ésta se usa otra diferente.

SDK anterior a 11:

android.text.ClipboardManager clipboard = (android.text.ClipboardManager)this.getSystemService(CLIPBOARD_SERVICE);
clipboard.setText("Texto copiado al portapapeles");

SDK mayor o igual a 11:

ClipData clip = ClipData.newPlainText("text", "Texto copiado al portapapeles");
ClipboardManager clipboard = (ClipboardManager)this.getSystemService(CLIPBOARD_SERVICE);
clipboard.setPrimaryClip(clip);

Copiar un texto al portapaples en Windows Phone 8 con C#

En esta ocasión muestro cómo podemos copiar un texto al portapapeles en una app en Windows Phone 8, usano como lenguaje de programación C#.

La forma para hacer esto es muy sencillo, sólo falta incluir la siguiente:

Clipboard.SetText("Texto copiado al portapapeles");

La línea anterior copiará la cadena Texto copiado al portapapeles al portapapeles del dispositivo.

Cambiar la MainPage.xaml predeterminada por otra en una App Windows Phone 8

Con las primeras cosas que me he encontrado al iniciar el desarrolo de Apps en Windows Phone 8, es que se crea una page predeterminada llamada MainPage.xaml. Esta pantalla está bien, pero a mi me gusta definir el nombre de la pantalla que deseo usar de inicio así como todas las demás.

Por tal motivo, me di a la tarea de buscar la forma de hacerlo y la manera para realizarlo es muy simple.

En la siguiente pantalla se muestra un proyecto recién creado llamado EjemploBlog.

jx_post_285_01

Crearemos una nueva page llamada PruebaPage.xaml

jx_post_285_02

jx_post_285_03

Una vez creada la page que mandaremos a llamar, iremos a Solution Explorer -> Solution ‘Nombre del proyecto’ -> Nombre del proyecto -> Properties y abrir el archivo WMAppManifest.xml.

jx_post_285_04

Esto abrirá la siguiente pantalla:

jx_post_285_05

Ahora se deberá cambiar en Navigation Page el texto MainPage.xaml a PruebaPage.xaml:

jx_post_285_06

Con ésto al ejecutar nuevamente la aplicación, se podrá notar que se abrirá la nueva page.

jx_post_285_07

Acceso directo para ejecutar una App en Windows Phone 8

Últimamente tengo la costumbre de usar accesos directos (shortcuts) en los IDE’s que uso para ejecutar una App en un simulador o dispositivo para no estar yendo a la interfaz gráfica y ejecutar. En el caso de las apps de Windows Phone 8 con Visual Studio la forma que he encontrado para realizar está acción es la siguiente.

Arrancar con debugging (Start Debugging):

Presionar la tecla: F5

Arrancar sin debugging (Start Without Debugging):

Presionar las teclas: Ctrl + F5

 

Error de AdMob en Android: String types not allowed

Al iniciar la integregración de AdMob en una aplicación en Android, me encontré que al agregar la siguiente línea:

<activity android:name="com.google.ads.AdActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>

Me surgía el siguiente error:

Error: String types not allowed (at 'keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize')

Esto parte es por no seguir las indicaciones a los requerimientos jajaja, pero para poder corregirlo, habrá que abrir el archivo project.properties y cambiar el valor del target a android-13 o superior:

target=android-13

Si al guardar los cambios sigue mostrando el error, es posible que tenga que aplicar clean al proyecto. Esto es seleccionando la opción:

Project -> Clean…

Con eso se corregirá ese problema.

Ocultar el teclado virtual en Android cuando hacemos un onClick en un botón

Cuando estamos implementando una búsqueda en nuestra app en Android, muchas veces si no es que en su mayoría, colocamos un elemento EditView para introducir la palabra a buscar y un Button o ImageButton para presionar y comenzar la búsqueda ya sea a través de un Web Service o en una base de datos local de la palabra ingresada.

Por ende cuando ingresamos la palabra es porque se muestra el teclado virtual de nuestro dispositivo, pero cuando presionamos el botón de búsqueda no se oculta el teclado. Pues para hacer eso, vamos a simular lo siguiente.

Vamos a suponer que tenemos dos atributos:

protected EditText editTextBuscar;

protected ImageButton imageButtonBuscar;

Ahora en el listener del botón vamos a colocar las instrucciones para ocultar el teclado virtual.

imageButtonBuscar.setOnClickListener(new OnClickListener() {

    public void onClick(View v) {
        InputMethodManager inputMethodManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);

        inputMethodManager.hideSoftInputFromWindow(editTextBuscar.getWindowToken(), 0);
    }
});

Con esto al presionar el botón el teclado se ocultará.

Error de Android en Eclipse: Failed to install apk on device timeout

Desarrollando una aplicación (app) en Android, me surgió el siguiente error:

Failed to install MiApp.apk on device ‘30344C3XXXXX’: timeout

Este error me ha surgido al conectar mi dispositivo a la computadora y correr la app en dicho dispositivo. Por tal motivo, me puse a investigar la forma de resolverlo y encontré la siguiente solución.

Lo que deberemos hacer es cambiar el valor de Timeout de 5000 a 10000:

En Linux y Windows

Window -> Preferences -> Android -> DDMS -> ADB connection timeout (ms)

En Mac OS X

Eclipse -> Preferences -> Android -> DDMS -> ADB connection timeout (ms)

Con esto pude ejecutar la app en mi dispositivo conectado a la computadora.

Iniciar un temporizador con NSTimer en iOS

Este es un ejemplo muy sencillo de cómo podemos hacer un contador usando NSTimer.

Lo que haremos es imprimir cada segundo un número consecutivo y lo primero a realizar es crear 2 propiedades de la siguiente manera:

@property (strong, nonatomic) NSTimer *temporizador;

@property (nonatomic) NSInteger contador;

Ahora en donde quiera lanzarse el comienzo del contador se deberá poner la siguiente instrucción:

self.temporizador = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(contar) userInfo:nil repeats:YES];

Por último se colocará un método llamado contar el cual irá imprimiendo el número consecutivo:

– (void)contar {

NSLog(@”Contando: %i”,self.contador);

self.contador++;

}

Eso es todo para empezar un temporizador.

 

Reproduciendo sonidos en nuestra app usando AudioToolbox

En esta ocasión voy a ver cómo se puede reproducir un archivo de sonido usando el framework AudioToolbox, esto es muy útil cuando queremos reproducir archivos con algunos efectos de audio al presionar un botón o realizar cierta acción.

Para iniciar deberemos agregar el framework AudioToolbox.framework, como se indica en la image y presionamos el signo “+”.

jx_post_198_01

Presionamos el botón “Add” y se agregará el framework.

jx_post_198_02

Hecho lo anterior, podemos agregar a nuestro proyecto, un archivo de sonido, para ejemplificar, aquí se usará un archivo en formato .mp3.

Presionamos con el botón derecho del ratón sobre una de las carpetas del proyecto como en este caso Supporting Files y elegimos la opción Add Files To “NombreProyecto”… como se puede ver en la imagen.

jx_post_198_03

Buscamos y seleccionamos el archivo que deseamos, en mi caso coloqué el archivo dentro del proyecto, por lo que sólo seleccionaré las opciones marcadas en la imagen.

jx_post_198_04

Agregado el archivo lo siguiente que haremos será agregar el código necesario. Empezaremos incluyendo en el archivo .h o .m la biblioteca necesaria:

#import <AudioToolbox/AudioToolbox.h>

Ahora donde deseemos usar la reproducción del sonido, incluiremos las siguientes líneas:

SystemSoundID SoundID;

NSString *soundFile = [[NSBundle mainBundle] pathForResource:@"sableon" ofType:@"mp3"];

AudioServicesCreateSystemSoundID((__bridge CFURLRef) [NSURL fileURLWithPath:soundFile], &SoundID);

AudioServicesPlaySystemSound(SoundID);

Se deberá cambiar el nombre del archivo en mi caso llamado sableon (sin la extensión) por el nombre de su archivo y si fuera de otra extensión deberemos cambiar donde dice mp3.

Algo importante a considerar es que deben ser sonidos pequeños, de efectos o tonos de duración corta para que sea reproducido rápidamente, de lo contrario se pueden usar otros métodos para la reproducción del audio deseado.

Con esto agregado únicamente falta probar la reproducción del sonido de acuerdo a como lo hayan implementado, ya sea en la acción como respuesta a presionar un botón, a un gesto o lo que hubiesen implementado.

Obtener medidas de la pantalla en iOS

En algunas aplicaciones que deseamos crear, es necesario obtener las dimensiones de la pantalla del dispositivo, sobre todo ahora con el iPhone 5, por lo que a veces tendremos que hacer una diferencia con las medidas de los iPhone’s anteriores y este.

Para podere obtener dichas medidas se puede agregar el siguiente código:

CGRect pantalla = [[UIScreen mainScreen] bounds];

Esta asignación nos crea un objeto con la información de la pantalla, para obtener el width o height de la pantalla sólo tenemos que hacer referencia a los atributos de pantalla:

pantalla.size.height

o

pantalla.size.width

Con esto obtendremos las dimensiones de nuestros dispositivos con iOS.

Cerrar una pantalla abierta con el método presentModalViewController

En el post Abrir una nueva pantalla usando presentModalViewController mostré como abrir una pantalla haciendo uso del método presentModalViewController, ahora mostraré como cerrar esa ventana que abrimos.

Dentro del método que desean que cierre la ventana se deberá incluir la siguiente línea:

[self dismissModalViewControllerAnimated:YES];

Con esto se cerrará la ventana abierta.

Abrir una nueva pantalla usando presentModalViewController

Una forma de abrir otra pantalla en una aplicación en iOS, es usando el método presentModalViewController de la pantalla actual.

Lo que se debe de realizar es crear una objeto de la pantalla que se quiere abrir, en mi caso usaré una pantalla llamada JXViewController2:

JXViewController2 *view2 = [[JXViewController2 alloc] initWithNibName:@"JXViewController2" bundle:nil];

Ahora ejecutaré la acción para abrir esta pantalla:

[self presentModalViewController:view2 animated:YES];

Con esto se abrirá la ventana que deseamos.