MobileBrain http://blog.abrahambarrera.me Most recent posts at MobileBrain posterous.com Thu, 08 Mar 2012 06:41:48 -0800 Copy git repositories with all history http://blog.abrahambarrera.me/copy-git-repositories-with-all-history http://blog.abrahambarrera.me/copy-git-repositories-with-all-history

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#Origin
$ git clone <origin repo>
$ cd <origin directory>
$ git remote rm origin
$ git filter-branch --subdirectory-filter ./ -- --all
$ git add .
$ git commit
$ pwd

#Target
$ git clone <target repo>
$ cd <target directory>
$ git remote add origin-repo <origin directory>
$ git pull origin-repo master
$ git remote rm origin-repo
$ git push

"./"  may be any subdirectory to copy

 

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/1186729/perfil.png http://posterous.com/users/hesarRTNlWjpg Abraham Barrera abarrera Abraham Barrera
Wed, 18 Jan 2012 05:25:00 -0800 Add Stop SOPA ribbon http://blog.abrahambarrera.me/add-stop-sopa-ribbon http://blog.abrahambarrera.me/add-stop-sopa-ribbon

Add Stop SOPA ribbon to your website

1
2
3
4
<a style=display:scroll;position:fixed;top:0px;right:0px;
   href="http://americancensorship.org/" target="_blank">
   <img style="border:0;" src="http://2.bp.blogspot.com/-vkrUQQf0oRk/TxSYo4vMEcI/AAAAAAAABh8/_pDXwiO49pc/s1600/stop-sopa-ribbon.png" />
</a>

 

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/1186729/perfil.png http://posterous.com/users/hesarRTNlWjpg Abraham Barrera abarrera Abraham Barrera
Tue, 13 Dec 2011 07:47:00 -0800 How to reset UIWebView's zoom? http://blog.abrahambarrera.me/how-to-reset-uiwebviews-zoom http://blog.abrahambarrera.me/how-to-reset-uiwebviews-zoom

In iOS, the UIWebView component is composed of an inner UIScrollView and a web container. In older versions of iOS (4.3) the internal ScrollView is not visible, but we can access it. 

Reset the zoom is a big question especially when you want to do programmatically. In my research I concluded that the best way is as follows:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

  UIScrollView *sv = nil;

  // if iOS5 the scrollView property exists!
  if ([self.webView respondsToSelector:@selector(scrollView)])
    sv = webView.scrollView;
  else
    sv = [webView.subviews objectAtIndex:0];
  
  
  CGSize theSize = [sv contentSize];
  CGRect theFrame = [sv frame];
  CGPoint topOffset = CGPointMake(0, 0);
  CGFloat zoomScale = theFrame.size.width / theSize.width;
  
  [sv setContentOffset:topOffset animated: YES];
  [sv setZoomScale:(zoomScale) animated:YES];
  

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/1186729/perfil.png http://posterous.com/users/hesarRTNlWjpg Abraham Barrera abarrera Abraham Barrera
Wed, 20 Apr 2011 13:00:00 -0700 Show Maps on iOS (iPhone / iPad) - the right way http://blog.abrahambarrera.me/2011/04/show-maps-on-ios-iphone-ipad-right-way.html http://blog.abrahambarrera.me/2011/04/show-maps-on-ios-iphone-ipad-right-way.html Ok. yeah, Google Maps App shows maps on iOS but not only show the maps we need.  we need to:
  • Embed the map in an iOS App
  • Interact with the embedded map
  • Geolocalize on the map
  • With different maps sources
  • Offline maps
  • Cook cakes. not it is not necessary
well, we have alternatives:

MKMapKit:
Cocoa Touch Library included in iOS SDK. it provide some classes that interact with maps and geolocalization. the main class that we need is MKMapView, this class implements  the Google Maps API natively.

  • Embed: YES
  • Interaction: YES
  • Geolocalization: YES
  • Different sources: NO
  • Offline maps: NO
but google maps and MKMapKit not are the whole,


Route-Me: (https://github.com/route-me/route-me)

Is an iOS Map Library, entirely open, and works with any map source.

  • Embed: YES
  • Interaction: YES
  • Geolocalization: YES
  • Different sources: YES, Bing Maps, CloudMade, Spatial Cloud, OAM, Open Street Maps.
  • Offline maps: YES, MBTiles, DBMap
How it works?
  • You need to define a Tile Source
  • Instantiate a RMMapView (that shows the map)
  • Instantiate a RMMapContents with the source and view
  • interact with the map
This sample interact with CloudMade:

Media_http3bpblogspot_beadu

I said ¿Offline?

MBTiles:
Is an offline map source spec, allow to store map information in a SQLite database. more information at: https://github.com/mapbox/mbtiles-spec   

Route-Me and MBTiles together:

Media_http2bpblogspot_tfhgn

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/1186729/perfil.png http://posterous.com/users/hesarRTNlWjpg Abraham Barrera abarrera Abraham Barrera
Thu, 03 Feb 2011 14:58:00 -0800 Install Java 1.5 Mac OS X Snow Leopard http://blog.abrahambarrera.me/2011/02/install-java-15-mac-os-x-snow-leopard.html http://blog.abrahambarrera.me/2011/02/install-java-15-mac-os-x-snow-leopard.html
This post is only for not forget how do it.

Searching the web i found this post that helped me to install java 1.5 on Snow Leopard.

http://wiki.oneswarm.org/index.php/OS_X_10.6_Snow_Leopard

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/1186729/perfil.png http://posterous.com/users/hesarRTNlWjpg Abraham Barrera abarrera Abraham Barrera
Thu, 16 Dec 2010 17:43:00 -0800 iPhoneSim http://blog.abrahambarrera.me/2010/12/iphonesim.html http://blog.abrahambarrera.me/2010/12/iphonesim.html

Since one month ago i started to develop over Titanium Mobile to build mobile applications more quickly, easy to share, and easy to coding. But many problems occurs when you have many iOS Sdks in your system. Basically when Titanium try to launch iphone simulator, it uses an binary called "iphonesim", this binary uses the "default" SDK directory: "/Developer".  I deleted the Linker Flags at the project file to  build without the strong reference.

You can use this tool well:

Where:
simulator_path is the path on you have installed the simulator (ex: "/Developer3.1/Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks/iPhoneSimulatorRemoteClient.framework/Versions/A/")
iphonesim is the path of this binary

You can use this binary and source from https://github.com/continuum/iphonesim

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/1186729/perfil.png http://posterous.com/users/hesarRTNlWjpg Abraham Barrera abarrera Abraham Barrera
Thu, 02 Dec 2010 18:04:00 -0800 Titanium Mobile http://blog.abrahambarrera.me/2010/12/titanium-mobile.html http://blog.abrahambarrera.me/2010/12/titanium-mobile.html Titanium is a framework (Open Source Framework) to enable cross-platform development. you can develop an application that runs on Mobile devices (iOS, Android, RIM) or Desktop platforms (OSX, Windows).

The application's source is written all in Javascript, CSS and HTML5. It's Great!! because you no need learn complex languages like Objective-C or C++.

how I start? http://developer.appcelerator.com/get_started

Titanium is Extensible, You can extend the framework adding your owns modules in objective-C or Java (android). http://developer.appcelerator.com/apidoc/mobile/latest/Titanium-module

Exists a lot of documentation: http://developer.appcelerator.com/doc/reference_guides

With Titanium you can taking advantage of Native Interfaces:

Media_http2bpblogspot_iiebj

Multimedia applications:
Media_http2bpblogspot_iomjc

Mobile and Desktop
Media_http3bpblogspot_bmbfl

Javascript language

<script src="http://pastie.org/1342073.js"></script>

How is it Possible???
Titanium has a bridge, which translates the javascript code with the equivalent Objective-C - Java Code at runtime.

Media_http3bpblogspot_badsm

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/1186729/perfil.png http://posterous.com/users/hesarRTNlWjpg Abraham Barrera abarrera Abraham Barrera
Fri, 12 Nov 2010 18:33:00 -0800 Objective-C - Instrospection (part two) http://blog.abrahambarrera.me/2010/11/objective-c-instrospection-part-two.html http://blog.abrahambarrera.me/2010/11/objective-c-instrospection-part-two.html

In Objective-C an "Protocol" define the behavior of a class, like a Java Interface.

How I do check if the object implements an interface (<protocolame>?
[object conformsToProtocol:protocolname>];

Check if the object is an instance of a class <classname>
[object isKindOfClass:@"classname"];

Check if the object implements a specific method <methodname>
[object respondToSelector:@selector(methodname)];
or
[object respondToSelector:@selector(methodname:)]; //method with parameters

Invoke a method <methodname> dynamically:
[object performSelector:@selector(methodname) withObject:anyobject afterDelay:seconds]


Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/1186729/perfil.png http://posterous.com/users/hesarRTNlWjpg Abraham Barrera abarrera Abraham Barrera
Fri, 12 Nov 2010 18:14:00 -0800 Objective-C - Instrospection http://blog.abrahambarrera.me/2010/11/objective-c-instrospection.html http://blog.abrahambarrera.me/2010/11/objective-c-instrospection.html

I developed an application that consume http response in JSON format. My goal is parse this JSON response and deserialize ein domains objects or array of domain objects. But it is simple when you know the response and the correspondient domain object to utilize, however when it is not known it's very dificult.

I built an fragment of code that use instrospection and parse an xml (configuration file) that contains the "Service Location", "Name of the domain Class", the "remote field" and the "local property".

The JSON Response:

<script src="http://pastie.org/1335180.js"></script>

The XML Configuration File

<script src="http://pastie.org/1335172.js"></script>

The Domain Class Menu.m

<script src="http://pastie.org/1335165.js"></script>

The Code

<script src="http://pastie.org/1335169.js"></script>

Note:
* [serviceConfig objectForKey:@"key"] get the element at Configuration File.
* [responseBody JSONValue] get the JSON result (parsed into dictionary)

1. at the row 8 the sentence [[[NSClassFromString(outputClass) alloc] init] autorelease]; makes a instance of class (with name in outputClass string variable). This object, result, of type "id", is the domain object.

2. [result valueForKey:[output objectForKey:@"local"] get the class attribute "local", if not exist return nil.

3. The method isKindOfClass:[NSNumber class]] verify if the class of the local attribute "local" is NSNumber

4. [result setValue:[rawResult objectForKey:[output objectForKey:@"remote"]]
forKey:[output objectForKey:@"local"]]
it is the most important sentence. use the Key-Value feature of objective-C to assign dynamically a value to a Property.


Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/1186729/perfil.png http://posterous.com/users/hesarRTNlWjpg Abraham Barrera abarrera Abraham Barrera
Fri, 29 Oct 2010 12:56:00 -0700 Developer Apple iOS Fail http://blog.abrahambarrera.me/2010/10/developer-apple-ios-fail.html http://blog.abrahambarrera.me/2010/10/developer-apple-ios-fail.html

Media_httplh6ggphtcom_ghpqf
Es que no puede tener el certificado inválido :p


Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/1186729/perfil.png http://posterous.com/users/hesarRTNlWjpg Abraham Barrera abarrera Abraham Barrera
Fri, 22 Oct 2010 17:46:00 -0700 Check connection status (iOS) http://blog.abrahambarrera.me/2010/10/check-connection-status-ios.html http://blog.abrahambarrera.me/2010/10/check-connection-status-ios.html

 

This method return the internet connection status. return YES if is connected and return NO if is not connected.

you can download de sample code on: git://github.com/abrahambarrera/checkstatus.git

 


Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/1186729/perfil.png http://posterous.com/users/hesarRTNlWjpg Abraham Barrera abarrera Abraham Barrera
Tue, 12 Oct 2010 19:40:00 -0700 Checklist InApp Purchase - EN http://blog.abrahambarrera.me/2010/10/checklist-inapp-purchase-en.html http://blog.abrahambarrera.me/2010/10/checklist-inapp-purchase-en.html Checklist InApp Purchase

• your app is InApp Purchases enabled?
• do you have an InApp Purchase test account?
• the product we offer is marked as "Cleared for Sale"?
• Did you upload the application to iTunes Connect?
• do you generate and install a provisioning profile for the new "App ID"?
• Does your project is signed with the new provisioning profile?
• Are you compiling the project for IOS 3.0 or higher?
• Are you using the full product ID when you make a SKProductRequest? ie for example: com.company.sampleapp.productid?
• Has it been several hours since you added the products to iTunes Connect?
• Does the contract payment application in the iTunes Connect is complete?

FAQ
• How do I enable my application for InApp Purchases?: Simple, just should not use * in the application ID (com.company.miapp *) but a unique id. Example: com.company.sampleapp1
• How do you know if the contract is complete Payment Application?: This should be in "Contracts in your efects. If not then you should complete the following information: "Contact Info", "Bank Info" and "Tax Info" under contract "Paid Applications"

Recommendations
• Never sign in with the sandbox test user in a production environment (iTunes), if you do, this is disabled
• Do not endorse the products until tested if any

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/1186729/perfil.png http://posterous.com/users/hesarRTNlWjpg Abraham Barrera abarrera Abraham Barrera
Tue, 12 Oct 2010 18:31:00 -0700 Checklist InApp Purchase http://blog.abrahambarrera.me/2010/10/checklist-inapp-purchase.html http://blog.abrahambarrera.me/2010/10/checklist-inapp-purchase.html Si hay algo que ha impedido la proliferación de InApp Purchase es:

1. La escasa documentación (troubleshooting)
2. El precario ambiente de pruebas
3. El simulador no sirve para probar el StoreKit
4. el 30% que se lleva Apple

Ok. no todo es tan malo al menos tenemos un medio por el cual ofrecer nuestros productos
a través de nuestras aplicaciones iOS, sin embargo, en el desarrollo nos encontramos con
diversos problemas:

1. Al obtener los productos nos encontramos con que todos vienen en el arrelgo
invalidProductIdentifiers
2. Al pagar recibimos un error SKErrorPaymentInvalid


Estos errores típicos son invalidantes para aprobar la apliación y las ventas, y cuando
Apple rechaza la aplicación jamás lo hace con suficientes argumentos más que un
screenshot donde aparece el error "manejado" por nuestra aplicación.

Para no tener estos errores encontré por ahí un checklist bastante bueno y creo que es
prudente publicarlo ya que no todo esto está documentado en el InApp Purchase Guide.
La idea es que todas las respuestas sean SI, si hay alguna con un NO, hay que revisar.


Checklist InApp Purchase

• ¿Tu aplicación está habilitada para InApp Purchases?
• ¿Tienes una cuenta de InApp Purchase de Prueba?
• ¿El producto que ofreces está marcado como "Cleared for Sale"?
• ¿Subiste la aplicación al iTunes Connect?
• ¿El "Bundle ID" en el archivo de configuración (.plist) de tu proyecto coincide con tu "App ID" en el Provisional Portal?
• ¿Generaste e instalaste un perfil de provisionamiento para el nuevo "App ID"?
• ¿Tu proyecto está firmado con el nuevo perfil de provisionamiento?
• ¿Estás compilando el proyecto para iOS 3.0 o superior?
• ¿Estás usando el ID del producto completo cuando realizas un SKProductRequest? es decir por ejemplo: com.company.sampleapp.productid
• ¿Han pasado algunas horas ya desde que subiste los productos al iTunes Connect?
• ¿Está completo el contrato de Aplicaciones de Pago en el iTunes Connect?

FAQ
• ¿Cómo habilito mi aplicación para InApp Purchases?: Fácil, solo no debes usar * en el identificador de la aplicación (com.company.miapp*) sino un id único. Ejemplo: com.company.sampleapp1
• ¿Como se si el contrato de Aplicaciones de Pago está completo?: Este debe estar en el apartado "your contracts in efects". Si no aparece entonces hay que completar la siguiente información: "Contact Info", "Bank Info" y "Tax Info" en el contrato tipo "Paid Applications"

Recomendaciones
• Jamás inicies sesión con el usuario de pruebas del sandbox en un ambiente de producción (iTunes), si lo haces, este se inhabilita
• No Apruebes los productos hasta haberlos probado

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/1186729/perfil.png http://posterous.com/users/hesarRTNlWjpg Abraham Barrera abarrera Abraham Barrera
Fri, 20 Nov 2009 14:42:00 -0800 Crear un Delegate Personalizado Objective-C http://blog.abrahambarrera.me/2009/11/crear-un-delegate-personalizado.html http://blog.abrahambarrera.me/2009/11/crear-un-delegate-personalizado.html

Si bien el patrón de diseño más utlizado en el Cocoa Touch es el Delegate, no existe mucha documentación al respecto en el Apple Dev Center, salvo definiciones de lo que son los @protocols, pero en fin ningún ejemplo práctico.

A continuación un ejemplo práctico:
Supongamos que tenemos nuestra clase BotonEventos, lo primero es declarar la interfaz:

@interface BotonEventos: NSObject {
NSString *titulo;
}

- (void) hacerClick;
@property (nonatomic, retain) NSString *titulo;
@end

lo segundo es modificar esta interfaz y definir los comportamientos del delegate y la propiedad "delegate" propiamente tal:


@class BotonEventos
@protocol BotonEventosDelegate <nsobject>
- (void)clickHecho:(BotonEventos *)boton;
@end
</nsobject><botoneventosdelegate> delegate;
}
</botoneventosdelegate>id
NSString *titulo;
@interface BotonEventos: NSObject {

- (void) hacerClick;
@property (nonatomic, retain) NSString *titulo;
@property (nonatomic, assign) id <botoneventosdelegate> delegate;
@end

</botoneventosdelegate>

Luego la implementación de la interfaz sería algo así
@implementation BotonEventos
@synthesize texto, delegate;
- (void)hacerClick {
//codigo al hacer click
[[self delegate] clickHecho:self];
}
@end

la interfaz que toma el comportamiento del Delegate creado debe ser declarada de la siguiente forma:

@interface ClaseDelegate : UIViewController
@end

Finalmente la clase que implementa el delegate debe contener el "evento" declarado en elprotocol BotonEventosDelegate.

- (void)clickHecho:(BotonEventos *)boton {

NSLog(@"se hizo clic en el botón con titulo %@", [boton titulo]);

}


Si el evento no es obligatorio debe anteceder en la declaración de este el atributo
@optional


Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/1186729/perfil.png http://posterous.com/users/hesarRTNlWjpg Abraham Barrera abarrera Abraham Barrera
Fri, 31 Oct 2008 15:31:00 -0700 Navigation-Based Application parte II http://blog.abrahambarrera.me/2008/10/navigation-based-application-parte-ii.html http://blog.abrahambarrera.me/2008/10/navigation-based-application-parte-ii.html
Crear el Proyecto

En el XCode seleccionamos nuestro nuevo proyecto del tipo Navigation Based, elegimos algún nombre /MyNav en mi caso/ y tenemos:

- RootViewController.m

El controlador que se encargará de servir de datasource y Delegate a nuestra tabla

- MyNavAppDelegate.m

El controlador de la aplicación

- RootviewController.xib

La vista que contiene la TableView
- MainWindow.xib
La ventana que contiene nuestra vista.


Abrimos el archivo RootViewController.m, y editamos los siguientes eventos del TableView:

numbrOfRowsInSection: Este, entrega al tableview el número de filas que tendrá cada sección de la tabla, predeterminado en Cero.  en el ejemplo le asignaremos 5 filas.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    return 5;

}

cellFroRowAtIndexPath: devuelve la celda (con contenido) que se mostrará en la fila número indexPath.row.
Le borramos el código y  dejamos de la siguiente forma para que muestre algún contenido personalizado:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {   

    static NSString *MyIdentifier = @"MyIdentifier";

   UITableViewCell *cell = [[[UITableViewCell allocinitWithFrame:CGRectZeroreuseIdentifier:MyIdentifier] autorelease];

    cell.text = [NSString stringWithFormat:@"Fila Número %d", indexPath.row];

    return cell;

}


La primera línea describe un String identificador para la fila, no nos sirve para nada por ahora. En la segunda declaramos un objeto de clase UITableViewCell que se mostrará ne la fila. En la tercera línea asignamos un texto a la propiedad text de la celda.


En cuanto a las instrucciones utilizadas:

NSString stringWithFormat: Es una sobrecarga del constructor de la clase String la idea es que recibe un texto con formato, es decir, al texto le agregamos parámetros, de algún tipo (%d, %f, %@, etc), y luego la lista de parámetros separados por coma. En este caso pasamos el número de la fila.

Compilamos (CTRL+B) y ejecutamos para ver el resultado:

Media_http2bpblogspot_agdne

Como podemos ver el resultado son nuestras 5 filas con el contenido personalizado que insertamos.




Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/1186729/perfil.png http://posterous.com/users/hesarRTNlWjpg Abraham Barrera abarrera Abraham Barrera
Mon, 27 Oct 2008 19:39:00 -0700 Password iPhone http://blog.abrahambarrera.me/2008/10/password-iphone.html http://blog.abrahambarrera.me/2008/10/password-iphone.html Al margen, lo necesité para subir algo al iphone, es el password de los usuarios unix dentro del iphone:

Usuario     Pass
-----------     -------
mobile       dottie
root            alpine

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/1186729/perfil.png http://posterous.com/users/hesarRTNlWjpg Abraham Barrera abarrera Abraham Barrera
Fri, 24 Oct 2008 22:44:00 -0700 Aplicaciones iPhone http://blog.abrahambarrera.me/2008/10/aplicaciones-iphone.html http://blog.abrahambarrera.me/2008/10/aplicaciones-iphone.html Aplicaciones iPhone
Navigation-Based Application

Es el primer tipo (template) de aplicación que nos permite construir el XCode, es básicamente una aplicación de tipo tabla (como el listado de contactos). Ahora al crear un nuevo tipo de esta aplicación hay que tener en cuenta que es un template, por lo tanto no viene con mucho código y no esperemos que haga nada al presionar Play, sin embargo, le podemos agregar de forma fácil y sencilla contenido para la tabla y navegación /que sería lo más obvio/; 
Ahora bien si tenemos otra vista (ViewController)  hecha en el XCode la podemos invocar desde la selección de algún elemento de la tabla para probar la navegación.

A continuación implementaremos el template de la Navigation-Based Application.

Un poco de Teoría
La Navigation Based App usa un elemento llamado NavigationController que administra una barra superior de navegación desde donde se puede ir a la vista anteriormente cargada /sin código/ . Y como principal una vista con un control TableView, que no es más que una grilla que puede contener muchos TableCells y en cada uno de ellos el objeto que se nos ocurra /es demasiado versátil/ 

El funcionamiento de un TableView es el siguiente:

Basándose en el patrón MVC (Model View Controller) muy conocido por nosotros (ejemplos de implementación son Struts, Mono Rails, entre otros) 

El TableView requiere dos elementos fundamentales: Un Datasource y un Delegate: El Datasource se encarga de mediar entre el Origen de los datos y el TableView, mientras el Delegate de la Apariencia y comportamiento de los objetos en él. Si bien no es estricto, el Delegate y el Datasource pueden ser el mismo Objeto.

Como dije antes el TableView contiene TableCells, pero ahora bien lo decimos al revés (MVC jojoj)   El Datasource provee  de TableCells para cada una de sus filas (a petición) estas  TableCells heredan de UITableViewCell, A continuación un grafiquito se entenderá mejor si quedan dudas. 

Media_http4bpblogspot_eiicg

En la imagen:  el Cliente (Ventana o View) inicia la tabla, en ese momento la TableView pide al datasource (mediante Eventos!): 
a) El número de secciones de la tabla. 
b) El número de filas por sección (ojo que pueden ser diferentes por cada sección).   
c) La TableCell en particular que cargará en una fila específica (pasa un objeto IndexPath al que se puede acceder con IndexPath.Row para obtener la fila)  

Una vez con estos elementos TableView ya puede dibujar una tabla con contenidos

Posteriormente al Delegate la tabla le pide información de comportamiento y diseño por ejemplo: 

a) El estilo de edición que tendrá cada celda (recordar que una tableview no solo sirve para mostrar información sino también para editar.. bueno no recordar pues no lo he dicho antes :p).
b) Si algún elemento de la grilla (una celda) puede ser Reordenada (cambio de posición).
c) etc.. los veremos en los ejemplos.

Crear el Proyecto
En el XCode seleccionamos nuestro nuevo proyecto del tipo Navigation Based, elegimos algún nombre /MyNav en mi caso/ y tenemos:
- RootViewController.m
El controlador que se encargará de servir de datasource y Delegate a nuestra tabla

- MyNavAppDelegate.m
El controlador de la aplicación

- RootviewController.xib
La vista que contiene la TableView

- MainWindow.xib
La ventana que contiene nuestra vista.

... Continua ...

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/1186729/perfil.png http://posterous.com/users/hesarRTNlWjpg Abraham Barrera abarrera Abraham Barrera
Fri, 17 Oct 2008 14:11:00 -0700 iPhone SDK ejemplos http://blog.abrahambarrera.me/2008/10/iphone-sdk-ejemplos.html http://blog.abrahambarrera.me/2008/10/iphone-sdk-ejemplos.html Hoy les daré algunos links con muy buena información para comenzar bastante buenos

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/1186729/perfil.png http://posterous.com/users/hesarRTNlWjpg Abraham Barrera abarrera Abraham Barrera
Sun, 12 Oct 2008 20:04:00 -0700 iPhone SDK Primera Aplicación http://blog.abrahambarrera.me/2008/10/iphone-sdk-primera-aplicacin.html http://blog.abrahambarrera.me/2008/10/iphone-sdk-primera-aplicacin.html
Para comenzar, una vez instalado el sdk del ihpone es importante tener en cuenta el directorio donde se encuentra nuestro IDE Xcode: "\Developer\Applications\"

Aquí podemos ver:
- Dashcode: ide web
- Instruments: medir rendimiento y uso de recursos de nuestras app.
- Interface Builder: crear "formularios" (a lo MS) o ventanas con controles prediseñados.
- Xcode: el que buscamos.

Para hacerlo más facil pueden arrastrar Xcode a la barra de accesos directos de su mac, de esta forma no lo buscamos cada vez que lo utilicemos.

Media_http1bpblogspot_hngey

Primero iniciamos Xcode, vamos al menú File y seleccionamos New Project, en el cuadro de dialogo New Project seleccionamos View-based Application y presionamos el botón choose, y escribimos el nombre de la aplicación ("MyFirstApp") 

De esta forma estamos diciendole a Xcode que queremos crear una nueva aplicación con un template basado en views (vistas: son como pequeñas ventanas, la principal función es ser contenedores.)

La ventana de Xcode debiera verse de esta forma:

Media_http1bpblogspot_bhbaz

En el directorio Resources podemos ver 2 archivos .xib que son de interfaz gráfica, uno es el contenedor principal (la ventana MainWindow) y el otro es nuestra vista que se cargará dentro de la ventana y contendrá el resto de los controles de la aplicación

Arriba en el directorio Classes se encuentran nuestros delegates tanto de la aplicación como el de la vista, además se encuentra separada la interfaz (.h) y la implementación (.m).

bueno pensemos en el famoso Hello World, para
 esto abrimos (doble clic) el archivo MyFirstAppViewController.xib. inmediatamente corre Interface Builder que nos ayudará en la construcción de la interfáz. ¿qué necesitamos? bueno un controla Label (para mostrar el saludo) y un control Button para hacer la primera acción, o mejor dicho un UILabel y un UIButton.

Media_http4bpblogspot_hwzsq

Con nuestra Vista seleccionada vamos al
 menú Tools y seleccionamos Library, y podemos ver la ventana de objetos al lado derecho de nuestra pantalla.
Aquí buscamos un Label y lo arrastramos a la pantalla, de la misma forma un Button.
Hacemos doble clic al button para escribir una valor ("Say Hello").

una vez echo esto guardamos nuestra vista y volvemos a las clases.

Regresamos a MyFirstViewAppViewController.h y hacemos la declaración del botón y el label además la declaración de un método que lo llamaremos sayHello.

Media_http2bpblogspot_lhoni
Hay que tener presente los nombres de estos objetos para el posterior enlace.

Ahora la implementación en el archivo con el mismo nombre pero de extensión .m:
y agregamos las siguientes líneas:

Media_http2bpblogspot_qdsbd

Finalmente abrimos nuevamente el archivo MyFirstAppViewController.xib Seleccionamos en la ventanita inferior "File's Owner" y en el menú Tools presionamos "Inspector" ahí podemos visualizar los controles de nuestra Clase que implementamos antes, entonces ahora arrastramos el nombre de nuestro objeto al objeto promiamente tal en la vista según indica la próxima imágen:

Media_http2bpblogspot_dibtb
Repito:
1. Abrir la vista

2. seleccionar en el listado "File's Owner"

3. Ir al menú Tools (del Interface Builder)

4. Seleccionar Inspector

5. En la ventana Inspector en la pestaña "Outlets" aparece el listado de objetos de nuestra clase

6. Arrastramos el circulo al lado derecho del nombre (con drag&drop) hacia el objeto en la pantalla.

7. Se repite con el lblHello,

Ahora Seleccionamos el Botón en la pantalla, en la misma ventana Inspector (la que cambia el listado ahora se llama Listado de eventos). Drag&drop nuevamente con el evento Touch Inside Up (en castellano clic) lo arrastramos hacia el File's Owner según indica la siguiente imagen:

Media_http3bpblogspot_geoba

Al soltar el mouse se visualiza el método que implementamos al comenzar "sayHello"

Media_http4bpblogspot_iuoan
 

Lo seleccionamos y el listado de eventos debiera verse como sigue:

Media_http4bpblogspot_geied

y listo! .. guardamos compilamos y presionamos el botoncito Verde "Run".

Media_http2bpblogspot_adszp
 

. Bueno debo hacer una corrección: en la línea
lblHello.text = "Hello World"  debe decir:
lblHello.text = @"Hello World" para que la tome como String.

saludos!

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/1186729/perfil.png http://posterous.com/users/hesarRTNlWjpg Abraham Barrera abarrera Abraham Barrera
Sun, 12 Oct 2008 04:15:00 -0700 iPhone SDK software http://blog.abrahambarrera.me/2008/10/iphone-sdk-software.html http://blog.abrahambarrera.me/2008/10/iphone-sdk-software.html Para comenzar dare algunos tips al respecto del paquete de herramientas que nos ofrece el iphone sdk.

El sdk puede descargarse de la siguiente dirección http://developer.apple.com/iphone/ (obviamente previo registro :/ ) 

Este consta principalmente del entorno de desarrollo integrado, llamese IDE jeje, los frameworks (librerías) y herramientas (como simuladores, analizadores de rendimiento, etc).

Tipos de Aplicaciones:
en el iphone podemos correr principalmente 2 tipos de aplicaciones: stand alone y Web (Safari). 

Las aplicaciones stand alone deben estar escritas en objective C  con el estandar Cocoa de aplicaciones para OSX.

En las aplicaciones Web tenemos 3 tipos: 
a) web compatibles
b) web adaptadas
c) web applications (así denominada por apple)

La  primera es una aplicación web cualquiera que es compatible pues las instrucciones javascript y su contenido puede ser visualizado por el browser safari.
La segunda (adaptada) es una aplicación cuyo tamaño y funcionalidad esetá adaptada para la visualización en el iphone, está demás decir que a su vez esta debe ser compatible. buenos  ejemplos son google y faceboook.
El tercer tipo son aplicaciones hechas en dashcode (despues explicaré esto) , estas aplicaciones están generadas con librerías javascript que simulan las GUI's del iphone y hacen parecer al usuario que son aplicaciones stand alone, mientras corren sobre safari.

Un tercer tipo de aplicaciones para el iphone (y las más utilizadas) son las Híbridas, que corresponde a un estandar creado por apple que implica utilizar integración entre web applications y programacion en Objective C.  Esto se logra mediante objetos web (mini browsers) que se incrustan en nuestra aplicación stand alone y permiten mostrar contenido web dentro del contexto de la aplicación. El contenido web de estas aplicaciones instaladas puede estar en un servidor remoto o alojadas dentro del mismo iphone en el directorio de la aplicacion instalada.

Herramientas del Paquete

X-Code:  es el IDE principal que viene con el sdk, este permite crear los diferentes tipos de aplicaciones standalone que existen (basadas en navegación,  OpenGL, Tab Bar, Utilitarias, Basadas en Vistas y por último las basadas en Ventanas). posteriormente iremos desarrollando ejemplos para cada una de estas.  el X-Code viene con sus propias herramientas para debug (muy buenas por cierto), logs, test, etc..

DashCode: es el IDE para el desarrollo de web applications, esta herramienta muy poderosa permite la generación automática de código javascript asociado a los controles que gráficamente ponemos en la pantalla.

IphoneSimulator: yo diria la aplicación mas poderosa del sdk, pero estaría mintiendo, ejje pero me gusta. es un buen iphone de tamaño completo que tiene funciones básicas de  agenda, royo fotográfico, browser y permite ejecutar nuestras aplicaciones, con buen soporte para el acelerómetro y GPS. El único pero que tiene hasta el momento es que hay MAS frameworks en el SDK para el simulador de los que hay disponibles para el iphone.. por lo tanto, No todo lo que corre en el simulador corre en el iphone.

Otra Herramienta más que es para ver el funcionamiento y rendimiento de lo desarrollado, pero no me acuerdo como se llama.. bueno no la voy a ocupar en este espacio en un buen tiempo tampoco asi que la paso por alto.

bueno eso por ahora, el próximo será la primera aplicación iphone.

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/1186729/perfil.png http://posterous.com/users/hesarRTNlWjpg Abraham Barrera abarrera Abraham Barrera