[Powered by Google Translate] [Seminario] [iOS: Escritura de aplicaciones Like a Boss] [Tommy MacWilliam] [Harvard University] [Esta es CS50.] [CS50.TV] Muy bien, todos, bienvenidos a iOS: Escritura de aplicaciones como un jefe. Este seminario va a centrarse en la escritura de aplicaciones para el iPhone ya su vez escribir aplicaciones para el iPad, y por lo que estamos básicamente va a caminar a través de un par de ejemplos diferentes de cómo hacer una aplicación, un juego tan simple como Tic Tac Toe, o si usted está más interesado en hacer una aplicación como una especie de lector de noticias o algo que interactúa con el Internet voy a hablar de eso también. Aquí está nuestra agenda breve. Aplicaciones IOS están escritos en un lenguaje llamado Objective-C, por lo que este es un poco similar a C, pero en realidad no en todos, por lo que vamos a hablar un poco sobre el lenguaje en sí mismo y luego cómo construir aplicaciones para el iPhone usando este programa aplicación llamada XCode, que si no lo has descargado aún no dude en iniciar la descarga ahora mismo. Es varios gigabytes. Debe estar libre en la App Store, así que usted tendrá que tener un Mac idealmente ejecutando la última versión de OS X. Si no es así, no hay problema. Contamos con equipos Mac en el centro de la ciencia disponible para su uso con XCode instalado, por lo que no dude en utilizar los de desarrollo. Si quieres hacer una aplicación, pero no tienen una Mac, no te preocupes. Hay un montón de recursos del campus para eso. Y entonces vamos a cubrir dos grandes ejemplos de aplicaciones diferentes que usted puede hacer. Objective-C es técnicamente lo que se llama un superconjunto de C. Eso significa que cualquier código C es también válido Objective-C código. Eso quiere decir que tipo de conducto hiciera en algunas características adicionales a C. Algunas de estas características incluyen no tener que escribir siempre malloc nuevo, gracias a Dios, sin tener que preocuparse acerca de los punteros estúpidas y liberarlos y todo eso que odiaba de C, y es una especie de pasado en Objective-C. Ahora, Objective-C también tiene una biblioteca estándar mucho más grande, por lo que hay mucha más funcionalidad que te pasa por dentro libres de Objective-C. ¿Recuerdas cuando estábamos escribiendo PHP nos dimos cuenta de que hemos pasado de este pequeño lenguaje para la biblioteca gigante de todas estas cosas locas que puede hacer. Lo mismo sucede en iOS. Hay objetos para cosas como el calendario budista, y nada realmente que posiblemente puede pensar probablemente ya existe en la aplicación de Objective-C. La parte objetiva de Objective-C hace referencia a algo llamado Programación orientada a objetos. Esto es un poco de un concepto nuevo, pero en realidad hemos aprendido en su mayoría muchos de estos conceptos ya. La idea detrás de Programación orientada a objetos es que usted va a estructurar una gran parte de su código en torno a estas cosas llamadas clases, y estas clases son realmente glorificado estructuras. En el interior de una estructura que básicamente dice aquí es una cosa, y esto puede tener miembros. Por ejemplo, un nodo en una lista enlazada podría tener otras cosas como un valor, un puntero al siguiente nodo en la lista, y juntos ese puntero y el valor que compone esta instancia de una estructura. Las clases son muy similares, excepto clases también pueden tener funciones dentro de ellos. Cuando declaramos una estructura, sólo podríamos decir int n o * siguiente nodo. Ahora con Objective-C se puede poner realmente las funciones dentro de esas cosas. Otra cosa que puedes hacer es clases pueden heredar de otras clases de datos. Por ejemplo, vamos a estar buscando en un montón de clases incorporadas de Objective-C. Una de ellas podría ser la clase que representa la visión de una pantalla, y así, diciendo que quiero aplicar mi propio punto de vista que básicamente dice a alguien en Apple, la gente probablemente muy agradable, escribió esta clase para mí, y maneja las cosas como mostrar botones o la prestación de la pantalla, y que sería muy dolorosa aplicar toda la funcionalidad que nosotros mismos, y así simplemente heredando datos podemos decir todo lo que hiciste en esa clase Yo también quiero dentro de mi clase, y luego me voy a hacer algunas otras cosas, es decir, implementar una aplicación. Eso es lo que significa la palabra herencia. Vamos a ver un ejemplo más concreto. Y, por último, la clave de programación orientada a objetos es que que conduce a la encapsulación de datos. En algunos de nuestros boletines de problemas que podríamos tener estas grandes variables globales, y globales en todas partes, y así es como nos gustaría llevar un registro de estado. Con las clases podemos empezar encapsular información dentro de un objeto. Si tenemos una pantalla en nuestra aplicación, que en realidad no necesita tener ningún dato de otra pantalla en el interior de nuestra aplicación de que, por lo que al encapsular las cosas dentro de las clases de esta realidad conduce para diseño de código mucho mejor, y esto es posible con algunas de las características adicionales de Objective-C. Aviso previo, la sintaxis para Objective-C es el banano. Esto se parece a nada que hayamos visto antes, por lo que es un poco de una curva de aprendizaje para acostumbrarse ¿qué diablos significa esto? Pero una vez que pasas esa curva de aprendizaje inicial es muy, muy suave para empezar a escribir aplicaciones. Para declarar una clase, por no decir esta es mi clase, existe, y tal vez aquí hay algunas cosas que voy a definir más adelante, Voy a decir @ interface. Voy a decir @ interface. Voy a dar mi clase un nombre. Y más tarde en otro lugar voy a decir @ end, y todo en medio de la interfaz y el extremo @ @ va a ser mi clase. Eso va a ser lo que hay dentro de nuestros archivos. H. Al igual que en C los archivos. H básicamente dijo aquí hay algunas cosas que existirán. No estoy diciendo necesariamente lo que hacen, sin embargo, pero el compilador necesita saber que ellos existen. Más tarde, en el interior de nuestra. Archivos m-m porque para Objective-C es donde estamos en realidad va a definir lo que estas clases lo hacen. Al igual que nuestros archivos. C, proporcionamos una implementación para las funciones. Dentro de nuestra. M fichero que vamos a decir aquí es lo que todas las funciones dentro de mi clase-lo que todos hacen. Y, por último, en el interior de una estructura que podríamos decir dentro de las llaves int, n o nodo siguiente * y en Objective-C que vamos a utilizar la palabra clave @ property, y esto es lo que va a definir las propiedades, o las funciones no-que son una parte de mis clases. Llamar a funciones en Objective-C es también plátanos. Cuando declaramos funciones en C que decía algo así como int foo y abierto paren y luego le dio una lista de argumentos. Esto es lo que declara los métodos o funciones se ve como en Objective-C. Si quiero declarar una función o un método donde yo estoy diciendo método es en realidad una función que es un miembro de una clase, tan amable de intercambiables, pero no realmente, tan dentro de mi método que desea crear un nuevo método. Se va a devolver ningún valor, así que va a ser de tipo void. Este es el tipo de retorno de mi función. Ahora tenemos paréntesis aquí porque-no lo sé. A continuación va a ser el nombre de mi función, y, finalmente, tenemos un punto y coma al igual que tuvimos en C. Lo que es nuevo aquí es que este tipo aquí. Este guión es realmente necesario, y es lo que este dice que Este método debe ser llamado aquí en una instancia de una clase. Después declaramos nuestras estructuras es probable que decía algo así como n struct nodo, y que en realidad creó o instancias de una de esas estructuras a fin de que yo podía empezar a trabajar con lo que hay dentro de ella, por lo que este guión significa que tenemos que instancia de la clase al igual que nosotros instancia que struct antes de que podamos llamar a este método en él. Si quiero empezar a añadir argumentos a mis métodos se vuelve aún más plátanos. Aquí está mi nombre de método. Entonces me voy a tener dos puntos, y después de esto que dice aquí dos puntos viene algunos argumentos. Este método toma un argumento. El tipo de su argumento es un entero, y el nombre de ese argumento o la variable que voy a empezar a usar dentro del método se llama i. Una vez más, este es el método. Toma un argumento. Si quieres empezar a añadir más argumentos se pone más bananas en que tenemos este colon que dice aquí viene mi lista de argumentos. Este primer argumento es un número entero. Ahora bien, este segundo argumento es interesante. La variable que voy a usar dentro de mi función se llama f, tan dentro de mi función que podría decir f + = 1 o algo así. Esta cosa aquí es, básicamente, una clave para que el argumento o parámetro. Al igual que hemos tenido pares de clave-valor y algo como JSON o arrays asociativos Objective-C tomó la decisión de decir, bueno, sólo para que sea realmente transparente cuando se llama a un método que todos estos parámetros son De hecho voy a nombrarlos a todos. Cuando se llama a un método, que realmente va a decir andFloat, y entonces te va a pasar pulg Curiosamente, este no se nombra, pero son todos de los otros parámetros, por lo que si teníamos un argumento tercero que pudiera decir andFloat y otro flotador y así sucesivamente. Al llamar a estos métodos es de plátanos de los cursos, por lo que si tengo un objeto, y se define un método llamado foo, y quiero llamarlo, en lugar de decir foo abrir / cerrar paréntesis Voy a abrir un soporte. Este es el nombre de mi método. Voy a cerrar el soporte, y este es el objeto que estoy llamando a encenderlo. Recuerde, todos estos métodos existen dentro de las clases ya que las clases pueden tener métodos definidos dentro de ellos. Aquí he arbitrariamente creado un objeto de una clase, y esta es la sintaxis para hacerlo. Hay dos pasos para crear un objeto. El primer paso es decir que desea asignar el espacio. Este es el equivalente de un malloc. No tenemos que decir malloc nunca más. Nos dejó la m, hizo alloc, y sustituyó a la c. Con. M. Después de algo alloc que entonces tenga que inicializar. Básicamente, cuando se crean objetos es posible que desee tener algo de lógica que se ejecuta cuando se crea, por lo que puede pasar en algunos valores por defecto o algo así, por lo que este método init es lo que realmente crea el objeto. En primer lugar, asignar el espacio, tal como lo hicimos en C, y luego inicializarlo, que puede o no puede hacer mucho. Entonces estamos volviendo esta cosa en un objeto o. Hay una estrella aquí porque esto es técnicamente un puntero, pero no te preocupes, los punteros no son gran cosa en Objective-C más. Ahora hemos instancia esta clase llamada NSObject, y esto es sólo una clase al azar que Apple tiene. Hemos instancia esto, y ahora tengo una instancia de esta clase en este objeto o, lo que significa que si se define estos métodos les podía llamar así. Del mismo modo, si quería llamar a un método con un argumento, por lo que este es el método de bar, que toma un argumento, y aquí está el baz: Método qux, por lo que esto toma 2 argumentos. Esto se llama una función de este o de objetos. Tiene sentido? La sintaxis debe tener sentido, pero que tipo de acostumbrarse a él. Bueno, vamos a hablar de algunas cosas que se construyen en Objective-C que no necesariamente se construyeron en C. En C que de alguna manera tenía que lidiar con estas cadenas como matrices de caracteres estúpidos, y se puso muy molesto. Objective-C tiene todos los construidos en para nosotros, y está construido en uso de esta clase NSString llamado. Cuando quiero crear un NSString tenemos sintaxis más arcano. En vez de decir "CS50", decimos @ "CS50" y esto es sólo la sintaxis para declarar cadenas en Objective-C. Esto es muy fácil de olvidar, así que no lo hagas. Ahora, una vez que tengo esto, esto es una cadena, pero note no deja de ser un objeto. Dije NSString, lo que significa que una instancia de la clase llamado NSString, que alguien escribió para mí, y que era muy agradable sobre él, y por eso ahora Puedo empezar a llamar a los métodos en él. Si llamo a la longitud de este método s objeto que va a volver a mí la longitud de la cadena. Esto es igual que strlen en C. Esto devuelve 4. Asimismo, otro método que puede ser que desee tener en cuenta es esta characterAtIndex. Este es un método que dice en esta cadena s Quiero que para obtener el carácter cero, por lo que este volviera a mí el carácter c, y hay un montón más de estos métodos que usted puede buscar en Google con mucha facilidad. Documentación de Apple es grande, y vamos a echar un vistazo a eso en un momento. Los que son cadenas. También hemos arrays de tamaño variable construido adentro Recuerde que en C cuando declaramos un arreglo que teníamos que decir tiene 5 elementos, fin de la historia. Cuando llegamos a JavaScript y PHP podríamos empezar hacer las cosas como la adición de elementos o elementos móviles. Podemos hacer lo mismo en Objective-C. En lugar de crear una matriz en la forma normal de C tenemos de nuevo otra clase llamada NSMutableArray. También hay NSArray, y esto va a encapsular básicamente algunos matriz. Esto nos dice que lo primero que quiero hacer es que quiero asignar espacio para una nueva matriz, y después de que se asignen Entonces necesitamos para inicializarlo. Una vez más, sólo llamar a estos dos métodos. Ahora bien, esto significa que dentro de este objeto un Tengo una matriz vacía sentado allí. Si quiero añadir algo a esta matriz, me puede llamar al método AddObject. Quiero agregar un objeto a la matriz a, y quiero agregar la cadena CS50. Si quisiera eliminar el contrario, que puedo decir que me quieres eliminar el objeto en primer lugar en la matriz o un objeto. Tiene sentido? Está bien, que tipo de acostumbrarse a esto corchetes. Por cierto, en el interior de una gran cantidad de bibliotecas de Apple verá esta DR. El NS realmente significa para el paso siguiente, que era una de las primeras empresas Steve Jobs, y ahí es donde realmente empecé a escribir un montón de código como una especie de base para Mac OS X y todas las otras cosas, por lo que este tipo de NS es este legado agradable gritar a una de las empresas anteriores vuelta cuando Apple estaba empezando. Está en todas partes. Echemos un vistazo a un enfoque más holístico Objective-C ejemplo. Aquí estoy dentro de XCode. Para llegar hasta aquí, lo primero que XCode descargado de la App Store, lo abrió, y luego subí aquí al expediente, aquí a nuevo proyecto, y luego. Después de hacer eso tengo todas estas opciones de lo que quiero crear, por lo que vamos a echar un vistazo a estas opciones más adelante, pero sólo para este ejemplo, porque no estamos realmente va a tener una aplicación, sin embargo, Vine aquí y me dijo herramienta de línea de comandos, y esta es una aplicación que podría correr en la línea de comandos al igual que hemos estado huyendo de C. Así es como he creado este proyecto, y por eso ahora que estoy aquí, así que vamos a ver por primera vez en este archivo, y esto debería ser bastante familiar. Tengo un nombre int. Ahí está mi amigo argc, argv mi otro amigo. Y así podemos ver que este es el punto de partida de mi primer Objective-C de la aplicación. Aquí podemos ignorar esto por ahora. Esto es básicamente un poco de materia de gestión de memoria que se quiere en realidad no nunca tiene que preocuparse. Echemos un vistazo a este primer bloque aquí. Esta primera línea, si digo Estudiante * alice = [[Estudiante alloc] init] qué hace eso? Este estudiante por primera vez aquí, esta es probablemente una clase. Esto no es una clase que Apple escribió, pero es una clase que escribí. Lo primero que quiero hacer es que quiero asignar espacio para un nuevo estudiante, y luego quiero que lo inicie, así que esto me da la espalda este objeto nuevo estudiante, y estoy almacenar esto en una variable llamada Alice. ¿De dónde vino esa clase viene? Bueno, aquí en el lado izquierdo son todos los archivos diferentes en el interior de mi proyecto. Podemos ver aquí tengo un Student.h y Student.m a. El archivo. H, recuerde, es donde yo declaro todas las cosas que existen dentro de la clase. Vamos a echar un vistazo a eso. Muy bien, aquí tenemos esta interfaz @, y esto dice que aquí viene las declaraciones de todo lo que existe dentro de mi clase. Entonces tengo dos puntos. Entonces tengo esta cosa NSObject. Esto significa que dos puntos bit de herencia que estábamos discutiendo un poco antes. Esto nos dice todo lo que un NSObject puede hacer donde NSObject es esta clase escrita por alguien más, todo esto se puede hacer NSObject Quiero ser capaz de hacer eso. Al decir: NSObject que significa que, básicamente, heredado toda la funcionalidad de otra clase. Eso me dio un montón de diferentes métodos y propiedades que se pueden utilizar. Aquí abajo estoy creando dos propiedades. Eso significa que mi estudiante, si se tratara de una estructura, éstas serían las 2 cosas dentro de mi estructura, por lo que cada estudiante tiene un nombre que es una cadena, y el estudiante también tiene un grado, que es un int. Por último, aquí voy a crear un método para mi estudiante. Llamé a mi método, initWithName, y se necesita un argumento, y ese argumento es una cadena, y me llamó de todo. Ahora echemos un vistazo a la forma en que realmente implementado esta clase. Aquí, ahora estoy dentro de mi. Archivo m, m para la implementación, supongo. Tengo mi aplicación, mi fin, y aquí es donde realmente estoy definiendo initWithName lo hace. Tengo initWithName, el nombre de mi parámetro, y entonces este es donde en realidad estoy creando un estudiante, por lo que este es un poco críptico, pero esto es un poco repetitivo que desea incluir en sus constructores. Esta función de inicialización aquí, initWithName, es un tipo de constructor. Básicamente, se está construyendo un objeto nuevo estudiante y tal vez el envío de algunos datos dentro de la misma. Lo primero que quiero hacer es que quiero llamar a init en esta cosa super. Recuerde que cuando le dije de nuevo aquí en el expediente. H que todo lo que un estudiante tiene una NSObject también lo ha hecho. Esto significa que cuando creo un estudiante lo que también tiene que hacer es asegúrese de que el NSObject que estoy heredando todos los datos de También se ha inicializado correctamente. ¿Qué tengo que decir es que este súper es en realidad va a hacer referencia a la clase padre que estoy heredando de, así que quiero asegurarme de que inicializar todo lo que estoy dependiendo de antes de empezar a tratar de usarlo. Luego, si ese inicializado correctamente esto es como decir si malloc no volvió nulo entonces puedo empezar a configurar algunas propiedades. En JavaScript y PHP habíamos esta palabra clave se llama esto, y esto hace referencia a la instancia actual de una clase. En Objective-C llamamos a esto mismo. Cuando digo self.name, que significa que el objeto Acabo de crear cuando dije alloc estudiante init, que me va a devolver un objeto. Eso significa que desea establecer el nombre de ese objeto a lo que me acaba de pasar pulg Al igual que en C, tenemos acceso a los miembros de este punto, así self.name dice el nombre del objeto de estudiante ahora va a ser lo que acaba de pasar pulg Y así, por fin, puedo volver así que en realidad recuperar algo. ¿Preguntas? Bueno, por lo que este auto = super init, si usted no entiende totalmente las cosas herencia no se preocupe. Sólo sé que si alguna vez quieres hacer tu propio método init sólo hacer eso, y usted estará listo para salir. Si. >> [Estudiante] ¿Qué significa si mismo? Esto significa que cuando malloc algo que siempre se comprueba si era igual a null, y si era nulo, entonces salimos. Esta es la misma cosa, porque si esto devuelve null, entonces probablemente va a culpa seg si comenzamos a tratar de manipular. Esa es nuestra clase estudiantil. Eso significa que podemos iniciar a nuestros alumnos en una de dos maneras. Si digo alloc estudiante init no estoy usando ese método que acabo de escribir, y en lugar de simplemente puedo decir alice.name, y ahora me voy a poner ese nombre de propiedad. Del mismo modo, si quiero usar ese método initWithName Simplemente puedo decir alloc, a continuación, en lugar de decir init Voy a llamar a ese método que acaba de crear, y lo voy a pasar en Bob. En este punto, este objeto Bob tiene un nombre igual a Bob. Bueno, aquí estoy usando que NSMutableArray que vimos anteriormente. Estoy asignando space.Then Estoy inicializar una nueva matriz. Voy a añadir dos cosas a la misma. Esta matriz tiene ahora objetos estudiantiles. Tenga en cuenta que en ninguna parte he de decir que es un conjunto de estudiantes. He dicho que es un array, y punto. Entonces puedo poner lo interior de lo que yo quiero. Aquí tengo dos objetos. Por último, tengo otro objeto aquí, este TF. Aquí en TF.h básicamente la misma cosa. Estoy heredando de NSObject, y por cierto, al crear clases de todo esto es hecho por ti, este tipo de interfaz repetitivo. Tiene una propiedad de los estudiantes. Tengo un par de métodos que aquí realmente no hacen mucho, y por lo que significa que después de crear este objeto TF Me puede llamar a este método de grado sobre el mismo de esta manera. ¿Tiene preguntas sobre sintaxis de Objective-C antes de empezar a pasar a algo más cosas interesantes desarrollo de aplicaciones? Está bien, así que vamos a hacer realidad una aplicación para el iPhone. Las clases principales que usted va a utilizar dentro de su aplicación para el iPhone se llaman controladores de vista, y un controlador de vista representa básicamente una sola pantalla dentro de su aplicación, por lo que si estoy en la aplicación de música, por ejemplo, un controlador de vista podría representar la vista en la que puedo ver todas las canciones en mi iPhone. Otro controlador de vista podría ser cuando hago clic en una canción y empezar a jugar o como me estoy profundizando en los artistas. Cada una de esas pantallas diferentes puede ser representada como un controlador de vista diferente, y un controlador de vista es en realidad una clase que dice cómo funciona esta pantalla. Las cosas en el interior de un controlador de vista, vamos a tener propiedades, así que cosas como un botón que va a ser una característica de nuestro controlador de vista. También vamos a disponer de métodos, y estas son, básicamente, los controladores de eventos. Este método dice que cuando se pulsa este botón Quiero hacer algo, y finalmente, de nuevo, vamos a utilizar esta palabra clave auto para acceder a la instancia actual. Para construir interfaces en iOS es realmente muy, muy fácil. Tienen esta drag drop interfaz agradable y llamó Interface Builder, y los 2 conceptos básicos que cablear su Objective-C a Interface Builder son IBOutlet y IBAction. Un IBOutlet simplemente dice que si se declara una propiedad que es un botón, y desea conectarlo a algo en la interfaz de usuario actual, vas a decir que es una salida. Del mismo modo, si se quiere representar un controlador de eventos entonces usted va a decir que es una acción. Para cablear en realidad esta representación gráfica y su código es muy, muy simple. Si desea adjuntar un IBOutlet, todo lo que tienes que hacer es controlar click, y vamos a ver un ejemplo de esto muy rápido. Usted controla click donde dice View Controller. Usted va a arrastrar a la interfaz, o por el contrario, si desea conectar un controlador de eventos que va a arrastrar desde la interfaz en la otra dirección. Echemos un vistazo a un ejemplo iOS realmente simple. Vamos a crear un nuevo proyecto. Voy a venir aquí a la aplicación, y yo voy a haga clic en Aplicación de vista simple. Voy a hacer clic en Siguiente. Voy a dar mi proyecto un nombre. Voy a llamar Hola. Curiosamente, Apple da por hecho que va a crear un producto de modo que usted puede vender y que pueden ganar dinero. Aquí abajo os voy a decir que se trata de una aplicación para el iPhone. Puede crear una aplicación para el iPad, o si desea crear una de esas aplicaciones que soporta tanto dispositivos que usted puede hacer eso también. Esto es lo que usted quiere que sus marcas de verificación para que parezca. Usted desea utilizar guiones gráficos, que veremos más adelante, y que debe de utilizar el recuento de referencias automática, que es una buena característica que le impide tener que decir malloc y libre. A menos que quieras llamar malloc y libre, me deja seleccionada. Voy a hacer clic en Siguiente y, por último, este me va a preguntar dónde desea guardarlo. Voy a golpear crear, y aquí vamos. He creado un nuevo proyecto. Por aquí a la izquierda están todos los archivos que hay dentro de mi proyecto, y note que tengo un montón, y yo ni siquiera hacer nada. IOS es grande. Por ejemplo, aquí esta ViewController.h, esto va a representar a mi controlador de vista en primer lugar, por lo que la primera pantalla dentro de mi app. Ahora sabemos lo que esto está diciendo. Estamos diciendo que estoy llamando a este ViewController clase, y un ViewController hace todo lo que hace un UIViewController, y esto, de nuevo, es una clase que Apple escribió que hace un montón de cosas útiles para nosotros gustaría mostrar la pantalla. Aquí es donde realmente puede empezar a definir lo que mi controlador de vista hace, y resulta que yo realmente no necesita nada de esto. Esto es código repetitivo que Apple me da de forma gratuita. Me hacía falta esa primera línea, o no tengo una clase, para que podamos deshacernos de eso y librarse de esto. Bien, esta es mi pantalla en blanco. Ahora vamos a hacer clic en este MainStoryboard.storyboard, y aquí es donde empieza a ponerse interesante. Esto representa la primera pantalla en mi aplicación. Si desea agregar un botón, en HTML que tuve que crear una etiqueta de botón. En Android tienes que crear una etiqueta de botón, pero en iOS si sólo vienen aquí a la esquina inferior derecha y si hago clic en esta tercera aquí donde dice objetos, y que puede desplazarse hacia abajo, o puedo iniciar la búsqueda de botón. Y mira, un botón, así que si realmente arrastrar y soltar esta ahí, He añadido un botón para esta pantalla de mi app. Si quiero cambiar el texto, puede hacer doble clic en él, decir algo tentador como "Press me". Bien, ahora si me quedo esta aplicación, por lo que compilarlo, por lo que para ejecutar hago clic en el botón de reproducción en la parte superior izquierda, y ahí está mi aplicación. Yo no he hecho nada, y me dieron un dulce mirar aplicación iPhone. Si quiero pararlo, puede hacer clic en el botón de parada porque es más divertido. Digamos que yo realmente quiero que pase algo al pulsar este botón. Para hacer eso lo que tengo que hacer es lo que necesito para crear un nuevo controlador de eventos o una acción. Eso significa que tengo que crear algún método que yo quiero ser llamado cuando se presiona el botón, así que vamos a crear un nuevo método. Yo estoy dentro de ViewController.h. Tengo que decir que existe un método. Necesito un guión primero, porque voy a estar llamando a esto en el controlador de vista. Tengo que dar a este un tipo. El tipo de este va a ser esa cosa IBAction que hemos visto anteriormente. Se trata de un controlador de eventos, por lo que va a devolver un IBAction, y esto es un indicio para XCode decir que esto es algo que quiero conectar algo. Puedo darle un nombre, como punto y coma buttonPressed,. Ahora he declarado un nuevo método dentro de la clase. Lo he dicho método tiene que existir. Ahora vamos a entrar en ViewController.m, y digamos que lo que este método puede hacer. Si me pongo a escribir, por ejemplo, (void) buttonPressed Aviso XCode es realmente agradable y completa automáticamente para mí. Eso es realmente maravilloso. Nótese aquí que dentro del archivo. M También puedo decir nula, y esto se debe a que IBAction no es realmente un tipo. De hecho, es hashtag definido en alguna parte que un vacío, y de nuevo, esto es sólo una sugerencia para XCode que dice Yo quiero que esto sea un controlador de eventos, y vamos a ver por qué en tan sólo un segundo. Cuando se pulsa este botón Voy a hacer algo molesto desea mostrar una ventana emergente. Para que yo pueda crear una nueva instancia de esta clase llamada UIAlertView, y esta es una clase que Apple escribió que va a mostrar popups molestos. Llamaremos a esta alerta emergente, y tengo 2 pasos, recuerda, a la creación de este objeto. Lo primero que hay que hacer es asignar el espacio. Quiero un UIAlertView. Quiero asignar espacio. Ese es mi primer método. Mi método siguiente es que quiero ser inicializada, y por lo que tengo este método grande y larga llamada initWithTitle. Eso es básicamente lo que va a controlar esta emergente dice. El título de mi ventana emergente se puede saludar. El mensaje de esta ventana emergente puede estar "Esta es iOS." Lo Delegado, no sé qué es eso. Digamos que no es nada. Ahora el botón que va a aparecer puede decir algo así como "Claro que lo es", y yo realmente no quiero ningún otro botón, así que vamos a borrar eso y cerrar el paréntesis. Bueno, he creado uno extra. Ahí vamos. Así es como puedo crear una nueva ventana emergente. Si desea mostrar la ventana emergente en realidad quiero llamar al método show. Para hacer lo que puedo decir de alerta y mostrar, y otra vez, autocomplete era súper agradable. Si me olvidé de lo que era, si me acaba de escribir en s, Puedo recorrer aquí para saber lo que era, y se filtra muy bien. Ahora he creado esta nueva ventana emergente. Volveremos a lo que significa delegado después, y ahora quiero decir que quiero a este método para ser despedido cuando se presiona el botón, así que voy a volver a mi storyboard, y quiero fijar ahora esta IBAction. Lo primero que quiero hacer es hacer clic en el botón. Al pulsar este botón, quiero que pase algo. Yo no voy a mantener pulsada la tecla Control. Voy a hacer clic y arrastrar con el botón para acá donde dice View Controller. Podemos ver que bien se enciende. Si te dejo ir con mi ratón ahora tengo esa ventana por aquí donde tengo algunas opciones. Uno de ellos son los eventos que pueden registrarse. Estos son todos los métodos declarados yo en mi archivo como IBActions h. Así es como XCode sabe lo que debe aparecer en esta lista poco, así que eso es sólo una sugerencia. Si hago clic en el botón presionado, ahora he registrado el controlador de eventos. En JavaScript tuvimos que decir que tengo algo de código que registra el controlador de eventos. En Objective-C es realmente tan fácil. Si me encuentro de nuevo Ahora al pulsar el botón de mi controlador de eventos se va a despedir, y me voy a poner esta emergente. Super, super simple allí. Si alguna vez quieres ver todos los eventos que están registrados en un componente si hago clic en este botón y vengo aquí a la derecha primero que puedes ver aquí lo que puedo hacer cosas como el tipo de botón, así que si quieres uno de esos yoes o el botón de Agregar contacto o lo que sea. Si desea ver todos los eventos que están en este botón si yo voy todo el camino hasta aquí a la derecha podemos ver aquí en los eventos que tienen todos estos eventos. Me puede presionar el botón, cuando me soltó el botón, cuando hago doble toque o lo que sea, y el que me acabo de registrar este evento es llamado Touch Up Inside, y este dice que tan pronto como mi dedo sale el botón ese evento va a fuego, y eso es exactamente lo que acaba de suceder. Este es el tipo de evento de botón predeterminado presionado. Cualquier pregunta hasta ahora? Bueno, así es como podemos empezar a cablear las cosas en nuestro código en las cosas dentro de nuestra interfaz. Recuerde que lo primero que tenía que hacer era encontrar el código, y luego hasta el cable de interfaz al código, y ahí está nuestra primera aplicación. Bien, eso fue realmente genial, y hemos creado este botón. ¿Y si no lo hacemos quiero tener que crear un montón de propiedades representando estos botones? Por ejemplo, en Tic Tac Toe Tengo 9 botones, y que sería super, súper molesto tener que arrastrar y soltar 9 veces o si tuviera que hacer tres en raya con 81 en lugar de 9 y tuve que arrastrar y soltar 81 veces, y eso es cojo. Lo que podemos hacer en su lugar es como un HTML cuando teníamos cosas como identificadores y nombres y podemos buscar las cosas por su ID, hay un concepto similar en iOS llamadas etiquetas. Una etiqueta es simplemente un identificador numérico único para un componente. Si digo esto tiene una etiqueta de 0, por ejemplo, si creo un botón y darle una etiqueta de 0, y vamos a ver cómo hacer eso en un segundo, si quiere conseguir que el botón que se puede decir simplemente quiero llamar la, viewWithTag método en el objeto aquí la self.view, que representa la pantalla actual, por ejemplo. Si llamo a ese método viewWithTag, me voy a tirar del botón con la etiqueta 0. Vamos a echar un vistazo a este edificio por Tic Tac Toe. En primer lugar, este es mi storyboard. He creado estos 10 botones de interfaz de usuario. Tenga en cuenta que son todos del mismo tamaño. Si hago clic en uno de estos y vuelvo por aquí en este lado derecho verás que ajustar el tipo de letra aquí, así que hice la fuente un poco más grande, pero lo que yo también hice fue establecer esta etiqueta. Le dije que esto tiene una etiqueta de 1, y esa es la parte superior izquierda. Ahora bien, si hago clic en otro botón, como este segundo aquí, ahora vas a ver que mi etiqueta es 2. Cada uno de estos botones sólo tiene una etiqueta única, por lo que esta tarde se como voy a empezar a interactuar con mi aplicación. Todo esto está dentro de un controlador de vista, pero esto es lo que tenemos. Tenemos 3 propiedades aquí. El primero y el último se va a representar el estado de mi tabla. Básicamente, este primero es una matriz que representa en la Xs y Os lo son. Este otro aquí nos dice a quién le toca. Se dará cuenta de que yo también tengo esas cosas aquí. Antes, cuando declaramos propiedades que les dio un nombre y un tipo. También se les puede dar alguna información adicional aquí. La primera dice que no atómica, y lo que dice este es, básicamente, una sola cosa cada vez se intenta acceder a esta variable a la vez. Usted podría hacer aplicaciones más complejas que son multi-hilo, y así de nuevo en Scratch teníamos diferentes hilos, y sprites diferentes podrían estar haciendo cosas diferentes al mismo tiempo. Si ese no es el caso, lo cual no es nada de lo que vamos a estar mirando, si decimos que no atómica en realidad va a hacer las cosas un poco más rápido. También tenemos esta cosa llamada asignación, fuerte o débil. Esta asignar sólo dice que se trata de un modelo estándar. Esto no es un objeto o un puntero, porque esto es sólo un bool, así bool está integrado en Objective-C. Este dice que no se trata de hacer algo de fantasía con punteros aquí. Es un habitual escalador de edad. Fuerte y débil, tan débil dice que en realidad Quiero que esto se apunta a algo en el controlador de vista. Yo no voy a asignar init real o yo mismo. El constructor de interfaz, al ejecutar la aplicación, se va a manejar todo lo que la inicialización. Si digo débil, que dice que alguien más va a ser la creación de este. Si digo fuerte, esto dice que yo voy a ser el que que está creando este objeto bordo, y aquí tengo algunos otros métodos aquí, por ejemplo, una acción para cuando el botón se pulsa nuevo juego, una acción de cuando cualquiera de los otros botones se presionan, y etcétera. No vamos a entrar en demasiado de la lógica de Tic Tac Toe, aunque es muy emocionante, pero vamos a echar un vistazo a algunas de las cosas que podemos hacer dentro de iOS. Este método nuevo juego va a ser despedido cada vez que pulse el botón de nuevo juego. Para conectar hasta que yo simplemente venir a mi storyboard. He hecho clic en nuevo juego. Si vengo aquí a la derecha puedo ver que Toque en el interior está conectado con el método newGame. Es por eso que esto va a ser despedido. El método newGame va a hacer un poco de puesta a punto. Va a decir que quiero que borrar el estado de la junta. Este es un buen método de matrices mutables. Esto va a decir ahora es el turno de X, y ahora me voy a tomar ventaja de esto viewWithTag. Sé que mis botones tienen las etiquetas 1-9, y eso es algo que arbitrariamente elegido. Si desea ajustar el texto de cada botón que está vacío porque acabo de empezar un nuevo juego y yo no quiero Os X o quedarse más de lo que puedo hacer esto. Puedo decir que desea que la vista con la etiqueta, 1, 2, 3, 4 et cetera. Esto hará que un botón diferente cada vez. Aquí me voy a echar a UIButton. Al igual que podríamos echar a ints carrozas y viceversa esto dice que me quiere echar a un UIButton. Eso significa que el tipo de este será un * UIButton porque de punteros, pero no te preocupes, no es miedo nunca más. Una vez que tengo este botón Voy a llamar a un método en él. Este método se llama setTitle forState, y así lo dice Quiero configurar el texto del botón a ser la cadena vacía, y yo quiero que sea una cadena vacía cuando no está presionado. Si estoy usando este método, puede cambiar el texto del botón tan pronto como alguien lo golpea, pero queremos decir cuando el botón está allí sentado Quiero que el texto en blanco. Por último, vamos a iniciar mi tabla, y yo voy a decir que todo está en 0, por lo que este los miembros del consejo inmutable es una matriz mutable, lo que significa que puede llamar al método AddObject y un interior 0 de él. Eso es lo que ocurre cuando se crea una nueva partida. Echemos un vistazo a otro. Este método aquí es la IBAction que va a ser presionado cada vez que uno de esos cuadrados se presiona. Ahora tenemos algo de lógica Tic Tac Toe aquí. Hemos de averiguar quién le toca, y sobre la base de que, o bien establecer una X o una O, pero nos damos cuenta de que estamos reutilizando el mismo controlador de eventos para cada uno de esos botones. Esto significa que no tienen un método para el botón de arriba a la izquierda, un método diferente para el botón de abajo a la derecha, a pesar de que podría haber hecho. Eso no sería realmente un buen diseño. Lo que estoy haciendo aquí es que estoy realmente va a determinar lo que la etiqueta del botón que se ha pulsado es. Te das cuenta de que este método de reproducción toma un argumento. Se llama remitente, remitente y lo que se está remitente va a representar exactamente lo que se tomó acción sobre. Si se presiona un botón, este remitente va a ser que UIButton que realmente presionado, lo que significa que esa UIButton tiene una etiqueta porque he creado una etiqueta. Si quiero llegar a la etiqueta simplemente puedo decir Quiero que la etiqueta del remitente, y de nuevo, acabo de casted a una UIButton. Me he enterado de que el remitente será un UIButton. No siempre tiene que ser un UIButton. Podría, por ejemplo, registrar el mismo controlador de eventos  para un para un botón, una para un control deslizante. En este caso, sé que están todos los botones, así que voy a decir Yo quiero que esto sea un botón, y entonces puedo obtener la etiqueta, y de la etiqueta que ahora sé donde estoy dentro de la tabla. Entonces sólo tiene que fijar bien la X o en la O, puede voltear la vez, comprobar que ha ganado, etcétera. ¿Tiene preguntas sobre esto hasta ahora? Bueno, todo el código que publican en línea-no quiero entrar en demasiado de la lógica del dedo del pie de Tic Tac, pero ahora se puede ver que realmente todo lo que estamos haciendo es que estamos recorrer este array, así que tenemos un par de bucles para aquí, y estamos comparando para ver tenemos un partido en todas las filas, un partido en una columna o algo así. Para ejecutar esta aplicación en realidad, si me toca en uno de estos botones que el método de juego fue despedido, lo que significa que acaba de establecer el botón para ser un X, por lo que ahora este botón será un O, y así sucesivamente, y así es como estamos empezando a interactuar con esta aplicación única página. Vamos a publicar el código, así que siéntase libre para leer que, pero ahora vamos a hablar de algunas aplicaciones que son algo más que una página. Tan emocionante como Tic Tac Toe fue, un montón de aplicaciones dentro de iOS son una especie de estos drill down cosas con múltiples pantallas. El primer concepto que tendremos que hablar son los protocolos, y un protocolo es simplemente un conjunto de métodos que te puedo prometer de definir. Si creo este nuevo protocolo con 2 métodos, este primero, si el tipo de retorno es nulo, lo llamé foo. Esto no tiene argumentos. Tengo otro método. Se devuelve un int. Llamé Bar, y se necesita un argumento. Todo este protocolo es que se llama SomeProtocol aquí, Este es un conjunto de cosas que alguien puede implementar. No he dentro de este protocolo, dijo que foo hace. En su lugar, sólo estoy diciendo que podríamos definir foo si así lo desea. Si yo estoy creando un controlador de vista o la creación de una clase Yo interior puede de esa promesa clase para implementar algunos de estos métodos, así que por ejemplo, si decir esto ahora dice que estoy haciendo una promesa a usted que dentro de de esta clase de controlador de vista voy a tener definiciones para ambos foo y bar. ¿Por qué es útil? Una gran cantidad de componentes internos de iOS aprovechar esta patrón de diseño llamado delegación, y lo que dice la delegación es que, por ejemplo, si tengo un cuadro de texto y hay algunos hechos que podrían ser registrados dentro de mi caja de texto, en lugar de crear eventos separados lo que puedo hacer es lo que puedo decir el delegado de esta caja de texto será de algún objeto. Cuando digo que esto es un delegado que significa que ahora siempre que algún suceso habría sido despedido en el cuadro de texto en lugar de tener que registrarlo ni nada de eso que sólo va a llamar a un método en el delegado. Por ejemplo, en el interior de mi caja de texto tengo un método para cuando pulso que realiza botón en la parte inferior derecha, por lo que en lugar de registrar controlador de eventos lo que puedo decir es cuadro de texto, aquí es un objeto que quiero que llamar a un método en cada vez que alguien presiona el botón Aceptar, y eso significa que ese objeto tiene que implementar algún protocolo que dice que me comprometo a definir que la acción del botón hecho, porque si no define ese método y pulse Hecho, entonces va a ser confuso. Echemos un vistazo a un ejemplo. Aquí sólo tengo un cuadro de texto, y una de las propiedades de esta caja de texto de acá de este lado derecho es el delegado. Esta es una propiedad de la clase. Lo que he hecho aquí es que el control se hace clic, y arrastrar desde este punto de aquí para el controlador de vista, y eso dice ahora el delegado de esta caja de texto va a ser el controlador de vista. Esto significa que cuando algunas acciones ocurren, en lugar de registrar manejadores de eventos independientes que quieren que les envíe al delegado. Ahora vamos a echar un vistazo a mi controlador de vista. Dentro del expediente. H He hecho una promesa. He prometido implementar algunos métodos dentro de este protocolo UITextFieldDelegate llamado, y de nuevo, esto es sólo una lista de algunas cosas que puedo decida implementar. Si vengo aquí en mi. M archivo, he implementado un método. Les he pedido que textFieldShouldReturn porque eso es lo que se llama dentro del protocolo. Y ahora cada vez que pulse el botón interior hecho de que el campo de texto esto es lo que va a ser llamado, por lo que no se registró un controlador de eventos. He conectado el delegado, y siempre que este evento se dispara este es el método que se llamará, por lo que si vengo aquí a mi storyboard y ejecutarlo- mientras que se carga podemos ver lo que hace. En la pantalla de mi tengo 2 cosas. Tengo un campo de texto, y tengo esta etiqueta. Simplemente estoy diciendo que desea que el texto de esta etiqueta a ser igual a lo que el usuario escribió en el interior del campo de texto. Esta línea viene aquí es simplemente un método que yo llamo en el campo de texto que dice que quiero que usted oculte el teclado. Esto es sólo el método arbitrario que Apple eligió. Una vez más, antes de que hiciera cualquier cosa que tuve que cablear todo, así que vine por primera vez aquí. Desde el controlador de vista que arrastrar a la caja de texto. Te dejo ir, y puedo ver aquí que yo puedo hacer esto propiedad text del campo desde aquí en el controlador de vista que he definido una propiedad que es un IBOutlet de un campo de texto. Esto dice que puedo conectar a esta propiedad hasta a un campo de texto en mi interfaz de usuario. Ahora, cuando hago clic en esto puedo empezar a escribir. Ahora bien, si hago clic en el botón Hecho esto va a disparar un evento que ahora puedo responder. No hay controladores de eventos. Así es como me acaba de responder a ese botón hecho. Tiene sentido? Esto no es un patrón de diseño que-que nunca podría encontrarse la creación de su propio protocolo, pero sólo sé que algunos diferentes componentes iOS registrar eventos de diferentes maneras. Botones, por ejemplo, utilizar los IBActions. Los campos de texto, por otro lado, se va a utilizar delegados. Podemos ver y se puede ver todo eso dentro de la documentación. Por cierto, en realidad hay un montón de cosas de interfaz de usuario integrada en iOS para usted, así por ejemplo, la forma en que dicen que hice hace en la parte inferior derecha se He escogido este campo de texto. Yo vine aquí. Me desplazado un poco para volver llave, y que en realidad se puede hacer de este un montón de cosas, como si quisiera decir que llamada de emergencia en lugar de eso puede hacer eso, que es totalmente al azar, y yo no sé por qué hay un botón de emergencia integrado en la llamada, pero, dice llamada de emergencia en letras muy pequeñas. Ahí lo tienes. Definitivamente explorar todas estas opciones diferentes en iOS. ¿Tiene preguntas sobre los delegados? Una vez más, sólo un patrón de diseño interesante que usted debe tener en cuenta. Bueno, vamos a echar un vistazo al lado de las vistas de tabla. A la vista de tabla es básicamente la lista de artículos que está por todo el lugar en iOS. Cuando usted está hojeando todos sus contactos, usted está buscando en la página de configuración, y ese tipo de lista de las cosas que se llama una vista de tabla. La implementación de una vista de tabla en iOS es bastante simple. En lugar de hacer una clase que desciende de que UIViewController como lo hemos hecho antes simplemente tenemos que decir más bien que todo lo que un UIViewController es lo que quiero hacer, Yo digo todo lo que un UITableViewController es lo que quiero hacer, de modo que se limita a añadir algunas cosas adicionales que son totalmente hecho por nosotros. Tenemos que hacer muy poco para cubrir básicamente los espacios en blanco dentro de la tabla. Con el fin de mostrar una tabla que tengo que responder a algunas preguntas. La primera pregunta que debe responder es cómo las secciones que hay en la mesa? Cuando usted está hojeando su aplicación contactos te darás cuenta de que es una especie de organizado por el As, entonces usted tiene la B, y usted tiene esa cabecera sub poco. Cada uno de los que se llama una sección. Usted puede o no puede necesitar estos. Lo primero que tienes que hacer es poner en práctica un método llamado tableView: numberOfSectionsInTableView. Eso simplemente devuelve cuántas secciones tiene, por lo que esta podría decir devolver uno si tiene una vista de tabla grande. La siguiente pregunta que iOS tiene que saber es cuántas filas tiene? Por ejemplo, usted está hojeando una vista de tabla. Usted tiene un número fijo de las canciones que estás viendo o un número fijo de sus contactos. Si eres como yo, por supuesto, no es que muchos, y así es como iOS sabe cuántas células que se vea. Una vez más, esto podría decir algo así vuelva 3. Mi opinión tabla tiene 3 filas. Por último, iOS tiene que saber lo que cada célula se parece, así que lo que en realidad va a hacer es llamar a este método aquí abajo, este tableView: cellForRowAtIndexPath. Se va a llamar a este método en cada célula dentro de la tabla. ¿Cómo sabe cuántas veces se lo llama? Bueno, lo dicho en el interior del número de filas de la sección. Vamos a llamar a este en cada una de nuestras células, y dentro de éste es donde realmente se puede hacer cosas como establecer el texto o le dirá qué ese pequeño botón azul en la parte derecha hace. El patrón para obtener estas células, vamos a utilizar este método llamado dequeueReusableCellWithIdentifier. Objective-C es en realidad muy conocida por la longitud de sus nombres ridículos métodos, y esto es realmente un buen caso en el ejemplo de punto. Lo que este método no se trata simplemente dice que quiero que me des una celda. Sólo una cosa iOS. Si usted tiene algo así como 100.000 canciones en su iPod lo que iOS no quiere hacer es asignar 100.000 células, porque si usted está en la parte superior de su lista, lo que realmente necesita para asignar memoria para la célula que es 99.000 filas hacia abajo? No, porque lo que te puedas desplazar tipo de asignar a medida que avanza. Esto se hace para usted. Usted no tiene que preocuparse por todas esas cosas estúpidas rendimiento. Todo lo que dicen es que llaman a este método dequeueReusableCellWithIdentifier, y esto lo dice, está bien, si es necesario voy a crear una nueva celda para usted. Pero si usted está en la parte inferior de la tabla y ya ha asignado algunas células en la parte superior de la tabla que no estás realmente va a necesitar en el corto plazo Yo te voy a dar uno de los de vuelta en lugar de asignar una nueva, por lo que este es un problema de funcionamiento agradable. Usted no tiene que asignar a las células a ti mismo. Eso te va a devolver una celda. Va a volver a usted un objeto móvil. Una vez que tenga el objeto de célula que puede hacer cosas para ella. Puede definir el texto de la celda con esta propiedad denominada etiqueta de texto. Usted puede agregar que la flecha de la derecha o de algún otro material azar con esta otra propiedad llamada accessoryType, y así sucesivamente y así sucesivamente. Vamos a echar un vistazo a la aplicación real de una vista de tabla ahora. Cuando creé este proyecto en lugar de decir la aplicación única vista que en realidad vine aquí de la aplicación principal-detalle, por lo que, básicamente, lo que corresponde a la aplicación de correo en el iPad con la vista de la tabla de la izquierda y entonces el contenido de la derecha. En el iPod o iPhone que esto va a corresponder a una visión única tabla. Ahí es donde yo tengo mi código de arranque. Primero echemos un vistazo al guión gráfico. Todo esto fue hecho por mí, en el fondo creado. Esta barra de navegación me mostró lo que una célula ejemplo podría ser similar, y hacer doble clic, cambie el título. Cualquier preocupación de IU demás que puedo manejar allí. El archivo de cabecera se ve muy simple. En lugar de decir esto es UIViewController ahora estamos diciendo que esto es una TableViewController, así que sabemos que queremos llamar a todos los métodos de la tabla. Ahora quiero crear una propiedad que va a representar las cosas dentro de mi mesa. Esta tabla se va a mostrar arbitrariamente una lista de frutas, y por eso necesitamos crear algunos matriz en la que puede insertar fruta. Dentro de mi archivo de implementación, lo primero que quiero hacer es que quiero asegurarme de que inicializar esta matriz. Dije alloc init, creé mi arsenal de fruta, y yo estoy añadiendo 4 cosas a él, uno de los cuales es mucho más controvertido que los otros 3. Y ahora tengo una matriz de tamaño 4. Lo estamos sacudiendo en CS50. Ahora tengo una matriz de tamaño 4. Ahora voy a empezar a responder estas preguntas, y de hecho, cuando creé esta aplicación de este ya estaba hecho para mí. No tuve que escribir el número de secciones en vista de tabla. Ya estaba allí, y yo estoy llenando los espacios en blanco. ¿Cuántas secciones tengo? Una. Todo hecho. ¿Cuántas filas tengo? Bueno, tengo una fila para cada fruta, por lo que este recuento es una propiedad de cualquier matriz que dice cómo es de grande? Ese es el número de filas que tengo. Por último, tengo que decir lo que tiene cada célula parece? Voy a decir dequeueReusableCellWithIdentifier. De nuevo, esto ya estaba escrito para mí. Yo no tenía que hacer esto por mí mismo, y quiero volver esta celda en esta ubicación. Recuerde que estamos llamando a este mismo método en todas las células, y este argumento aquí, este argumento indexPath, dice qué fila estoy dentro Si digo indexPath.row aquí este será 0, entonces será 1, entonces será 2, y esto es lo que sé qué celda Actualmente estoy mostrando. Quiero configurar el texto de la celda utilizando esta propiedad textLabel ir dentro de mi matriz fruta y obtener el objeto que corresponde a cada fila. Si esto es una cadena, ahora estoy estableciendo la propiedad de texto en una cadena. Puedo hacer otra cosa. También puede registrar un controlador de eventos en cada una de las células, así que cuando me toque en cada una de estas células este didSelectRowAtIndexPath, esto va a ser llamado por mí, por lo que simplemente definiendo esta ahora puedo manejar lo que sucede al tocar en una celda y, de nuevo, estamos pasando en la celda que fue aprovechado para que podamos volver a utilizar este mismo controlador de eventos para todas nuestras células. Una vez más, esto es algo iOS está haciendo por mí. Vamos a mostrar otra popup molesto que simplemente dice que escogió algo cuando ese algo va a ser el objeto de fila. Cuando ejecuto esto, yo voy a tener este punto de vista linda mesa con una fila para cada una de estas frutas, y si me toca una me dice lo que pasó. Tiene sentido? Vamos a construir un poco más complejo de una aplicación, tanto como hacer clic en que usted escogió tomate es. La parte agradable sobre el storyboard es que no es sólo va a ayudar a las pantallas de diseño individual, también va a ayudarnos a unir nuestra aplicación completa, por lo que la aplicación final que será este edificio es bonito deporte lector de noticias, y por lo que va a tener varias pantallas, así que puede representar en realidad cada una de estas pantallas múltiples en el storyboard, y puedo alejar la imagen y ver mi aplicación de un alto nivel. Con el fin de crear un nuevo elemento en el interior de mi storyboard es muy simple dentro de Interface Builder. Si quiero añadir otra pantalla para esto, por ejemplo, La primera vez que se puede reducir con el zoom de pellizco que Apple quiere mucho, y aquí abajo antes de buscar un botón y arrastrar y soltar un botón si desea crear una nueva pantalla que en realidad se puede simplemente arrastrar y soltar un controlador de vista completa, por lo que si cojo este, tire de él por aquí, hey, hay otra pantalla, por lo que ahora está utilizando este archivo de storyboard mismo Puedo tener todas las pantallas dentro de mi app, y puedo alejar y ver cómo interactúan. Estos no van a interactuar con todo. La forma en que estas 2 pantallas interactúan es definir las relaciones. Es, básicamente, se puede decir de esta pantalla, al pulsar este botón, Quiero que se deslice hacia esta nueva pantalla. Eso significa que este tipo de relación entre  la pantalla primera y la segunda pantalla. Vas a tener básicamente una flecha de ese botón a la segunda pantalla diciendo que cuando se pulsa este botón, que es donde quiero ir. Al igual que hemos hecho clic y arrastre de controles para definir los puntos de venta vamos a hacer lo mismo para definir estos segues. Vamos a ver un ejemplo de eso, y antes de que realmente la transición de una pantalla a otra iOS es lo suficientemente agradable para llamar a este método llamado prepareForSegue, y aquí es donde podemos empezar a el envío de datos desde una aplicación a otra. En el ejemplo que estamos a punto de ver, básicamente, nos permitirá para filtrar los equipos de béisbol de las ligas y divisiones. Cuando selecciono una liga, por ejemplo, quiero hacer la transición a mi siguiente pantalla donde pueda mostrar todas las divisiones en esa liga o todos los equipos diferentes. Tengo que enviar a la pantalla lo que los equipos que debe mostrar. Para ello voy a tomar ventaja de este método aquí. Por último, sólo un punto al azar en iOS. Si desea almacenar los datos que hay esta cosa llamada datos básicos, que es en realidad un poco complicado trabajar con ellos. También puede utilizar SQL para almacenar datos, que, de nuevo, es agradable, pero un poco en el lado más complicado que trabajar, pero también es compatible con iOS estas cosas muy interesantes llamadas listas de propiedades, y una lista de propiedades es un archivo que representa los pares clave-valor. Se define una lista de claves, y le digo clave va a ser una matriz. Esta clave va a ser una cadena, y básicamente cualquier cosa que usted puede hacer en JSON se puede hacer dentro de una lista de propiedades, por lo que esta realmente bien nos permite trabajar con algunos datos. Por ejemplo, tengo este Teams.plist que he creado. He creado un archivo plist nuevo, y puedo ver los detalles. Este es un diccionario, esto es un diccionario, se trata de cadenas, y por lo que esta es una representación gráfica agradable de un documento JSON o simplemente un conjunto de pares de valores clave, y por lo tanto estos son los datos que voy a estar trabajando con el interior de mi aplicación. Primero vamos a venir aquí. Tenemos archivos mucho más ahora. Pero primero vamos a venir aquí al guión gráfico. El guión aquí, si puedo alejar- ahora podemos ver que esto es el flujo de mi app. Estoy primero vamos a empezar en esta pantalla. Voy a profundizar en esta pantalla, y voy a profundizar en esta pantalla, y podemos ver aquí que si que tipo de mover uno de estos en todo hemos estas flechas ir desde aquí hasta aquí, y la forma en que definen esa flecha fue si puedo ampliar un poco, y si me vienen a este controlador de vista, y aquí está una celda, y quiero decir que al tocar en una celda Quiero que se deslice hacia otra pantalla. Simplemente, puede mantener pulsado el control, desplazarse a lo largo de un poco más, mantenga pulsada la tecla Control, arrastre la celda una y dejar ir. Y aquí podemos decir cuál es la transición que desea utilizar? ¿Quieres usar esa cosa que se llama diapositiva empujón? ¿Quieres que se deslice hacia arriba desde la parte inferior? Eso se llama modal. Y una vez que haga clic en uno de ellos, que va a sacar esta flecha para mí, y eso significa que he manejado en realidad lo que sucede cuando presiono este botón gráficamente. Yo no he escrito ningún código para deslizarse en realidad de una pantalla a la siguiente. He definido esta visualmente dentro de Interface Builder. Si hago clic en esta flecha, podemos ver que me dio esta cosa un nombre. Me llamó showDivisions, y esto es para que yo pueda saber transición lo que está por ocurrir, y vamos a ver por qué en tan sólo un segundo. Así es como me he conectado a las diferentes pantallas de mi aplicación. Si esto fuera un botón, por ejemplo, en lugar de una vista de tabla, Que podía controlar haz clic en el botón, arrastre a la siguiente pantalla, y así es como puedo hacer la navegación de esa manera. Muy rápidamente, si entramos en la MasterViewController, de nuevo, estamos simplemente va a definir una lista de las cosas que se mostrará en la vista de tabla. Aquí estoy diciendo que quiero que tomes ese archivo plist, y yo quiero que lo cargue en un diccionario, y una vez que tienes ese diccionario, voy a contestar a las mismas preguntas de nuevo. Aquí es el número de secciones. Uno, hay una fila por cada liga, y el texto de cada celda debería ser la primera, la primera liga, la liga segundo, y así sucesivamente. Por último, voy a utilizar este método que acabamos de ver se llama prepareForSegue, y este es el método que va a ser despedido cuando hago clic en en una de las filas y por lo tanto la activación de la transición que establecí con las flechas. Esto es decir que puede tener múltiples relaciones de una pantalla a otra. Si tengo 2 botones y cada botón te lleva a otra pantalla Voy a tener 2 segues, 1 para cada botón. Pero esta prepareForSegue es, de nuevo, va a ser reutilizado para cada una de las diferentes relaciones, lo que significa que necesito una manera de identificar si se pulsa el primer botón o pulsar el segundo botón. ¿Recuerdas cuando te dio esa segue un nombre, este showDivisions, eso es lo que ahora sé que este es el segue que fue activado. Todo lo que quiero hacer es que quiero decir Quiero entender lo que me acaba de golpear, y así conseguir eso, puedo decir que quiero el indexPath para la fila seleccionada, Recuerdo la indexPath sólo dice dónde acaba de hacer clic, y entonces quiero decir que quiero saber a dónde voy. Esta destinationViewController, eso es una propiedad de la segue. Esta es la pantalla que voy a, así que sé que la pantalla me voy a se llama DivisionsViewController porque he creado esa clase, y por eso ahora si digo d.divisions Ahora estoy estableciendo una propiedad del controlador de vista que voy a ir. Así es como yo estoy enviando datos de una pantalla a otra pantalla. Con sólo mirar a esta DivisionsViewController usted puede ver aquí que en el expediente. h no es que las divisiones de propiedad, y eso es lo que estoy básicamente poblar, de modo que es como sé que estoy mostrando las divisiones correspondientes a la liga que hice clic y, de nuevo, la vista de tabla real se ve más o menos el mismo, sólo respondiendo a los 3 preguntas simples, así como la identificación de lo que sucede cuando se mueve a la siguiente pantalla. Sólo un par de cosas aquí. Se nota en la parte superior aquí que en lugar de decir # include Ahora estoy diciendo # import. Esto es sólo una cosa de Objective-C. La importación es básicamente una versión más amable de incluir, y por ejemplo, tenemos que saber lo que esta clase es, así que no puedo decir DivisionsViewController. Si no hashtag dentro de nuestro standardio.c. Archivo c el compilador no tenía idea de lo que era printf. Del mismo modo, si no me importe el DivisionsViewController el compilador realmente no tiene idea de lo que es un DivisionsViewController. Sólo asegúrese de que dentro de sus archivos m diferentes. Usted, asegúrese de importar los archivos correspondientes h. para que el compilador sabe lo que está pasando. Por último, en última instancia, lo que Apple hace es mostrar algunos datos utilizando una web de opinión, y así una visión web es un objeto que se puede incrustar un navegador web pequeño dentro de su aplicación. Todo lo que necesitas hacer es proporcionar un URL en su navegador web, así que quiero ir a mlb.mlb.com, y así es como puedo acceder a la página de inicio para cada equipo, y así pasando en este URL la vista web puede mostrar esto para mí, y puedo navegar, y el simulador está en uso por que uno. Ahora bien, esto viene de mi plist. Si hace clic en este esto también viene de mi plist, y este deslizamiento se manejan mediante la definición de los segues. Hago clic en este y uno más, y ahora aquí está mi UIWebView, por lo que al igual que aquí está la página web para la dirección URL que acabo incorporado, y yo no tenía que manejar ninguna locura. Esta es la forma de mostrar una página web. Cosas como esta el botón de regreso aquí también se dan a mí totalmente gratis, porque he definido estas relaciones utilizando segues. ¿Alguna pregunta? Si. [Estudiante] Así que cuando usted utiliza alloc, usted nunca tendrá que algo gratis? Exactamente, cuando se llama a alloc e init usted no tiene que liberarlo. IOS va a manejar todo eso para usted. Es maravilloso, y usted no está rompiendo ninguna regla. Si. [Estudiante] Si se va a incluir más equipos que podrían caber en la pantalla, lo tienen automáticamente una opción de desplazamiento o es que algo tiene que agregar? Exactamente, si tuviera más equipos, por ejemplo, automáticamente se ocuparía de el desplazamiento para mí, y todos los problemas de rendimiento con la enorme mesa también son manejados totalmente por mí. Otras preguntas? Todo este código va a ser publicado. Es como que pasa por alto un poco de los detalles más pequeños, pero cosas como establecer algunas propiedades a la vista web son cosas que usted puede conseguir navegar por la documentación de Apple, que es muy, muy bien diseñada. Ellos tienen un montón de aplicaciones de ejemplo y el ejemplo usos de APIs distinto, así que sin duda leer esos si puedes. Sólo algunos enlaces útiles que usted puede ser que desee echar un vistazo a. Estas son algunas de las guías de documentación a mano. Las URLs son enormes, por lo que estamos acortado. Este primero es toda la biblioteca de documentación. Hay pequeños bares de búsqueda, por lo que si el botón de inicio escribiendo que comenzará a darle toda la información acerca de todas las cosas que puedes hacer con un botón. También he incluido el Table View Programming Guide. Se ocupa de las vistas de tabla en mucho más detalle, cómo hacer cosas como agregar de forma dinámica o células editar o eliminarlos. Hay un montón de aplicaciones de ejemplo de Apple que le mostrará cómo hacerlo, y, finalmente, este último es el Human Interface Guidelines, y esto es básicamente una discusión de los componentes de interfaz de usuario, cosas como no hacer un botón que es de 4 píxeles por 4 píxeles. Esa es una mala idea, y otras cosas que Apple quiere que hagas fomentar el diseño correcto. Las últimas preguntas antes de terminar? Bueno, definitivamente no dude en-vamos a tener etiquetas especiales en discutir. Vamos a tener un iOS, así que sin duda no dude en utilizar eso. Si desea trabajar con sus compañeros de clase en proyectos o ayudar a entender algunas cosas al azar iOS no dude en enviarme un correo electrónico, y sin duda leer todo el código en línea porque sólo en interés de la clase de tiempo que pasa por alto el más de grano más fino detalles de las cosas. Pero si no, entonces buena suerte en sus proyectos para iOS, y espero que tengamos una gran afluencia de aplicaciones en la App Store. [CS50.TV]