Archivo de autor

iPhone: Create Singleton instance

A continuación veremos como crear una clase singleton en objective-c.

Un singleton es una clase con una única instancia. Puede servirnos para guardar variables globales de la aplicación.

MySingletonInstance.h

#import <Foundation/Foundation.h>
@interface MySingletonInstance : NSObject{
}
@property (nonatomic,retain) NSString *myString;
@property (nonatomic,retain) NSMutableArray *myArray;
+ (MySingletonInstance *) instance;
@end

MySingletonInstance.m

#import "MySharedSingleton.h"
@implementation MySharedSingleton
@synthesize myArray, myString;

static MySingletonInstance *sharedSingletonInstance = nil;

+ (FilterParams *) instance {
    @synchronized(self) {
        if(sharedSingletonInstance == nil) sharedSingletonInstance = [[self alloc] init];
    }
    return sharedSingletonInstance;
}

+ (id)allocWithZone:(NSZone *)zone {
    @synchronized(self) {
        if(sharedSingletonInstance == nil) {
            sharedSingletonInstance = [super allocWithZone:zone];
            return sharedSingletonInstance;
        }
    }
    return nil;
}

- (id) copyWithZone:(NSZone *)zone {
    return self;
}

- (id) retain {
    return self;
}

- (unsigned) retainCount {
    return UINT_MAX;
}

- (void) dealloc {
    [super dealloc];
    [myArray release];
    [myString release];
}

- (id) autorelease {
    return self;
}

Como llamar al singleton desde otra clase

MySingletonInstance *msi = [MySingletonInstance instance];
msi.myArray = self.myOtherArray;
msi.myString = self.myOtherString;

Android: ScreenShot / ScreenCapture Code

Con estas líneas podemos hacer una captura de pantalla de nuestra aplicación Android. En este ejemplo la captura se guarda en la sdCard.

Del codigo, hay que tener en cuenta que se hace la captura de un View (viewToBeCaptured), que le tenemos que asignar el layout que queramos capturar.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package com.ideaknow.proves;
 
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
 
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
 
public class ScreenCaptureActivity extends Activity {
    private View viewToBeCaptured;
    private Button button;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        button = (Button) findViewById(R.id.button1);
 
        viewToBeCaptured = this.findViewById(R.id.mainView);
        viewToBeCaptured.setDrawingCacheEnabled(true);
        viewToBeCaptured.buildDrawingCache();
 
        button.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View arg0) {
                Log.v("Saved", "Save screenshot?");
                saveFile();
            }
        });
    }
 
    public void saveFile(){
        Bitmap b = viewToBeCaptured.getDrawingCache();
        File sd = Environment.getExternalStorageDirectory();
        File f = new File(sd, "captureAndroid.png");
        try {
            if (sd.canWrite()) {
                Log.v("Saved", "Screenshot saved");
                f.createNewFile();
                OutputStream os = new FileOutputStream(f);
                b.compress(Bitmap.CompressFormat.PNG, 90, os);
                os.close();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        viewToBeCaptured.setDrawingCacheEnabled(false);
    }
}
package com.ideaknow.proves;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class ScreenCaptureActivity extends Activity {
	private View viewToBeCaptured;
	private Button button;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		button = (Button) findViewById(R.id.button1);

		viewToBeCaptured = this.findViewById(R.id.mainView);
		viewToBeCaptured.setDrawingCacheEnabled(true);
		viewToBeCaptured.buildDrawingCache();

		button.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View arg0) {
				Log.v("Saved", "Save screenshot?");
				saveFile();
			}
		});
	}

	public void saveFile(){
		Bitmap b = viewToBeCaptured.getDrawingCache();
		File sd = Environment.getExternalStorageDirectory();
		File f = new File(sd, "captureAndroid.png");
		try {
			if (sd.canWrite()) {
				Log.v("Saved", "Screenshot saved");
				f.createNewFile();
				OutputStream os = new FileOutputStream(f);
				b.compress(Bitmap.CompressFormat.PNG, 90, os);
				os.close();
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		viewToBeCaptured.setDrawingCacheEnabled(false);
	}
}

Android: Configure ADB in MAC

Para configurar el adb del sdk de android debemos configurar el path a la instalación de nuestro sdk.

Para hacerlo, debemos abrir un terminal de mac y escribir lo siguiente:

export ANDROID_SDK=/carpeta donde tenemos descargado nuestro sdk/android-sdk-mac_86
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SDK}/platform-tools

Una vez echo esto, ya podemos escribir en el terminal adb y el comando deseado (por ejemplo adb logcat).

Hasta aquí hemos configurado el adb, pero para no tener que hacer esto cada vez que encendamos nuestro mac, podemos poner estas dos líneas en el archivo .bash_profile, de esta manera se quedará guardado para un futuro.

Para hacerlo escribimos en un terminal:

nano ~/.bash_profile

Y pegamos las dos líneas que hemos escrito anteriormente.

Android: Create AlertDialog with custom layout

A continuación veremos como crear un AlertDialog personalizado, añandiéndole nuestro propio layout como view.

A continuación el layout que hemos usado:

iPhone: Check if string contains a substring

Para saber si una cadena contiene otra cadena o substring, sólo debemos usar la siguiente función:

Android: Locale. Get current language

Para detectar el idioma que tiene predefinido un móvil, debemos usar la siguiente línea de código:

Android: Intent with parameters

Cuando desarrollas en Android es muy frecuente usar Intents, para no decir imprescindible. Un intent es una clase que permite especificar una activity a ejecutar.

Algunas veces podemos necesitar pasar parámetros a este intent, y leerlos en la clase de la actividad final.

Para crear un intent y lanzar una actividad debemos hacer:

Si queremos pasarle parámetros, debemos crear un objeto Bundle y asignarselo al intent.
Un Bundle sirve para contener tipos primitivos y objetos de otras clases. Con esta clase podemos pasar datos entre distintas activities.

Hasta aquí ya sabemos como pasar variables. Para leerlas, en la actividad lanzada por el intent, en nuestro caso MiActividad.class, debemos hacer lo siguiente:

iPhone: show UIAlertView

Esta función nos muestra un alert view.


Para usarla debemos pasarle un titulo y un mensaje.


Si queremos capturar el click de los botones, debemos agregar nuestro delegate a la clase y crear la siguiente función:
El delegate:

La función:

iPhone: Open url

Sentencias sencillas pero muy útiles.

Abrir una url en safari:

Abrir google maps en una dirección:

Abrir Mail:

Realizar llamada:

Escribir sms:

iPhone: Embed Youtube Video

Gracias a esta función que podemos ver más abajo, podemos insertar un vídeo de youtube en nuestra aplicación. Lo único que necesitamos es pasarle la url del vídeo en cuestión, y el frame dónde queremos que se coloque.

Aquí tenemos la función:

Y aquí un ejemplo de llamada: