Aprende Storyboards paso a paso para poder disfrutar lo antes posible de esta nueva funcionalidad.
En este artículo vamos a ver paso por paso como utilizar la funcionalidad Storyboarding de iOS 5, que nos facilitará enormemente la gestión de múltiples pantallas en nuestra App.
En primer lugar vamos a tratar de explicar cual es la principal diferente entre la forma de trabajar antigua y la forma de trabajar nueva.
Hasta ahora, si teníamos una aplicación que tenía un total de 3 pantallas, en lo referente a la capa de vista, debíamos tener 3 archivos de Interface Builder, donde se elaboraba visualmente la estructura y elementos de cada pantalla. Para poder establecer navegación entre una vista y otra, la única manera era mediante código, con funciones como la que sigue:
1 | [self.navigationController pushViewController:myViewController animated:YES]; |
Al encontrarse la lógica de navegación en el código, no había una forma rápida de entender la misma, sino que era necesario ir viendo cada ViewController y averiguar qué botón llama a qué pantalla, etc.
Ahora, con Storyboarding, esos múltiples ficheros de Interface Builder, se sustituyen por un único fichero .storyboard. Este fichero se edita desde el propio Xcode, al haberse “eliminado” Interface Builder con la salida de Xcode 4.
En este storyboard no solo podemos ver gráficamente cada una de las vistas de nuestra aplicación, sino que podemos conocer cual es la navegación que se establece entre cada una de ellas.
Esto quizás al principio pueda resultar un poco extraño, pero os puedo asegurar que con el ejemplo que vamos a ver al final de este artículo vais a poder comprobar la potencia de esta nueva forma de trabajar.
Escena: una escena es lo que podríamos denominar una vista de nuestra aplicación, es decir, cada pantalla.
Segue (pronunciado Seg-way): es la navegación/transición entre una escena y otra.
En Xcode sin una sola letra de código vamos a poder establecer cual es la navegación para cada uno de los elementos de la interfaz, e incluso personalizar la forma en que se produce la transición entre los mismos (con una serie de efectos que vienen predefinidos y pudiendo establecer los nuestros personalizados).
Ejemplo práctico
Vamos a hacer un ejemplo de aplicación, donde tengamos un TabBarController inicial con dos pestañas. En la primera de ellas tendremos un sencillo botón que abre una ventana modal en la cual hay un botón que nos permite volver a cerrarla enviándole cierta información. En la segunda pestaña tendremos un TableViewController con su correspondiente pantalla de detalle.
En primer lugar abriremos Xcode y crearemos un nuevo proyecto de tipo “Single View Application”.

A continuación cumplimentaremos la información del proyecto, asegurándonos de chequear en la parte inferior las opciones ARC y Storyboarding.

Una vez se haya creado el proyecto, veremos en nuestra vista “Project Navigator” que la plantilla ha creado automáticamente un fichero con el nombre “MainStoryboard.storyboard”. Pulsando sobre el fichero veremos que nos abre la funcionalidad de Storyboarding, que ahora mismo únicamente cuenta con un ViewController.

Dado que necesitamos tener en primer lugar un TabBarController en nuestra aplicación, podemos añadirlo manualmente desde el Panel de Objetos, pero existe una forma aun más comoda de hacerlo.

Si teniendo seleccionado nuestro ViewController vamos al menú “Editor / Embed in / Tab Bar Controller” será Xcode quien haga todos los pasos por nosotros.

Ahora ya tenemos el TabBarController pero aún nos falta una segunda pestaña que como decíamos en el enunciado deberá ser de tipo TableViewController con un NavigationController que nos permita posteriormente incluir una pantalla de detalle.
Desde el panel de objetos vamos a añadir un nuevo TableViewController.

Una vez añadido, lo seleccionaremos, y pulsaremos el menú “Editor / Embed in / Navigation Controller”, y obtendremos un resultado como el que sigue.

Como se puede observar, el Navigation Controller esta completamente desvinculado del Tab Bar Controller. Para incluirlo como una nueva pestaña deberemos hacer Ctrl clic en el Tab Bar Controller y arrastrar y soltar en el Navigation Controller como cuando creamos un Outlet.
Al soltar nos saldrá una ventaja emergente con las siguientes opciones:

Deberemos seleccionar la opción “Relationship – ViewControllers”. Una vez hecho esto veremos que se ha incluido una nueva conexión entre ambos, y que en el Tab Bar Controller figuran ya dos pestañas.

Dado que en nuestro ejemplo no vamos a tener un DataSource para el TableView, vamos a hacer uso de una nueva funcionalidad de iOS 5 y Xcode 4, que son las Static Cells.
En un próximo artículo hablaremos en mas detalle de esta funcionalidad y de la de prototipado de Celdas desde Storyboarding.
Ahora solo haremos lo mínimo necesario para completar nuestra navegación.
Seleccionando el Table View, nos iremos al Attributes Inspector y seleccionaremos la opción Static Cells.

Con ello veremos que Xcode nos crea varias celdas en nuestro Table View. Eliminaremos todas, dejando solo la primera.
Teniendo seleccionada la celda que nos ha quedado en el table View, nos vamos de nuevo al Attributes Inspector y seleccionamos el tipo Basic.


Ahora vamos a añadir por último un ViewController destinado a la pantalla de detalle del Table View Controller.
Desde el panel de objetos añadimos un View Controller y al igual que hicimos hace un momento, arrastramos desde la celda del TableViewController hasta el ViewController creado. Esta vez seleccionaremos la opción Push que nos permitirá dar uso al NavigationController en el que nos encontramos en ese punto.
Ahora mismo ya tenemos todas las escenas que necesita nuestra aplicación, y como habéis podido observar, hemos establecido su navegación sin una sola letra de código.
Si ejecutamos en este punto la aplicación veremos que ya tenemos las pestañas, tenemos el TableView e incluso pulsando sobre la celda que hemos creado como estática, accedemos a la pantalla de detalle.
Como habréis podido observar, la potencia de Storyboarding es algo excepcional.
Por último vamos a ver como se implementaría el último de nuestros requisitos para este ejemplo: hacer que en la primera pestaña haya un botón que abra una ventana modal, en la cual haya otro botón que cierra dicha ventana devolviendo ciertos datos.
Dado que para hacer esta operativa si que vamos a necesitar algo de código a implementar, vamos a crearnos una clase ViewController para nuestra primera pestaña.
Para ello, añadimos una nueva clase a la que llamaremos PrimerViewController que deberá extender a UIViewController.

Una vez creada la clase, seleccionamos dentro del Storyboard el ViewController correspondiente a la primera pestaña (el que no es un Navigation Controller) y en la pestaña de Identity Inspector seleccionamos como Class PrimerViewController.

A continuación añadimos a nuestro Storyboard un nuevo ViewController desde el panel de objetos. Seguidamente creamos una nueva clase en nuestro proyecto a la que llamaremos SegundoViewController, y tal y como hicimos en la pestaña Identity Inspector de este nuevo View Controller seleccionamos como Class SegundoViewController.

Ahora añadiremos un UILabel y un UIButton al Primer View Controller y hacemos Ctrl clic hasta el SegundoViewController donde soltamos y seleccionamos Modal.
En SegundoViewController creamos un UITextField y un UIButton.

En este punto quizás podríais pensar que para poder ir al PrimerViewController al pulsar el botón Seleccionar bastaría con crear un nuevo Segue. La verdad es que no es posible hacer eso, dado que lo que ocurriría sería que nos crearía una nueva instancia de PrimerViewController, y podríamos hacer que el usuario entrara en un bucle en el cual se crean ViewControllers pero nunca se destruyen.
¿Y entonces como hago para enviar información desde la segunda ventana a la primera y cerrar la ventana modal?
Pues bien, vamos a necesitar crear un protocolo en el SegundoViewController, y nuestro PrimerViewController hará de Delegate e implementará dicho protocolo.
Para ello el código quedaría de la siguiente manera:
SegundoViewController.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #import <UIKit/UIKit.h> @class SegundoViewController; @protocol SegundoViewControllerDelegate <NSObject> - (void)devolverValor:(NSString *)texto; @end @interface SegundoViewController : UIViewController @property (strong, nonatomic) IBOutlet UITextField *cajaTexto; @property (nonatomic, weak) id <SegundoViewControllerDelegate> delegate; - (IBAction)volver:(id)sender; @end |
SegundoViewController.m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #import "SegundoViewController.h" @implementation SegundoViewController @synthesize cajaTexto; @synthesize delegate; - (IBAction)volver:(id)sender { [delegate devolverValor:self.cajaTexto.text]; } - (void)viewDidUnload { [self setCajaTexto:nil]; [super viewDidUnload]; } @end |
PrimerViewController.h
1 2 3 4 5 6 7 8 | #import <UIKit/UIKit.h> #import "SegundoViewController.h" @interface PrimerViewController : UIViewController <SegundoViewControllerDelegate> { } @property (strong, nonatomic) IBOutlet UILabel *etiqueta; @end |
PrimerViewController.m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #import "PrimerViewController.h" @implementation PrimerViewController @synthesize etiqueta; - (void)devolverValor:(NSString *)texto { self.etiqueta.text = texto; [self dismissModalViewControllerAnimated:YES]; } - (void)viewDidUnload { [self setEtiqueta:nil]; [super viewDidUnload]; } @end |
Ahora bien, ya tenemos todo preparado, pero nos falta un pequeño detalle: indicar a SegundoViewController que su delegate es PrimerViewController.
Y aquí es donde vamos a ver una pequeña pega, o elemento a mejorar en Storyboarding, y es que para poder definir esta relación, debemos obligatoriamente hacer uso de código.
Concretamente vamos tener que asignarnos como delegate en el momento en que se construye el SegundoViewController antes de mostrarse.
Para ello, existe un método denominado prepareForSegue, que nos permite justamente eso. Preparar el nuevo ViewController antes de mostrarlo, ya sea para incializar valores, cargar en el información procedente del ViewController en que nos encontramos, o como es el caso, para definirnos como delegate del mismo.
Para ello incluiremos en nuestro PrimerViewController.m el siguiente método:
1 2 3 4 5 6 7 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { SegundoViewController * segundoViewController = segue.destinationViewController; segundoViewController.delegate = self; } |
Como se puede ver el método cuenta con un parámetro segue de tipo UIStoryboardSegue de donde podemos entre otras cosas obtener el ViewController al que vamos a ir al ejecutar esta navegación.
En algunos casos, en los que un ViewController tenga navegación a través de botones por ejemplo a varios lugares, preguntar cual es el Segue concreto que se esta ejecutando.
Para ello deberemos identificarlos previamente en el Attributes Inspector.

Esto lo haremos situándonos sobre el icono correspondiente al Segue que queremos identificar.

Una vez hecho esto, dentro de nuestro método prepareForSegue podremos preguntar por el identificador del Segue que se esta ejecutando, y poder así establecer diferentes salidas para cada uno de ellos:
1 2 3 | if ([segue.identifier isEqualToString:@"PantallaDetalle"]){ } |
Pues esto ha sido todo, y espero que este artículo os sirva para quitaros el miedo con esta potente herramienta que es el Storyboarding.
Una vez se prueba a trabajar así, ya no hay vuelta atrás.
Espero vuestros comentarios.

Gracias por vuestros comentarios privados a través de Twitter. La verdad es que dan ganas de hacer más y más artículos.
Estupendo articulo, no conocía la parte del delegate y el protocol, no me ha hecho falta usarlo todavía, pero esta genial tener unas nociones con ejemplos sencillos para luego ampliarlas.
Gracias por el artículo. Un Saludo.
Muchas gracias Ricardo! Cualquier duda, ya sabes donde estamos! ;·)
Te felicito por tu blog y te animo a que sigas. Estoy empezando en esto y no veo que haya demasiada información en español o igual es que no la he buscado bien
Estuve mirando por encima esto del storyboard hace unos días y no me acabó de gustar precisamente porque no sabía que existía el método prepareForSegue.
Saludos!
Miguel gracias por compartir tus conocimientos. Por fin pude entender el patrón delegate, pero como puedo hacer si necesito compartir datos a una vista que aun no se ha mostrado?
Hola Gustavo,
Entiendo que te refieres a enviar información a una vista que se va a cargar, pero aún no se ha cargado. Esto lo harías dentro del método prepareForSegue. Instanciamos el destinationViewController, y seteamos las propiedades que queramos enviar al mismo.
Un abrazo.
Muchas gracias por este artículo, me ha sido muy útil. Acabo de empezar a estudiar el desarrollo de Apps para iPhone y ha sido motivador encontrarme con este minitutorial. Sin embargo he quedado con un par de dudas sobre el final de la publicación. ¿Será posible escribirte un correo y canalizar por ahí mi inquietud?
Gracias nuevamente.
Hola no veo que hay que hacer en el boton Seleccionar para volver, lo he hecho todo paso a paso y no me funciona, no consigo volver.
Buenas he visto que en el tutorial tocas algo de Table View y te quiero hacer una consulta relacionada con este elemento. Soy bastante novato, te cuento por si me puedes ayudar.
Tengo en el storyboard entre otras cosas un Table View Controller con 10 celdas. Las he creado de forma Static Cells.
De una de estas celdas pulsando Ctrl arrastro la linea para enlazar con un View Controller llamado Detalles.
Una vez que pruebo la aplicación la celda me lleva a la vista nueva (Detalles) si selecciono Modal, con Push y Custom no hace nada.
Mi pregunta es la siguiente ¿Cómo puedo detectar desde qué celda estoy llegando a Detalles? Detectar el índice o algo de la celda desde la que llego al View Controller.
Lo que quiero hacer viene a ser como un menú. En detalles detectar la opción desde la que he llegado y mostrar una cosa u otra por ejemplo en un Label. Llevo buscando por ahí y nada.
¿Vendría a ser algo parecido a esto? Label.text = self.navigationItem.title;
Te agradezco si puedes ayudarme.
Hola Ignacio,
Cuando tu pulsas una celda del Table View se ejecuta un método que se llama didSelectAtIndexPath donde uno de los parámetros que recibe es justamente el indexPath, de donde puedes sacar el número de la fila que ha pulsado.
Usando storyboarding esto es igual.
Mira a ver si con eso te ayuda.
Un abrazo.
Ya lo tenía solucionado, pero muchas gracias de todas formas Miguel. Un saludo!!
Buenas,
Estoy empezando con IOS y me ha servido de mucho este tutorial, pero cuando he llegado a
[self dismissModalViewControllerAnimated:YES];el XCode me dice que:
Receiver type ‘PrimerViewController’ for instance message does not declare a method with selector ‘dimissModalViewControllerAnimated:’
¿Falta algo del código?
Saludos!
Hola a todos,
Aquellos que tengais problemas con el código, revisarlo bien porque esta verificado que funciona correctamente.
Aitor, el método no se llama “dimissModalViewControllerAnimated”, sino diSmissModalViewCOntroller…”
Un saludo.
Ostia que fallo más tonto. Mis disculpas y gracias
Buenas tardes Miguel, ayer me encontré por casualidad con tu blog y la verdad es que esta noche me ha quitado muchas horas de sueño. Felicidades y sigue así.
Quería hacerte una consulta, ¿exista alguna forma de “abortar” el salto a la nueva vista en tiempo de ejecución? Por ejemplo desde prepareForSegue ó algún otro método delegado.
Muchas gracias.
Hola Raul,
Muchas gracias a ti por tus comentarios. Animan a seguir con el proyecto, eso desde luego!
No me he topado nunca con ese problema, y a falta de que alguien colabore con algún comentario, te paso un enlace que he visto donde plantean esta misma duda:
http://stackoverflow.com/questions/7819796/how-to-cancel-a-uistoryboardsegue
Si lo resuelves, y sabes!
Muchas gracias de nuevo.
Un saludo.
Fantástico el artículo, muy bien explicado y muy util.
Me ha ido todo perfecto hasta el metodo prepareForSegue, entonces me he encontrado con el problema de que no se pasan los parametros.
He ido al icono de segue correspondiente y en Identifier he escrito: PantallaDetalle
como tu has dicho he comprobado el controlador con:
if ([segue.identifier isEqualToString:@"PantallaDetalle"]){
}
lo he comprobado con el debug y la condicion se cumple. Dentro del if he escrito:
if ([segue.identifier isEqualToString:@"PantallaDetalle"]){
SegundoViewController * segundoViewController = segue.destinationViewController;
segundoViewController.cajaTexto.text =@”Texto que envio”;
segundoViewController.title =@”Detalle Segundo VC”;
segundoViewController.delegate = self;
}
y no me pone ni el titulo ni nada en la caja de texto, tampoco me devuelve el texto a la etiqueta.
¿Podrias decirme que he hecho mal?
Muchas gracias por adelantado y sigue así!!
Hola Marc,
¿Puedes enviarme el código a mdiazrub@gmail.com?
Un saludo.
Claro, como no!! De momento lo he solucionado creando una propiedad weak y me funciona, de todas formas te lo envio por si hay una forma mejor.
Saludos!
Hola Marc,
Te he enviado la solución a tu correo. Ya nos contarás si resuelve tu duda.
Un abrazo.
hola buenas tenia una pregunta
Como puedo crear un controlador del TabBar que sea su delegado y poder hacer que no se pueden pulsar ciertas ventanas hasta que no se cumpla algo me refiero a un controlador que te coja esta evento cuando pulsas en una pestaña
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
Es que en Xcode 4 no se como se hace porque lo consigo hacer todo hasta que llego ha crear los 4 iboutlet de los controladores pero no soy capaz de unirlos con nada en el que es el nuevo interface builder
gracias un saludo
Por cierto tu ejemplo me sirvió perfecto. Una maravilla
Hola amigo.
Mi pregunta tiene que ver con el desarrollo de una App que consiste en un libro de 20 hojas y basicamente lo que necesito es
1.- que muestre un indice
2.- que pueda usar un buscador en el indice
3.- que al encontrar el item que busco al hacer clic en el me muestre su respectiva pagina.
Quiza sea demasiado pedir pero llevo varios dias viendo tutoriales y no lo consigo.
gracias. Quedare en deuda
De hecho ya tengo desarrollada la parte del indice con su respectivo buscador, pero lo que no se es como conectar cada entrada del indice por ejemplo pagina1 con su respectivo texto que realmente es un texto como de 20 lineas aproximadamente. Gracias y espero puedas ayudar a este desesperado.
hola como pasas un objeto si como primera pantalla tienes un login, adelate de esta tienes un tabBar despues de esta un navigation controller y finalmente despeues de esta tienes la segunda vista donde quieres usar los valores que se estrajeron de la base de datos en la primera pantalla de login, como le hago para enviarle el objeto
Hola Erick,
Me temo que vas a tener que darme más información, porque no entiendo muy bien cual es tu problema. En cualquier caso, e intuyendo algo de lo que comentas, echa un vistazo al último artículo que he publicado sobre como crear un ABM, donde se habla de la creación de un objeto tipo Store haciendo uso del patrón Singleton.
Un saludo.
gracias amigo lo del singleton me resolvio el problema ahora abusando de tu conocimiento y tu buena voluntad, como le hago si tengo una viwController unida a un tabController mediante una liga de modal es segue, pero ahora quiero meter otro veiewController entre ellos dos como le hago para quitar esa liga y haer que ahora apunte a esta nueva vista y de esta nueva vista sacar otra liga a donde apuntaba la primera, en si solo quiero meter una nueva vista entre esas dos como quito la liga que ya tiene y hago las nuevas ligas, perdona si mi explicacion es muy burda pero apenas estoy entrando en esto
Si tu conexión es un Outlet, se hace desde la pestaña Connections. Si la conexión de la que hablas es un Segue, entonces basta con seleccionarlo y pulsar borrar.
hola tengo una duda de esta manera consumo un web service y todo lo hace bien solo que si me regresa algun resultado con un acento o ñ o caracter especial me corta la palabra ejemplo castañon solo me regresa ñon, Jesùs me regresa solo ús, y creo que puede ser por la codificacion pero segun yo le estoy pasando utf-8: te dejo un poco del codigo porfa que crees que sea. Gracias
Aqui la composicion del llamado:
NSString *tarjeta =@”pimientaJesus@yopmail.com”;
NSURL *url =
[NSURL URLWithString:
[NSString stringWithFormat:
@"http://localhost:8080/pimientaws/PimientaServices/getPartnerOByEmailOrCard?email=%@&customerId=%@&typeAcomulation=%@",tarjeta,custo.customer_id,custo.typeAccumulationCustomer]];
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
NSString *msgLength = @”0″;
[req addValue: @"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[req addValue:msgLength forHTTPHeaderField:@"Content-Length"];
[req setHTTPMethod:@"GET"];
[indicadorActividad startAnimating];
conn = [[NSURLConnection alloc] initWithRequest:req delegate:self]; if (conn) {
webData = [[NSMutableData data] retain]; }
lo primero gracias por este blog ya que me ha servido de mucho para poder ir empezando a programar.
Yo tengo una duda y es por ejemplo si tengo varias ventanas o segues de modo push y por ejemplo estoy en el ultimo segue como puedo forzar a volver a la pantalla principal o/y cerrar la aplicacion en un momento dado.
gracias.
Hola Tomás,
Para poder retirar de pantalla una vista y volver a la que había debajo, basta con en lugar de hacer push, hacer pop. Sin quieres ir directamente a la vista ROOT de tu aplicación, basta con utilizar un método disponible desde iOS 2.0 de la clase UINavigationController:
[self.navigationController popToRootViewControllerAnimated:animated];
En cuanto a cerrar la aplicación, ¿conoces alguna aplicación que se cierre sola? yo creo que es un comportamiento ligeramente extraño. De todos modos, lo conseguirías ejecutando:
[[UIApplication sharedApplication] terminate];
Espero que te haya ayudado.
muchas gracias por la información ya que me biene genial.
Saludos. Tal y como le ha pasado a varios, no me funcionaba la parte de la ventana modal. Es debido a que en el tutorial no se explica cómo ENLAZAR los elementos visuales con el codigo.
Aqui dejo los pasos:
- En el storyboard seleccionamos el PrimerViewController (es decir, la escena que contiene el botón “Abrir en Ventana Modal”).
- Ahora abrimos el Assitant para mostrar a la vez el storyboard y el código asociado al elemento seleccionado. Nos aseguramos que en la vista de código está seleccionado el fichero “PrimerViewController.h”. Si no lo está, para seleccionarlo, arriba del código en la barra de navegacisón seleccionamos el primer elemento después de las flechas () y nos vamos a “Automatic > PrimerViewController.h”.
- En la ventana de codigo observamos que aparece un circulo vacío a la izquierda de: @property (strong, nonatomic) IBOutlet UILabel *etiqueta;
El circulo está vacío porque ese código no está conectado a ningún elemento visual, en este caso el “Label” de “PrimerViewController”.
- Para conectarlo, hacemos clic sobre el círculo y arrastramos hasta el label en el storyboard.
Ahora el círculo estará lleno. Si pasamos el ratón sobre el círculo veremos que en el storyboard se ilumina el elemento con el que está conectado.
Para ver todas las conexiones de una vista dada hay que seleccionar la vista desde la barra negra que hay por debajo (se mostrará seleccionada con un contorno azul) e ir a la vista de Utilities (la barra de la derecha) > Connection inspector (el icono de Utilities que es un circulo con una flecha dentro).
- Ahora seleccionamos la vista correspondiente al SegundoViewController y en la vista de codigo nos aseguramos que se está mostrando el fichero “SegundoViewController.h”. (el primer item de la barra de navegación que habíamos seleccionado antes, “Automatic”, se encarga de mostrarnos automáticamente el código referente al elemento seleccionado en el StoryBoard).
- Veremos que hay dos círculos vacíos.
- Arrastramos desde el círculo de “@property (strong, nonatomic) IBOutlet UITextField *cajaTexto;” hasta la caja de texto, y el otro círculo lo conectamos con el botóm.
- VOILA!!! Prueba la aplicación y comprueba que se comporta correctamente: ves a la ventana modal, escribe un texto, dale a “Seleccionar” y comprueba que se cierra la ventana modal y en el label de la ventana anterior se muestra el texto correspondiente.
Muy buen tutorial, sólo le faltaba comentar este pequeño detalle.
Muchas gracias, tu aporte me ha sido de gran ayuda
Y sólo me falta hacer el dismiss del teclado cuando le doy a return.
No le estoy cogiendo gusto a esto de programar para iOS jaja
Super tutorial!
Una pregunta : ¿Si la información entre controladores de vista es “bidireccional” , es decir, que en el primer controlador se elige la información que será publicada en el segundo, y según los acontecimientos en este ultimo, se actualizan los datos sobre el primero, con crear dos protocolos y dos delegados basta?
Y otra más: ¿La navegación entre controladores de vista sin un NAVIGATIONCONTROLLER y sin un TABBARCONTROLLER no esta recomendada? Tengo una app que navega entre vistas con el Segue Modal y me pregunto si “colapsara” en cualquier momento.
Muchas gracias y felicidades por el blog de calidad!!
Hola Miguel,
A la primera pregunta, te recomiendo que sigas el artículo que hice recientemente para la creación de un CRUD (http://www.migueldiazrubio.com/2012/06/10/creacion-de-un-abm-completo-crud/).
En cuanto a la segunda pregunta, no, esta perfectamente recomendado utilizar navegación sin usar NavigationController o TabbarController. El problema es que si la navegación involucra a muchas pantallas y es claramente compleja, el uso de este tipo de herramientas o implementaciones de UIViewController desde luego te van a ayudar. Sin embargo en otros casos, como juegos, o aplicaciones de muy pocas pantallas, podría interesarte no usarlos.
De lujo! muchas gracias!
Impresionante. Gracias.
Una guia perfecta para seguir como modelo. He seguido todos los pasos sin ningun problema.
Muchas gracias Francisco!
Un saludo.
Excelente tutorial para quienes vamos empezando en el mundo del desarrollo para iOS, muchas gracias por tomarte el tiempo para escribir este tutorial, un abrazo.
Gracias a vosotros Aide por visitar el blog!
Un saludo.
Saludos
Muy buen tutorial, yo ya sabia muchas cosas básicas, pero por lo que llegue aquí fue el paso de parámetros entre viewControllers, y aquí lo explica muy bien, supongo que es procedimiento es el mismo si en lugar de querer pasar un string quiero pasar un objeto?
Si, correcto. De hecho NSString es en sí un objeto también. Podrías pasar un objeto que tu mismo hayas creado.
Un saludo.
Buenos días,
Me lanzo en la programación de Apps con Xcode, y ya tengo mi primer contra tiempo!! no me salen las etiquetas botones y otros…, Alguien me puede ayudar
Gracias
Acabo de encontrar mi respuesta! aun me estoy familiarizando con el interface. Aun así la respuesta es
Ir a View–>utilities–>show object library
Siento la pregunta tan “novata”
Gracias
Hola en primer lugar enhorabuena por el blog! se aprende muchísimo . En segundo lugar me gustaría hacer una pregunta aprovechando este artículo:
Tengo un tableView donde en función de la celda que seleccionas descarga fotos de un sitio web y el nombre de las fotos te las muestra en otra tableView (mediante “segue”). El caso es que mientras descarga esa fotos y las pone en un NSData tarda unos segundos entre que el usuario ha pulsado la celda y se ejecuta el prepareForSegue. Lo malo es que si al usuario en ese intervalo de unos segundos le da por pulsar otra celda me ejecuta dos veces el prepareForSegue: , cuando lo que yo quiero es que me ejecute SOLO el prepareForSegue de la última celda que ha pulsado el usuario. Sabríais alguna posible solución?
Gracias
Hola Paco,
Despues de leer un par de veces tu pregunta, y existen desde mi conocimiento un par de posibilidades:
- La primera opción es utilizar Blocks para la carga de la información de internet. De este modo, se carga en background y no penaliza la navegación. Voy a escribir un artículo sobre esto proximamente.
- La segunda opción y mucho mas sencilla es utilizar un Activity Indicator que asuma el foco de la aplicación, y evitar así que el usuario haga click en otras celdas en lo que estamos cargando la primera.
Te recomiendo la primera opción, y dado que no se cuando publicaré el artículo que te indico, te remito al tutorial que ha hecho recientemente mi amigo Mario Girón: http://www.youtube.com/watch?v=wp8l61YEaA0
Espero haberte ayudado.
Un abrazo.
No entiendo porqué hay tantos comentarios negativos al autor. ¿Alguien me puede explicar porque? ¿?¿?¿?¿?¿?
Saludos
Si, eso mismo he he preguntado yo.
Si es por los signos negativos de los bocadillos, no son hacia el autor sino hacia la utilidad del comentario.
Muy buen tutorial, gracias.
Hola,
sería un excelente aporte poder compartir tu código para las personas que hemos tenido algun problema. Sería una excelente referencia.
Saludos.
Estupendo material, muchas gracias! y para los que estáis empezando os recomiendo este curso sobre
desarrollo iOS es fantástico, con una base inicial creo que es más fácil y rápido entender la información valiosa que encontramos en la red como esta. Saludos
Felicidades, muy bueno!!
Pero una cosa que no he podido hacer es, como dijeron en un post anterior, enviar datos desde la primera a la segunda.
segundoViewController.cajaTexto.text = @”Texto que envio”;
segundoViewController.title =@”Detalle Segundo VC”;
Podrias explicar como lo solucionaste?
Muchas gracias y felicidades de nuevo!
En ios 6.1, el methodo [self dismissModalViewControllerAnimated:YES]; ha sido reemplazado por dismissView Controller Animated:(BOOL) completion: ^(void)completion, como o adapto tu codigo a esto? Gracias
Hola Neysser,
Básicamente sería lo mismo, dado que el completionBlock es opcional.
Bastaría con que pusieras:
[self dismissViewControllerAnimated:YES completion:nil];
Un saludo.
Muchas gracias por el tutorial. Acabo de introducirme en este mundillo de apple y me está costando horrores comprender los entresijos de este lenguaje… Toda ayuda es poca y la verdad es que estoy muy agradecido porque encontrar información tan buena es una odisea. ¡¡Sigue así!!
P.D: Una pena no haber visto el comentario anterior antes, me ha costado un poco (no mucho jaja) solventar lo del metodo deprecated
[self dismissViewControllerAnimated:YES completion:nil]
Me hubiera ahorrado ese tiempo, venía justo a compartir esta información acerca del método.
De nuevo gracias por tu gran tutorial, estoy completamente liado…
Partiendo de tu código, no consigo hacerle el dismiss al teclado, y por mucho que le doy a return el teclado no desaparece, ¿Qué debería hacer?
Gracias de antemano.
Buen tutorial para practicar y funciona.
Para los que lo intenten me ha pasado lo siguiente:
1.- Hay que llevar cuidado con lo que ves en el SB y lo que sale en el simulador ya que el UITAB altera las distancia entre los distintos elementos, ( y no hablemos de teclado que sale en el SVC, que si te descuidas te tapa el boton).
2.- El tamaño de la label influye en el texto que ves ademas hasta que no le he decjarado con “self.etiqueta.text= @”Juan”, en lugar de con el NIL de siempre no he visto el esto devuelto, cosa sorprendente
Gracias por el tutorial.