Spanish Subtitles for Stanford University Developing iOS 7 Apps: Lecture 2 - Xcode 5



Subtitles / Closed Captions - Spanish

>> Universidad de Stanford.

>> Paul Hegarty: Está bien. Bueno, bienvenido a dar una conferencia número dos de CS 193P para el otoño del año académico 2013/2014. Y hoy vamos a tener unas diapositivas al principio, poco más hablando, y luego voy tener un buen gran manifestación que se va a tratar

y es de esperar sintetizar todas las cosas que he estado hablando acerca de las diapositivas para las dos primeras conferencias, y es que vamos a empezar a construir nuestro juego de cartas. Bueno. Este juego de correspondencias tarjeta va a ser nuestro sustrato para las dos primeras semanas de aprender un poco de Objective-C, aprender acerca de Xcode, el aprendizaje sobre cómo iOS ganchos

el controlador, y la vista, y el modelo para hacer una interfaz de usuario. Así que si se acuerda de la última vez, lo hicimos esta cosa tarjeta que - lo hicimos toda la tarjeta. Fue una clase muy simple. Nos dieron un par de propiedades - tres propiedades allí - y un método.

Y eso es prácticamente todo. Y por eso hoy vamos a seguir y hacer otra clase, que es una cubierta, de acuerdo? La baraja de cartas. Y recuerde, esa tarjeta y la cubierta son de carácter genérico; no son específicos para jugar a las cartas, ¿verdad?

Una tarjeta de juego, como el as de bastos y al rey de corazones - algo que tiene todo lo que en ella - eso es una cosa naipe. Estas son las tarjetas generales y las cubiertas. Por lo que esta podría ser una baraja de tarjetas de memoria flash, una baraja de palabras de la lengua extranjera que estamos tratando

aprender o lo que sea. Así que estamos tratando de mantener estos mazo y las clases de tarjetas más bien genérica. Así que aquí está cubierta. Debe tener un aspecto familiar en términos de su estructura básica, ¿verdad? Estamos importando nuestro marco superclases allí,

y luego, obviamente, la importación de nuestro propio archivo de cabecera En nuestra implementación. Y la interfaz para la cubierta va a tener estos dos tipos de métodos fundamentales: Se añade una tarjeta a la cubierta y uno dibuja una carta al azar de la baraja. ¿Bueno? Y el complemento de una tarjeta a la cubierta es un poco nuevo para usted

porque se puede ver que tiene dos argumentos. ¿Bueno? Este es el primer método que usted ha visto que tiene dos argumentos. Hasta ahora sólo se ha visto sin argumentos o un método con un argumento como que - partido - partido tuvo un argumento o de los organismos,

sino que también tienen un argumento. Así que notar que cuando se tienen varios argumentos y los objetivos, ver que están intercaladas tipo de con los nombres de los métodos. ¿Bueno? Así que el nombre de este método, este método es mucho poner la tarjeta en la parte superior de colon colon.

Ese es el nombre de este método. ¿Bueno? Por lo que la parte superior es en realidad parte del nombre de este método. Y los argumentos, como la tarjeta que vas a añadir y en la parte superior - que es un booleano si se debe añadir que en la parte superior de la cubierta o en la parte inferior de la cubierta -

bien, esos argumentos se entremezclan. Y veremos cómo se llama a un procedimiento de este tipo en un momento aquí. Y luego roba una carta al azar es como una, ya sabes, similar a un getter en que devuelve un valor y que no tiene argumentos. Pero esto no es un captador debido a que no hacen esto una propiedad.

Y es bastante importante entender que podría haber hecho de esta una propiedad como una propiedad de sólo lectura o algo que lo lee, pero desde robar una carta al azar de tipo hace algo, que tiene una especie de un algoritmo a él - un mecanismo - que normalmente no haría que una propiedad.

Es una especie de un abuso de un captador de hacer eso. Un captador es realmente sólo establecer y obtener un valor. Podría tener efectos secundarios, como el establecimiento podría actualizar la interfaz de usuario o conseguir que podría asegurarse de que está inicializado primero - ese tipo de cosas. No vas a - algo que hace algo

como dibujar una tarjeta no va a ser una propiedad. Ahora, si usted quiere tener, como, que en la parte superior argumento es opcional, está bien, la única manera hacer eso en Objective-C - Obviamente necesitamos que nuestro archivo de cabecera no - la única manera de hacer eso en Objective-C es

para declarar un nuevo método para añadir dos puntos tarjeta sin en la parte superior sobre el mismo. Así que este es un método totalmente diferente, sin relación alguna al otro método a excepción de que, en su ejecución de este otro método sólo vamos para llamar a la otra, ¿de acuerdo? Así que en tarjeta adicional que vamos a decir que sí poner la tarjeta en la parte superior del colon,

lo que queramos el defecto de ser, lo que voy a decir es que no. ¿Bueno? Por lo que sólo entiende que, ya sabes, en algunos idiomas, como, algunos parámetros pueden ser opcionales o tipo puede de las cosas de sobrecarga tengan el mismo nombre de método tiene diferentes argumentos.

No. En Objective-C cada método es completamente distinta y tiene un nombre distinto. Y los argumentos adicionales se intercalan así. ¿Bueno? Así que estos serían dos métodos diferentes. ¿Eso tiene sentido? Todo bien.

Así que vamos a hablar de nuestra implementación de nuestra cubierta. Por lo tanto nuestra cubierta es sólo va a contener un montón de tarjetas. Necesitamos algún tipo de estructura de datos interna para almacenar todas nuestras cartas en. Y lo que vamos hacer es que vamos a obtener una matriz mutable. Así que ya ha visto la clase NS matriz,

que es la matriz de clase de fundación, que es un conjunto de objetos. Esos objetos, por cierto, en la matriz pueden ser de cualquier clase. En realidad no hay forma de especificar qué tipo de clase del objeto está en una matriz. Algunos idiomas que le permiten hacer eso.

Puede especificar "Esta es una matriz de cuerdas "y sabe que. Pero en Objective-C no se puede hacer eso. Y vamos a hablar de cómo nos ocupamos de eso. Eso es un poco del oeste salvaje de Objective-C, pero hay maneras de tipo de control

y ver lo que los objetos son si quieres para ser realmente segura de ello. Pero en este caso sólo tenemos esta matriz mutable. Y medios mutables que podemos añadir objetos a la matriz. Normalmente una serie NS es inmutable. ¿Bueno? Una vez que se ha creado, cualquier objeto que entran en ella,

eso es los objetos que están en él para siempre - no se puede tomar ninguna y no se puede poner en cualquier. Así que si queremos matriz donde podemos añadir cosas, tenemos que utilizar esta subclase de NS NS matriz llamada matriz mutable. ¿Bueno? Se puede ver que se trata de una propiedad.

Es fuerte porque queremos que esta matriz de alojarse en el montón siempre y cuando estamos apuntando a ella. Y, por supuesto, siempre nos ponemos no atómica allí. ¿Bueno? Así que esto va a ser una serie de tarjetas. Ahora que tenemos esto, nos podría aplicar añadir tarjeta, por ejemplo, con sólo decir: "Si en la parte superior, a continuación, insertar objeto"

la tarjeta, que es el argumento de este método - primer argumento - "añada la cifra cero". Así insertar objeto poner índice es un método en el NS matriz mutable, no en serie NS - sólo en NS matriz mutable porque eso sería mutando él - que inserta el objeto en que el índice de la matriz

y el índice de cero va a ser la parte superior que vamos a definir. Y a continuación, de lo contrario si no vamos a ponerlo en la parte superior, vamos a ponerlo en la parte inferior, vamos a utilizar un método diferente NS matriz mutable llamada añadir objeto.

Y que sólo se suma algo al final de la matriz. Así que cada uno de acuerdo con eso? Así que en su mayoría sólo hay que poner este método en aquí sólo se puede mostrar que hay un par de métodos diferentes en la matriz mutable y, ya sabes, cómo podemos utilizar los argumentos. No es gran cosa aquí; que es sólo un poco para conseguir más utilizado

a lo que está pasando aquí. Todo bien. Así que eso es poner la tarjeta. Muy, muy simple. Y hay un problema, sin embargo. En este complemento tarjetas, si es que acabamos de crear una cubierta

y luego se llama tarjeta adicional, que no funcionaría. ¿Bueno? Sería hacer nada. ¿Por qué sería no hacer nada? Debido a que las tarjetas de propiedad, bien - self.cards es la forma en que estamos accediendo a nuestra propia propiedad - su captador parece que por defecto.

Si no damos un captador, eso es lo que el comprador se parece. Sólo va a devolver las tarjetas de esta Underbar Instancia variable. Pues bien, esa variable tarjetas Underbar ejemplo de ir para empezar en cero porque todas las variables de instancia

en un objeto de Objective-C empezar de cero. Todos ellos. ¿Bueno? Así incluyendo punteros. De manera que el puntero será cero, que es que llamamos a cero, lo que significa que no apunta a nada, lo que significa que no hay arreglo, ¿de acuerdo?

Nos dieron un puntero a una matriz que no apunta para nada en este momento. ¿Bueno? Así que eso es un problema. Así que cuando se ejecuta el código en tarjetas adicionales como self.cards añaden tarjeta de objeto, que va a no accidente pero no hacer nada, tampoco.

¿Bueno? Debido a que le dijera que se pueden enviar mensajes a cero, enviar mensajes a los punteros, a los objetos en los que no está señalando a uno en el tiempo, y no se bloqueará. Si envía un mensaje que devuelve un valor, ese mensaje no se ejecutará ningún código pero volverá a cero.

¿Bueno? Por lo que una gran cantidad de ceros que vuelan por aquí. ¿Bueno? Entonces, ¿cómo vamos a solucionar este problema? ¿Cómo vamos a hacer para que añada tarjeta funciona? Bueno, podríamos poner algo en el comienzo de la tarjeta adicional que dice: "Si self.cards es nula, y luego ir asignar una matriz en el montón y el punto a ella, y luego vamos a utilizar ".

¿Bueno? Pero eso significaría que cada vez que tenemos utilizar self.cards que tendríamos que dar la vuelta y comprobar y asegúrese de que no es nula. Y eso sería muy molesto. ¿Bueno? Eso sería muy propenso a errores, error propenso, nos olvidamos de hacerlo en alguna parte.

Todas estas cosas. Por lo que un gran lugar para hacer esa pequeña Si el control es en el captador, ¿de acuerdo? Eso getter que tenemos ahí para tarjetas - ese es el captador de nuestras tarjetas de propiedad privada - en lugar de devolver las cartas, vamos a poner una línea derecha

frente que dice: "Si las cartas es nula, a continuación, vamos a asignar una en el montón y asignarla a la variable de instancia ". ¿Bueno? Así que la forma de asignar una matriz en el montón se utiliza NS init mutable matriz alloc. Así que eso es dos llamadas de mensajes anidados dentro de la otra.

El alloc asigna el miembro en el montón, e init inicializa que la memoria de modo que es una, usted sabe, matriz sensible. Y vamos a ver cómo construimos nuestro propio inicializador en un par desliza aquí. Así de esta manera cada vez que se llama self.cards,

usted puede estar seguro de que no es nula; que es, al menos, va a ser un conjunto vacío. ¿Todos entienden este código? Es importante entender esto. Sí. [Inaudible]

>> Paul Hegarty: Está bien. Entonces la pregunta es: en lugar de tener el código de inicialización sea en este captador, ¿por qué no puedo obtener un inicializador como un inicio para la cubierta y poner esta cubierta en el interior? ¿Bueno? Y esa es otra opción.

Y de nuevo, vamos a ver inicializador para jugar cartas de la baraja, vamos a hacer un inicializador. Y podríamos hacer eso. Sin embargo, tener la inicialización de esta cosa esté más cerca al llegar de la propiedad real es más - que hace que su init menos lleno de un montón de basura por el estilo.

Y esto se llama instanciación perezoso, por cierto, haciendo de esta manera. Estamos esperando con pereza hasta el último segundo, hasta que creamos una instancia. Este patrón es algo que cada uno en Objective-C se utiliza para,

y que sin duda debe usarlo en vez de hacer las cosas en su inicio. En init quieres, ya sabes, poner las cosas, los valores establecidos que, usted sabe, no puede ser fácilmente incumplido así. ¿Bueno? Pero eso es una muy buena pregunta. Y veremos init en un par de diapositivas.

¿Bueno? Así de esta manera estamos self.cards Garantizado es Nunca nulo. ¿Sí? >> [Inaudible] >> Paul Hegarty: Sí. Por lo que el subrayado es de la última conferencia.

Recuerde que cuando creamos una propiedad, Objective-C automáticamente hace esto, asignar sintetizar: Tarjetas igual subrayado tarjetas. Así, en otras palabras, se asigna una variable de instancia llamada nombre subrayado de la propiedad siendo el espacio de almacenamiento para esa propiedad.

Así que por eso tarjetas Underbar se crean automáticamente para nosotros no hay detrás de las escenas. Que en la muestra sintetiza un pop-up en nuestro código, pero está ahí detrás de las escenas. Esa es una muy buena pregunta. Cualquier otra pregunta acerca de esto?

Bueno. Así que vamos a contraer algunas de estas cosas y se ven al robar una carta al azar, ¿de acuerdo? Así que robar una carta al azar, todo lo que se quiere hacer es conseguir una carta al azar fuera de ese self.cards, ¿de acuerdo? Así que el código es muy simple también. Así que sólo obtenemos un número entero aleatorio.

Eso es lo que hace al azar arco 4, si usted no sabe. Es sólo una función de biblioteca C. Se pone un entero aleatorio. Entonces ese pequeño por ciento después de que significa mod - bien, enteros módulo - y luego self.cards.count es el número de tarjetas en nuestros self.cards.

¿Bueno? Así que sólo vamos a obtener un índice de azar en self.cards, a continuación, asignar una carta al azar siendo el índice soportes self.cards cuadrado, de acuerdo? Así que esto es que los mismos corchetes para acceder a una variedad de tipo de sintaxis. Y es interesante,

que el índice de soportes self.cards cuadrado, en realidad, eso es un mensaje de envío creas o no. Eso es igual a self.cards objeto en el índice de índice. ¿Bueno? Es sólo una sintaxis especial y azúcar sintáctico para hacerlo de modo que usted no tiene tener índice de complemento objeto largo.

De hecho, es objeto en el índice subíndice o algo con un nombre verdadero método de largo. Así que esto es sólo un poco de sintaxis hermoso, simple. Pero eso es un mensaje enviar para obtener la tarjeta en que el índice de la matriz. Y entonces también vamos a quitar la tarjeta

fuera de la matriz porque se trata de dibujar una carta al azar, ¿de acuerdo? Es robar la carta de la baraja. Así que no es de la baraja más, ¿verdad? Ahora, hay un problema con este código, así, que es: ¿Qué pasa si la cubierta está vacía? ¿Bueno? Si la cubierta está vacío, entonces dicho índice se va sin firmar

que es cero, a la derecha, porque va a ser arco 4 cero mod azar. Eso va a ser cero. Y por lo que vas a decir, "Tarjeta de azar es igual self.card bajo cero." Bueno, eso va a bloquear el programa de

porque si self.cards es un conjunto vacío, entonces no hay objeto en el índice cero y vas para obtener el índice de matriz fuera de límites. ¿Bueno? Así que tenga cuidado de que. El índice - no se puede obtener el índice - Si una matriz no tiene un objeto

de ese índice, no puede conseguirlo. Así que es fácil de solucionar, sin embargo. Sólo vamos a decir: "Si cuentan self.cards" en otras palabras, si hay cosas en la matriz ", entonces lo haremos. De lo contrario, sólo vamos a regresar la carta de azar "

el cual con mucho gusto inicializa a cero al comienzo de mi método. Y por eso me gusta esta cosa de inicializarlo en el valor predeterminado que desee, a continuación, establecer y, a continuación, volver. Y de esa manera si el ajuste falla por alguna razón como esto - se produce un error porque no hay cartas en la baraja -

devolverá el valor por defecto razonable. Eso es sólo una especie de cosa estilo de codificación. ¿Bueno? Hicimos lo mismo que con la puntuación y el partido. ¿Bueno? Para cualquier duda acerca de eso? ¿Sí? [Inaudible]

>> Paul Hegarty: Muy buena pregunta. Entonces la pregunta es: ¿Cuándo utilizo número entero o entero NS NSU frente int o incluso NS número, que es un objeto que no hemos hablado todavía? Y la respuesta es que es una cuestión de estilo. Y hablaremos un poco acerca de ese estilo

y cuándo usar estas cosas. Aquí realmente no quiero usar un número NS que es un objeto cuando estoy sólo usarla, ya sabes, como una pequeña cosa local de esa manera. Nunca haría eso. Estás usando números NS básicamente

para pasarlos a los métodos. E incluso entonces usted podría pasar enteros, ya sabes, y flotadores. Por lo tanto, se convierten en obvios como yo hablar del número de NS, lo que haremos la próxima semana. Bueno. Así que eso es todo por la cubierta. Cubierta, clase muy simple también.

Así que vamos a pasar a otra clase, que está jugando la tarjeta. ¿Bueno? La razón por la que estoy mostrando que jugando a las cartas, Sólo quiero que le muestre lo que parece hacer una subclase de otra clase que usted ha escrito. Así naipe es una subclase de la tarjeta. Y ésta es la tarjeta específica como rey de corazones,

tres de diamantes, ese tipo de tarjeta, ¿de acuerdo? Ahora, tiene propiedades que son específicos de un naipe, que es el palo y rango. ¿Bueno? El rango es como un tres, cuatro, un gato, rey, ¿verdad? Y el traje de ser corazones, diamantes, tréboles.

Y voy a representar el juego como un solo carácter - los personajes corazones, el carácter clubes. Recuerdo que he escrito el carácter clubes pienso en la tarjeta que podría haber demostrado que. No lo sé. Sin embargo, puede escribir un único carácter.

Unicode tiene un carácter para cada uno de los cuatro palos. Así que eso es lo que mi juego va a ser. Y entonces el rango va a ser un número entre cero y tres. Es que el rey? Sí. En representación de la fila.

Así que esa es la forma en que voy a representar en mi API pública. Y aquí estoy usando aviso NSU número entero en lugar de unsigned int. Así NSU número entero y unsigned int son casi exactamente el la misma cosa. La única cosa sobre NSU entero es que es typedef. Puede ser que sea un poco diferente en diferentes plataformas.

Por ejemplo, los nuevos 5s iPhone son los procesadores de 64 bits. Así NSU número entero va a ser un int de 64 bits, unsigned int en un iPhone 5. Y puede ser que sólo alrededor de una vuelta de 32 bits en un iPhone 4 y antes. ¿Bueno? Así que es un poco diferente.

Así que un int menor. Es probable que no representábamos enteros. Ciertamente, aquí sólo vamos cero a trece. Probablemente, no importa. Pero, ya sabes, no estamos representando números enteros que sean tan gigantesca que vamos a utilizar el bit de 33º.

Así que notar que en la tarjeta de juego que estamos anulando la tarjeta contenidos método. ¿Bueno? Heredamos contenidos de nuestro superclase. Y por contenidos por defecto simplemente devuelve el valor cualquiera que sea la propiedad contenidos es. Pero aquí en la tarjeta de juego que vamos a anular contenidos

para calcular realmente nuestros contenidos, sobre la base de estas otras dos propiedades. ¿Bueno? Así que estamos anulando el captador de contenidos de modo que siempre devuelve una cadena - el contenido de esta tarjeta de juego - que se calcula a partir del palo y rango.

¿Ves lo que estamos haciendo aquí? Así que básicamente estamos tomando el almacenamiento de contenidos - - contenidos Underbar de nuestro superclase y ignorándolo porque estamos anulando su comprador. ¿Bueno? Así que esta es una razón perfectamente válida por la que hacemos esto propiedades, así, ya que podrían tener una mejor manera

para hacer las cosas que el almacenamiento. Ahora, aquí hay una manera de poder ponerlo en práctica: Sólo podemos devolver una cadena, ¿de acuerdo? NS cadena, cadena con formato igual que printf-ción de una cadena. No se preocupe de que la sintaxis demasiado. Y estoy printf-ción de una cadena con ciento por ciento y D en la muestra.

Así ciento D significa entero; ciento en la muestra significa un objeto. ¿Bueno? Una representación de cadena de un objeto. Y a continuación, sólo estoy usando el color y palo. Por lo que esta sería una manera de hacer mis contenidos. No es una muy buena manera, ya que, por ejemplo, la jota de corazones diría 11 corazones, ¿de acuerdo?

No va a decir al menos J; queremos decir J, no 11. Así que esto no es una manera muy buena. Así que en vez voy a hacer una matriz que tiene todas las cosas bien como una A por un uno, y J de 11, y una Q de 12 y una de 13 K, ¿verdad? Así que estoy haciendo de esta variedad aquí.

En el medio hay que tuve que cortar para que se ajuste, ¿verdad? E incluso hice cero sea signo de interrogación. Así que si su rango es cero, que va a ser, como, signo de interrogación, como, sin establecer. Usted sabe, su rango es, básicamente, no se establece. Y entonces vuelvo una cadena, que se está llevando a cabo el rango de

esa matriz y añadiendo en él la pequeña cadena de traje, el corazón, o el club, o el diamante. Todo el mundo entiende esto? Soy una especie de darle este para que pueda ver cómo estamos mezclando en la notación de matriz, y el envío de mensajes, y todo tipo sin problemas de mezcla en ese país.

¿Bueno? Así que ahora vuelve contenidos corazones J, o 5 diamantes, o lo que sea. Tenga en cuenta que nuestro rango es muy agradable porque si nuestro rango es cero, que se inicia fuera de ser cuando decimos nueva tarjeta de juego - todas las variables de instancia son cero, de modo serían rango de cero -

tenemos este bonito signo de interrogación. Pero nuestro juego comienza como nula, y que sería bueno si el traje también volvió signo de interrogación si fue sin decir, si fue nula. Así que aquí estoy anulando el captador de traje decir, "Si la vuelta, si el traje es nulo, a continuación, devuelve el signo de interrogación,

de otro modo, cuando el traje no es nulo, luego regresar lo que es el juego ". ¿Bueno? Así que estoy tipo de protección de mi API para asegurarse de que siempre vuelvo signo de interrogación cuando no se ha establecido el rango o traje. Sí.

>> [Inaudible] >> Paul Hegarty: Lo siento. Todo poco a signos - el rojo en las señales, que quiere decir? Sí. Supongo que no tuvimos la oportunidad de que en la tarjeta. Pero puede ser que tengamos. Pero recuerde que todas las cadenas que vamos a trabajar

con en esta clase son objetos de cadena, no estrellas de cuidado const, ¿verdad? Son objetos de cadena. Y el compilador, si se pone un signo de arroba delante de una cadena, que hará que un objeto de cadena para usted, ¿de acuerdo? Así que eso es lo que los signos en hacer,

que hacen todas esas cadenas sean objetos de cadena porque no podemos poner una estrella atención const en una matriz NS. NS matriz es para los objetos, por lo que tenemos que poner los objetos allí como cuerdas NS. Esos son los objetos. ¿Bueno? Buena pregunta.

¿Sí? [Inaudible] >> Paul Hegarty: Sí. Bueno. Buena pregunta. Si hubiéramos utilizado ese captador es igual a la notación que utilizamos para que se elija y se hace coincidir con cambiar el nombre,

luego, cuando sobreescribimos tenemos que utilizar el nuevo nombre. Tendríamos que es lo que sea. Ahora bien, este no es el caso aquí. Pero sé lo que estás diciendo, y sí, que tendría que utilizar el nuevo nombre. Muy buena pregunta.

Cualquier otra pregunta acerca de esto? Bueno. Lo que ayuda a la demanda siempre vuelven signo de interrogación si el traje es nulo o no está establecido. Vayamos también proteger a la gente que configura el traje que algo anda mal. ¿Bueno? Vamos a solamente vamos a personas a establecer la demanda mediante esta propiedad,

el colocador público de la propiedad. Nosotros sólo haremos gente establece el traje siendo uno de los cuatro juegos. Así que sólo sobre la marcha en el medio hay creado un conjunto de esos cuatro palos. Y luego utilizo este método contiene objeto;

lo que la clase cree usted que contiene objeto es a partir de ese poco? ¿Nadie? [Inaudible] >> [Inaudible] >> Paul Hegarty: Es un método de matriz NS, exactamente. Así que contiene objeto es un método de arreglos de NS. Estoy enviando a la matriz que creo justo en lugar allí.

La matriz que tiene corazones, diamantes, picas y clubes en el mismo. Y sólo estoy preguntando: ¿Es usted contiene esta cadena? Y que contiene objeto se va a comparar el contenido de esta cadena contra todas estas usando un método es igual. En realidad, que va a decir es igual a las cuatro de ellos

con el traje como el argumento; no es igual de cadena - es igual. Y en cadena es igual es implementado por llamada es igual de cadena si el argumento es una cadena. De todos modos, más detalles que usted necesita probablemente allí. Pero esto es, obviamente, protegerla.

Así que no hay manera de que podamos establecer nuestra variable del almacenaje del juego interno a cualquier cosa con excepción de las cuatro palos. ¿Sí? [Inaudible] >> Paul Hegarty: Muy buena pregunta. Ustedes están justo encima de él.

Así que cada vez que utilizo la arroba abrir corchete - el azul - para crear una matriz, que en realidad es la creación de una nueva gama cada vez. ¿Bueno? Porque te dije que ese corchete a la muestra y todas esas cosas matriz se llama en realidad sólo métodos? Bueno, eso se llama a un método como init alloc con matriz

con objetos o algo por el estilo. ¿Derecha? Por lo tanto, es la creación de la misma. Así que sería bueno para sacarlo, y vamos a hacer eso. Aunque, de nuevo, tenga cuidado de no preoptimize. Es probable que no haría nada diferente. Sólo voy a moverse hacia fuera para que mi código más limpio;

No voy a moverlo a cabo por cualquier motivo el rendimiento. ¿Sí? >> [Inaudible] >> Paul Hegarty: Sí. >> [Inaudible] >> Paul Hegarty: La pregunta es: ¿Sería justo LLVM cuidar

de que, optimizar eso para usted? Y probablemente no lo haría porque eso es un envío de mensajes; no está seguro de lo que podría haber efectos secundarios de la misma. Pero en cualquier caso, sólo vamos a hacerlo sólo para que nuestra mirada más limpia código. Y el rendimiento sería insignificante aquí.

Estamos hablando de la interfaz de usuario. No es ni de lejos. Una cosa a tener en cuenta, sin embargo, antes de hacer eso es ya hemos implementado tanto en la incubadora y el captador de juego, ahora estamos obligados a hacer la señal a sintetizar. ¿Bueno? En otras palabras, normalmente no tenemos

hacer esto en sintetizar señal. Se consigue hecho por nosotros. Pero si ponemos en práctica tanto el colocador y el captador, ahora que hacemos. Es fácil de hacer, porque siempre es de esta misma forma exacta. Pero tenemos que hacerlo.

Bueno. Así que aquí está - vamos a hacer lo que decíamos. Vamos a tomar esa pequeña variedad de trajes que tenemos allí y ponerlo en otro método. Ahora, de nuevo, no estoy recibiendo ningún rendimiento al hacer esto, ¿de acuerdo? Me estoy haciendo la limpieza de código al hacer esto porque todavía soy - cada vez que llamo trajes válidos,

que va a crear de nuevo. Ahora, podría usar una variable estática. Esta es la C. Podría almacenar esta matriz. Todo empezó siendo nula. Si es nulo, configurarlo para que esta matriz, y entonces sólo crearía una vez.

Pero ten cuidado. Una vez más, la limpieza de código y es comprensible diez veces más importante que el rendimiento de esta manera. Así que a menos que vas a llamar a los juegos válidos en el bucle interior miles de veces,

realmente no se va a importar. Pero una vez que me muevo arriba en un método diferente, este tipo de método que lo moví a es un poco diferente. Observe que tiene un punto a favor. Ves un plus allí en vez de un signo menos ponerlo en marcha? Además NS matriz trajes válido?

Bueno. Un método además es un método de clase. ¿Bueno? Eso significa que usted envíe a la clase, no a una instancia de un objeto. ¿Todo bien? Por lo tanto, ya que no va a enviar a una instancia, no se puede utilizar ninguna variable de instancia ni nada de eso.

Sólo se puede hacer sólo tipo de cosas genéricas. Así que la única cosa que realmente utilizamos métodos más para, métodos de clase, es en realidad dos cosas: crear cosas al igual que en la diapositiva anterior cuando tuvimos cadena con formato - eso es un método de clase que estaba creando una cadena para nosotros; y luego también métodos de utilidad de este tipo,

al igual que las constantes de retorno y las cosas que, usted sabe, nuestra clase quiere y métodos de utilidad. Pero he aquí un ejemplo. Y la forma en que llamamos el método de clase - que ya ha visto que llame a unos pocos de ellos - pero aquí está llamando desde aquí es que nosotros puesto abrir corchete,

el nombre de la clase, el nombre del método. Y otra vez, podría tener argumentos. Es igual que cualquier otro método. Pero todo el mundo entiende esto? Bueno. Y si volver atrás y mirar un par de diapositivas y ves corchete abierto cadena NS, cadena con formato,

mismo tipo exacto de sintaxis. ¿Bueno? Así que eso es lo que es un método de clase se parece. De nuevo, para crear cosas, básicamente, y para los métodos de utilidad. Y hablaremos de la diferencia de: Aún cuando creamos algo

con un método de clase frente a init alloc? Ya hablaremos de eso pronto. También voy a hacer trajes válidos pública. Y así las personas que están usando mi tarjeta de juego saben lo los trajes son válidos. Y todo lo que hay que hacer es ponerlo en el archivo de cabecera.

Boom, es ahora pública. ¿Bueno? Así que vamos a hacer una cosa similar aquí con esas cadenas de rango. ¿Bueno? Así que voy a tomar esas cadenas filas - que matriz de cadenas de rango a la altura - y voy a poner esto en un método de clase.

¿Bueno? Y de nuevo, esto es para facilitar la lectura, no para el rendimiento. Porque cada vez que llaman cadenas de rango, que todavía va para crear esa cosa de nuevo. Y entonces yo lo llamo lugar allá arriba. Y no voy a hacerse pública cadenas de rango,

pero voy a hacer otro método de clase llamado el máximo rango, la cual sólo se ve en el número de cadenas se encuentran en cadenas de rango. Y voy a volver que como un método público. Así que hay tres métodos de la clase para que usted pueda hincar el diente en - dos de ellos públicos, uno no. Todo bien.

Y por lo que son todos los métodos de utilidad, ¿verdad? No estamos de acceder a las variables de instancia en cualquier de esos métodos, ¿de acuerdo? Esa es la única razón por la que estoy mostrando los, es sólo para que veas lo que es un método de clase se parece. También podríamos anular el colocador de rango solo

estar completo aquí para asegurarse de que no le permite para establecer un rango mal como conjunto rango de 15 - no hay ninguna tarjeta como 15. Así que vamos a asegurarnos de que el rango es menor que el máximo rango, que es el método de utilidad que acabamos de hacer. ¿Bueno? ¿Eso todos se unen para usted, tiene sentido?

Así que esta es la clase de material de referencia. Tienes estas diapositivas que tienen todas las anotaciones de todas las cosas que estoy diciendo. Así que no dude en volver a verlo y recordar sobre todas estas NS matriz, la sintaxis, y todos los métodos de la clase, todas esas cosas.

Bueno. Lo último que vamos a ver en el negocio es el método init. ¿Bueno? Así que vamos a tener otra clase llamada aquí baraja de naipe. ¿Todo bien? Y una cubierta de la tarjeta de juego es una subclase de la cubierta.

¿Todo bien? Y no tiene API pública. Sólo va a reemplazar un método que hereda indirectamente de objeto NS - bien, NS objeto a través de la cubierta, que no toca que - todo el camino a la baraja de naipe.

Y eso se llama al método init. ¿Bueno? Así que este es el mismo init, el mismo tipo de método que cuando creamos que la matriz - esa matriz mutable dijimos NS mutable init matriz alloc. Así que alguien va a llamar a este método init mazo de naipes - a saber, que en su preparación se va a llamar a este

haciendo baraja de naipe alloc, y luego en el exterior, init. ¿Bueno? Y así es como vas para crear una baraja de naipes. Y así es como creamos la mayoría de los casos de objetos - no todos. A veces hacemos cosas como el NS cadena, cadena con formato.

Pero la mayor parte del tiempo - más de la mitad del tiempo - hacemos alloc y luego en el init exterior. Bueno. Escucha con atención: Nunca llame esa cosa alloc sin envolver un init alrededor de ella. ¿Bueno? No vuelvas a hacer eso. Eso no tiene sentido tener un objeto asignado

en el montón que nunca se ha inicializado. Siempre tienen que anida. Y viceversa: Nunca llame excepto que init para cuando se envuelve alrededor de un alloc. Y definitivamente nunca llamas que init más de una vez. ¿Bueno? Y si escuchas mi regla de llamadas Sólo se envolvió

alrededor de un alloc, no se puede llamar más de una vez. ¿Bueno? Init no es algo así puede volver a init. Init ocurre una vez justo después de alloc, y eso es todo. ¿Bueno? Esa es una regla dura y rápida que nunca se rompen. ¿Bueno? Así que lo escucharon aquí. No se olvide.

Todo bien. Veamos el tipo de retorno whacky a este método init, ¿de acuerdo? Se podría pensar que este método init debería devolver un naipe estrella de la cubierta, ya que es una especie de inicialización y tal vez vuelva en sí. Y de hecho, init siempre devuelve uno mismo, ¿de acuerdo?

Así init siempre va a volver auto. Bueno. Más whackiness allí, lo que voy a describir. Sólo por conveniencia, siempre devuelve uno mismo para que pueda hacer, al igual que, jugando init tarjeta de la cubierta alloc, envió un mensaje. ¿Bueno? Así que es sólo la conveniencia de que devuelve uno mismo. Pero en realidad no puede tener su tarjeta de juego tipo de retorno siendo

estrella de la cubierta, ya que heredó esto desde NS objeto. Y NS objeto ya se definió como estrella objeto NS. ¿Lo ves? Así que es un poco raro que está heredando un método cuyo valor de retorno tendría para cambiar cada vez que, usted sabe, pasó por encima de él. Así que inventaron esta nueva cosa - esto es nuevo para iOS 7,

por cierto - llamado tipo de instancia. Y lo que es instancia de tipo significa esto va para devolver un objeto que es de la misma instancia - mismo tipo, mismo tipo de clase - como el objeto que envió este mensaje a. ¿Bueno? Lo que tiene sentido perfecto para ensu.

Y en esta clase que es probablemente todo lo que vas utilizar esto para aquí. Así que si usted realmente no entiende lo que acabo de decir - La explicación se encuentra en las diapositivas - pero si usted realmente no lo entiende, sólo sé que cada vez que haces un inicializador,

que va a devolver tipo de instancia como el tipo que devuelve y siempre se va a volver auto. ¿Bueno? Ahora, también acaba de tomar mi palabra para ella. Vamos a hacer estas próximas líneas de códigos, así porque son realmente extraño. Esa primera línea, es igual a uno mismo súper init, que es raro.

Esto es muy raro. ¿Bueno? Asignación de algo que uno mismo en Objective-C - nunca hacer eso, excepto por esta única vez y eso es en su inicio. ¿Bueno? Se toma uno mismo y se le asigna para llamar a su superclases inicializador

para que su superclase se ha inicializado. ¿Por qué se le asigna el resultado a la libre? Es una especie de historia antigua de por qué esto se ha hecho desde hace mucho tiempo. Básicamente estamos comprobando el retorno de nuestros init superclases para asegurarse de que ha inicializado correctamente.

Debido a que en cualquier momento si el inicializador no puede inicializar sí, es preciso volver a cero. ¿Bueno? Y que permite a todos saber cualquiera de sus subclases o cualquiera que trate de alloc y que inicializar, no se podía crear un objeto bien formada. ¿Bueno? Así se puede ver cómo este código, por extraño que es -

es igual a uno mismo súper init, y luego, si uno mismo, Voy a inicializar a mí mismo, de retorno automático - eso va a garantizar que ni siquiera intento para inicializar si mi superclase, cuando llamo a su inicio, ya sabes, no puede inicializarse. ¿Bueno? Así que simplemente lo hacen.

Si no lo entiende, no se preocupe demasiado. Solo hazlo. Ahora, una cosa aquí es que estamos hablando sobre init sin argumentos. Es posible tener inicializadores con argumentos porque a veces se necesita argumentos

inicializar correctamente una clase. Y vamos a hablar de eso un poco más el lunes. ¿Bueno? Así que hoy sólo vamos a especie de esqueleto init. ¿Qué esto init tiene que hacer? ¿Qué necesito hacer para tener un juego inicializado bien formada ¿Baraja de carta?

Bueno, una baraja de naipes tiene 52 cartas en el mismo, uno de cada tipo de tarjeta. ¿Bueno? Rey de bastos, tres de diamantes - todos los 52 de ellos. Así que sólo hay que recorrer a todos los palos, y luego iterar a través de todas las filas, y crear una tarjeta, y añadirlo a mí mismo.

Así que aquí me está iteración a través de los trajes, iteración a través de las filas. Todo el mundo de acuerdo con eso? A continuación, voy a importar naipe porque voy para crear una tarjeta de juego, jugando init tarjeta alloc. A continuación, voy a establecer

Rango de esa carta, establece que el traje de la tarjeta. El rango y la demanda son mis pequeñas variables de iteración allí. Y luego voy a añadir a mi mismo. Soy una cubierta, por lo que está perfectamente bien. Todo el mundo fresco con ese código? Así que ahora estoy un mazo de cartas de jugar bien formada y I se puede utilizar

para dibujar cartas al azar y todas esas cosas, que tendrá hacer por su tarea. ¿Bueno? Y, de hecho, por su tarea que va a tener para escribir los cuatro de estas clases en. Quiero que dan clases de experiencia Entrar, escribiendo una cosa, viendo como Xcode se queja de que

como se escribe mal las cosas, y cosas por el estilo. Y entonces vas que con el mazo de naipes y jugar a las cartas. Bueno, baraja de naipe y la tarjeta realmente son los dos principales usted va a utilizar para hacer su tarea. ¿Bueno? Preguntas acerca de eso?

Bueno. Así que eso es todo por las diapositivas. Así que ahora voy a hacer una gran demostración de edad. Y esta demostración se va para integrar todo lo que hemos visto hasta ahora, ¿de acuerdo? Lo más notable es que MVC cosas que hablamos, como la acción de destino, ya sabes, dejar caer el objetivo

y el rodaje de la acción o la salida de la flecha verde que apunta hacia otro lado. ¿Bueno? Vamos a mostrar lo que en realidad se parece en Xcode. Creo que cuando le pregunté quién de ustedes ha hecho Xcode, casi cada uno de ustedes han planteado sus manos.

Así que no voy a pasar demasiado tiempo hablando sobre todos los botones en Xcode. Creo que voy a pasar rápidamente sobre ellos. Pero si usted no ha utilizado Xcode, es en mucho detalle en las diapositivas de las clases. Existe un tipo de este tutorial.

Por cierto, si usted está siguiendo a lo largo de las diapositivas de las clases, mi demo no va a ser exactamente al igual que lo que está en las diapositivas. La cubierta se desliza un poco más de lo que puedo cubrir en cuarenta minutos aquí. Y también es material de referencia.

¿Bueno? Así que si hago algo hoy en esta demo y usted es como, "Oh, ¿cómo lo hace?" si ir a buscar en esas diapositivas, que le dirá. Así que no siento como, "llegué a escribir furiosamente abajo de cada botón, haga clic en él va a hacer en los próximos cuarenta minutos ".

De ninguna manera. ¿Bueno? Seguir a lo largo de esas diapositivas si lo desea, o simplemente cerrar su computadora portátil, y ver, y dejar que se hunda en porque vas a tener que reproducir lo que estoy haciendo en los próximos cuarenta minutos para su preparación. Y esas diapositivas van a caminar a

paso a paso cómo hacerlo. Así que no se siente como que tiene que hacer nada en este momento pero dejar que todo esto se hunden en. Tener una idea de lo que está pasando. ¿Bueno? Y luego, cuando usted se sienta a hacerlo, se le guiará a través de él.

La próxima semana vamos a hablar mucho más sobre Objective-C, responder a algunas de estas preguntas más detalladas como el número de NS y algunas de estas otras cosas que la gente está pidiendo. Y hablaremos sobre algunas de las cosas específicas acerca de Objective-C como enlace dinámico, y los protocolos, y las cosas que no se ven generalmente como mucho

en otros idiomas o no existen en otros idiomas. Así que vamos a tratar de cubrir todo eso. Así que al final de la próxima semana estás hasta la velocidad en Objective-C. Estás empezando a funcionar realmente con Xcode. Y así, la semana después de eso podemos realmente empezar a hacer algunas,

usted sabe, el IOS de alta potencia 7 cosas. Bueno. Así demostración aquí. [Inaudible] eso. Todo bien. Así que la demo que voy a correr en Xcode. Así que sólo voy a lanzar Xcode.

Así Xcode se obtiene mediante la ejecución - de ir a su tienda de aplicaciones Mac. Eso es esta cosa aquí abajo, ¿verdad? Obtener la tienda de aplicaciones en su Mac, y sólo una búsqueda de Xcode, encontrarlo. Es gratis. Descargarlo y ejecutarlo.

¿Bueno? Es tan simple como eso. Esto es lo que va a parecer la primera vez que tocar el tema, esta pantalla de bienvenida aquí. A medida que el trimestre continúa, esto va a llenar con todos los proyectos que se están haciendo. Probablemente está acostumbrado a que si usted sabe Xcode.

Y lo que vamos a hacer hoy es crear un nuevo proyecto. Usted puede comprobar un proyecto existente de control de código fuente o puede crear una nueva. Y por lo que vamos a crear una nueva. Así que cuando creamos una nueva, que nos quiere dar un poco de ayuda al ofrecer para crear una plantilla para diferentes tipos

de aplicaciones como un juego de OpenGL. Bueno. Se va a crear algún marco para eso para usted. aplicaciones maestro detalle, algo que vamos hacer más adelante en el trimestre, a pesar de que vamos para construir todo el código a nosotros mismos; no vamos a utilizar esta plantilla.

Y esto solo una aplicación vista aquí es básicamente una MVC única, que es la forma en que vamos que empezar todo de nuestras aplicaciones de esta clase - con un solo MVC. A continuación, vamos a añadir más los AT y construir. ¿Bueno? Así que esta es su única aplicación básica MVC. Así que voy a hacer clic eso.

Y aquí se va a pedir un poco de información al respecto como ¿qué quieres llamar a esta aplicación? Se trata de un juego de cartas de juego, he decidido llamar machismo, ¿de acuerdo? Así que va a ser el nombre de nuestra aplicación sólo por diversión. Y el nombre de la organización puede ser cualquier cosa que desee.

Se va a aparecer en las cabeceras de todas las clases que se creen. Así que hago la mía sea la Universidad de Stanford. Usted puede hacer el suyo sea de Bob Game House o lo que sea. Este identificador debe ser único para usted. Así que tengo edu.Stanford.cs193p.instructor.

Es posible que tenga edu.Stanford.cs193p dot su Identificación sunet. Esa será completamente único. Estos DNS inversa es una manera muy buena para crear un nombre único. Y se va a crear un nombre único para esta aplicación

mediante la combinación de este con los nombres. Así se puede ver que se hace aquí, este identificador del paquete. Y entonces esta clase prefijo - esta plantilla se va a crear una vista y un controlador para nosotros. Y esto está diciendo: "¿Qué quieres que el nombre de la clase del controlador a ser? "

De forma predeterminada que va a ser llamado "controlador de vista," ¿de acuerdo? Pero si escribe algo aquí como "juego de cartas," ahora se va para ser llamado "controlador de vista juego de cartas" que es un poco mejor nombre para nosotros. Así que eso es sólo el prefijo que se va a poner en el nombre de su controlador que crea para usted.

Y, finalmente, aquí podemos crear una aplicación aquí sólo para el iPad, o simplemente para el iPhone, o una aplicación universal que se ejecutará en ambas plataformas. Ahora, cuando se crea una aplicación universal, todavía tiene para diseñar la interfaz de usuario de forma separada porque si usted tiene más reglas de pantalla, sólo vamos

para diseñar una interfaz de usuario diferente. ¿Bueno? iPad no es sólo un iPhone grande. Puede hacer muchas más cosas si usted tiene más espacio en pantalla. Sin embargo, es posible que aún tienen una gran cantidad de su MVC de la residencia, derecho, debido a que el iPad podría tener pequeñas subáreas que se encuentran en MVC

que son exactamente los mismos que en un iPhone o muy, muy similares. Por lo tanto totalmente apoyado en IOS 7 para construir aplicaciones que se dirigen ambas plataformas y tiene grandes herramientas por lo que le permite construir su interfaz de usuario de dos por separado y compartir todas las MVCS debajo. ¿Bueno? Vamos a hacer solo iPhone aquí sólo

porque mantiene a la pequeña pantalla y sólo tengo tanto de bienes raíces aquí. [Inaudible] >> Paul Hegarty: Sí. Entonces la pregunta es: Si estoy en mi iPad y corro una aplicación que está solo iPhone, sí,

hay un modo de emulación esencialmente ese tipo se de hacer una cosa grande en forma de iPhone en la pantalla del iPad. Así que vamos a hacer aquí iPhone. Eso es todo. Voy a golpear siguiente. A continuación se quiere saber,

"¿Dónde vas puso este proyecto?" Recomiendo ponerlo en su directorio personal - en un directorio llamado "revelador" en su directorio personal. ¿Bueno? A menos que tal vez estamos trabajando en diferentes clases. Tal vez usted tiene la CS 193P

en su directorio personal y luego otra clase. Pero línea de fondo: ponerlo en su directorio principal; no lo ponga, al igual que, en la raíz o en algún lugar de esa manera. Que en el pasado ha causado problemas. Sin embargo, un gran lugar para poner aquí. Este es mi directorio, CS 193P allí.

Veo en Inicio, desarrollador. Aquí es donde voy a poner. Yo no tengo ningún proyecto todavía. Esta pequeña cosa aquí abajo, control de código fuente, vamos a estar hablando de eso. Está muy bien integrado en Xcode, pero no vamos

hablar de ello hoy en día. Así que deja que unclicked. Y así que aquí está nuestro nuevo proyecto. Se puede ver que nos muestra esta pantalla, que le entrega haciendo clic en esta cosa muy superior aquí. Así que esto es algo así como nuestros valores del proyecto.

Y hay un montón de ajustes aquí. Estaremos charla siendo todas estas cosas como el barrio continúa. Pero hoy no vamos a hablar de nada de eso porque queremos centrarnos en nuestro MVC. Y nuestro MVC, esto de aquí, main.storyboard, es nuestra opinión. ¿Bueno? Esa es nuestra visión de nuestra MVC.

Y entonces aparece este controlador de vista juego de cartas M y H? Ese es nuestro controlador. No hay modelos aquí. Su modelo va a ser esas cuatro clases - cubierta, tarjeta, tarjeta de juego, baraja de naipe - que va a ser su modelo.

Por lo que tendrá que introducir en el que. Te voy a mostrar al final de cómo hacerlo. Esta pequeña cosa aquí, juego de cartas [inaudible] dot H y M, hablaremos de eso brevemente, sobre todo cuando empezamos a hablar por cosas como la multitarea. Pero me gusta sólo se mueven los de en medio.

Así que a menudo se las puse aquí en esta carpeta los archivos de soporte. Y que sólo puede recoger cualquier archivo, por cierto, y moverlos en cualquier lugar que usted quiere aquí a la clase de limpiar su punto de vista. Así que aquí tengo mi opinión y mi regulador solo muestra aquí. ¿Bueno? Así que vamos a ir directamente a la vista

y ver lo que parece. Así que aquí está mi punto de vista. Es un iPhone 5 en blanco de tamaño, ¿verdad? Una vista alto y delgado. Y es en blanco. Nada nuevo.

Es blanco. Esta área de la izquierda, por cierto, en el que hizo clic en estos archivos, que se llama el "navegador". Y no sólo se puede navegar en todas sus archivos aquí, pero se puede navegar por sus puntos de quiebre, y construir problemas, y sus jerarquías de clases.

Todas esas cosas aquí. Así que de nuevo, la mayoría de ustedes saben Xcode, por lo que probablemente sabe más de estas cosas. Vamos a estar haciendo una demostración de todo esto como el trimestre continúa. Y esta zona de aquí se llama el "área de servicios públicos." Y aquí es donde básicamente averiguar los detalles

acerca de lo que está pasando aquí. Por lo tanto, los inspectores de atributos y dimensiones, y las conexiones, y cosas por el estilo van aquí. Y esto es también donde puede arrastrar a cabo las cosas que se va a utilizar para construir su interfaz de usuario porque vamos a construir nuestro punto de vista totalmente gráfica.

¿Bueno? No vamos a escribir código, en su mayor parte, para construir nuestra opinión. A medida que el trimestre continúa, vamos a aprender un poco más acerca de cómo para construir nuestra opinión en el código, pero vamos a empezar justo puramente haciendo nuestro punto de vista de las cosas de forma gráfica arrastrando y el cableado para arriba.

Y vamos a poner nuestro código en nuestro controlador. Estas dos partes se pueden ocultar y se muestra con estos dos botones. ¿Ver? Puede ocultar los. [Inaudible] Esto podría parecer también, esta área aquí, este pequeño botón de aquí abajo. Esto se conoce como el "documento de esquema."

Esto es realmente excelente práctico. Pero, de nuevo, no vamos hablar de lo que hoy en día. Sólo podemos hablar tanto de una sola vez. El esquema del documento. Esto sólo te muestra todas las instancias de objetos En su opinión, en una forma de esquema común.

Por lo que realmente puede encontrar fácilmente y sus relaciones entre sí. La otra cosa que puede hacer es que no quiero este iPhone 5 tamaño cosa porque mi pantalla es de baja resolución aquí por lo que funciona en el proyector. Así que voy a hacer clic en este pequeño botón aquí abajo,

que me reduce a iPhone 4 tamaño. ¿Bueno? O iPhone 4S. Ahora soy alto y delgado. Sin embargo, puede hacer clic ida y vuelta y volver a moverlos hacia atrás. Y estoy tratando de hacer que todo encaje en la pantalla aquí. Bueno. Así que vamos a la derecha de buceo en la construcción de nuestra opinión aquí.

Lo que nuestro punto de vista va a ser hoy en día es una sola tarjeta con un as de tréboles escritos en ella. ¿Bueno? Eso va a ser la misma. Y yo voy a ser capaz de hacer clic en la tarjeta y se le dará la vuelta otra vez, mostrar la parte posterior de la tarjeta, y luego haga clic en en él de nuevo, se le dará la vuelta de nuevo a mí mostrar el as

del club otra vez - de ida y vuelta, de ida y vuelta. ¿Bueno? Y su tarea va a ser para que sea por lo que cuando la tarjeta se voltea hacia arriba que no muestra el as de bastos, que muestra una tarjeta aleatoria extraída de la baraja. ¿Bueno? Eso va a ser toda su tarea que hay que entregar el lunes.

Bueno. Así que vamos a hacer esto. Muy simple. Vamos a este área de aquí, esta biblioteca de objetos. ¿Bueno? Ese es el tercer botón de aquí, muestran biblioteca de objetos. Y aquí es donde todos nuestros objetos son. Si nos fijamos en el aquí y no ve estos objetos,

podría valer la pena hacer clic en su vista. A veces Xcode quiere saber lo que el destino es que vas a estar arrastrando las cosas en. Así que si se hace clic en él, entonces usted verá estas cosas. Y sólo vamos a tomar uno de estos botones aquí. Así que voy a recoger en este botón y arrastrarlo fuera.

Y aviso, tal como me arrastra hacia fuera, estas pequeñas líneas azules aparecen - estas directrices. Bueno. Estas directrices son súper importante. Parecen como una conveniencia para ayudar a usted lo pone en el centro o la derecha en la esquina de la derecha.

Y lo son, pero son muy importantes para asegurarse que todas las cosas en su punto de vista son una especie de, como, espacio estándar de diferencia, ¿verdad? Y alineado contra los bordes. Así que a medida que los usuarios pasan de una aplicación a otra, cosas serán todos separados por espacios predecibles

y todo va a ser coherente. Es muy importante. Y hay un mecanismo - se puede ver este interruptor aquí, utilizar el diseño automático, que se introdujo en iOS 6 y mejorado enormemente en IOS 7, especialmente en Xcode - que permite que la interfaz de usuario cambia el tamaño,

al igual que pasa de ser un iPhone 4 a un iPhone 5, o que gira de ser vertical para ser horizontal, o sea en un iPad en un espacio más grande. Para todos los botones y todo tipo de movimiento de a una nueva posición que tiene sentido o al menos la mayoría de ellos, ¿verdad?

Y entonces tal vez usted podría tener que mover algunos de ellos a mano, dependiendo de lo que está pasando. Pero sienta en su mayoría de forma automática a cabo. Y esto es realmente importante porque estoy seguro de dispositivos seguirán siendo diferentes tamaños como nuevo, ya sabes, dispositivos vienen a lo largo de los años.

Al hacerlo diseño automático es importante, y estas directrices azules son el número más importante cosa para el diseño de automóviles. Vamos a cubrir el diseño de automóviles en detalle, y hay mucho a ella. Todos estos botones aquí tienen que ver con el diseño de automóviles.

Sin embargo, conseguir esas directrices azules, asegurándose de que caen las cosas con al menos una directriz azul en alguna parte que es realmente importante para obtener tipo que va por el camino correcto con el auto correctamente diseñada interfaz de usuario. Así que tenemos este botón aquí.

Pero antes - y, por supuesto, podemos ir por aquí A esto se suma el inspector de atributos y haga clic en él. Y vamos a ver todo tipo de atributos. De hecho, si oculto esto, toneladas y toneladas de atributos para este botón. ¿Bueno? No sólo el propio botón,

pero en realidad su superclase tiene atributos. El control es su superclase, y luego vista es la superclase de control de y tiene atributos. Bueno. Así que este es un inspector orientada a objetivos que mostrará todos los atributos de todas las cosas

a través de la jerarquía de herencia. Y lo que está sucediendo aquí es que en realidad estamos editando una instancia de un botón aquí. Así que no estamos - y sé en algunos sistemas que Layout en el botón, se establece el tamaño, y configurar los atributos.

Y luego, ya sabes, detrás de las escenas de un manojo del código está siendo generado para crear el botón. Eso no es lo que estamos haciendo aquí. De hecho, estamos editando objetos vivos. Están esencialmente van a ser liofilizado. Y luego, cuando se ejecuta la app, añadir agua, vienen a la vida, de acuerdo,

con sus atributos establecidos, y todos sus tamaños y posiciones, y todo su diseño automático de información en el objeto. ¿Bueno? Así que es un poco diferente de lo que podría ser utilizado en algunos otros sistemas. Así que de todos modos, antes de editar los atributos de este botón, sin embargo, vamos a cambiar nuestro fondo

porque este es un juego de cartas. Y la mayoría de los juegos de cartas están, como, fieltro verde, ¿verdad? Así que vamos a hacer nuestro fondo sea más como sintió un verde. Así que sólo voy a hacer clic en el fondo, lo que es este punto de vista aquí, y usted puede ver sus propiedades. Así que voy a cambiar un par -

o una de sus propiedades - que es el fondo. Usted ve este color blanco de fondo aquí? Así que si hago clic en esto, tengo algunos colores utilizados recientemente. Tengo todo este tipo de colores blanco y negro. Y también tengo otra. Y traigo a colación otra, hace aparecer los lápices de colores, ¿de acuerdo?

Esto también brinda otras formas de elegir los colores, pero me gustan los lápices de colores. ¿Bueno? Y así, ¿dónde están mis lápices de colores? Allí están. Así que vamos a elegir un color verde, como, musgo es un buen color verde. Trébol. Me gusta el musgo mejor.

Así que es una especie de juego de fondo de la tarjeta. Y eso es. Para ello hemos establecido el color de fondo de nuestros puntos de vista. ¿Bueno? Y todo el valor de atributo es como esto: Solo tiene que configurar y olvidarse de él. Así que vamos a volver al botón y sus propiedades.

Bueno. El botón que quieren parecerse a una tarjeta. Bueno, un botón en IOS 7 básicamente se parece mucho como un hipervínculo en una página web, al igual que lo hace el botón derecho allí. ¿Bueno? Ese botón azul. Eso no es realmente apropiado para lo que queremos.

Queremos que se vea como una tarjeta con un poco de rect redondeada y un fondo blanco, ¿verdad? Y quiero la parte posterior de la tarjeta para el mismo aspecto pero tienen algún tipo de diseño en él o algo por el estilo. Así que la forma en que voy a hacer eso es que voy para establecer una imagen de fondo para mi botón.

¿Bueno? Una imagen de fondo que es como un rect redondeada. Así que vamos a echar un poco de lado aquí y hablar de: ¿Cómo obtenemos las imágenes en nuestra aplicación? Bueno. Queremos utilizar las imágenes en nuestra aplicación; es muy común a querer utilizar imágenes en una aplicación gráfica como en un teléfono.

Entonces, ¿cómo lo haces? Y la respuesta es que bajar aquí a este lugar llamado el "Biblioteca de activos imagen" - images.xc activos o activos Xcode. Y se puede ver que ya hay un par de ranuras para los iconos aquí.

No están establecidos, pero este es el icono de la aplicación. Y también se puede tener una imagen de inicio que aparecerá al instante cuando alguien lanza su aplicación. Y entonces como que estás de inicialización, que tiene la imagen puesta en marcha atrás, y luego le mostrará la interfaz de usuario es real. Así que es la imagen de inicio rápido de.

Y hablaremos de esto el lunes. Vamos a configurar el fondo para la aplicación Machismo aquí. Pero voy a arrastrar en realidad en alguna otra imagen. Así que tengo algunas imágenes aquí. Y, por ejemplo, tengo este logo Stanford aquí. Así que voy a arrastrar ese logo de Stanford

en porque quiero usarlo. Y eso es; sólo tienes que arrastrar en aquí. Se dice Stanford. Pero nótese que especie de tiene esa cosa rara aquí, esto 1X y 2X. Se da cuenta?

Y eso es porque cada imagen que se va a utilizar en IOS quiere tener una versión normal de resolución que está pasando para ser utilizado como en el iPhone 4 - nonretina muestra básicamente. Y luego un 2X, el doble de alta resolución - uno que se utilizará en la retina. Y automáticamente cogerá el más adecuado,

dependiendo de lo que se está ejecutando en. ¿Bueno? Usted no tiene que hacer nada al respecto. Pero usted desea proporcionar estos res más altos. Y estas cosa más altas no son sólo necesariamente la misma exacta imagen, sólo, ya sabes, hecha más alta resolución. Puede ser que permitirá hacer -

Por ejemplo, aquí tengo un logotipo de Stanford con el pequeño árbol. ¿Ver? Ver el árbol de allí? Así que tal vez esto es demasiado baja resolución para conseguir realmente un árbol de buen aspecto. Pero puedo conseguir el árbol en una resolución mayor,

así que lo puse ahí. Así que no es tan común que los dos serían en realidad de aspecto diferente, pero que podría ser. Ciertamente permitió que podrían ser. Asimismo, no quiero llamar realmente esta "Stanford". Voy a usar esto como mi tarjeta de copia de seguridad.

En lugar de tener, ya sabes, algún tipo de diseño, Voy a tener el logotipo de Stanford sea el dorso de la tarjeta. Cuando la tarjeta de mi abatido hacia abajo y veo la parte de atrás, Voy a ver el logotipo estándar. Así que voy a llamar a esta "tarjeta de nuevo." Puedo llamarlo lo que quiera.

También tengo cosas para el frente aquí. Esta de aquí. Esta es la tarjeta en blanco con una esquina redondeada. Ahí está. Usted no puede verlo. Debido a que es una tarjeta blanca por lo que no se puede ver.

Pero voy a usar eso. Voy a llamar a este "frente de la tarjeta." Y también voy a tener una versión de alta resolución de que también. Bueno. Y eso es bueno. Por lo tanto como podemos ver de la misma.

Bueno. Así que ahora tengo algunas imágenes. Y ahora quiero usarlas en mi opinión. Yo como que quiero establecer esta tarjeta para usar este. Así que voy a empezar con mi tarjeta aqui estar cara cuando se ejecuta. Cuando mi aplicación se ejecuta, la tarjeta va a empezar boca arriba.

En la aplicación cuando recibe su tarea probablemente vas a querer comenzar boca abajo. La razón de ello es mi aplicación sólo muestra una tarjeta: As de bastos. Así que está bien si se le ocurre as de bastos. Pero no desea que su tarjeta para llegar as de bastos con seguridad.

Y puede que sea un poco más de trabajo para que la codificación a gota inicializarlo para llegar a alguna carta al azar. Así que voy a tener que venir hasta boca abajo. Hacer que sea mucho más fácil para usted. ¿Bueno? Entonces, ¿cómo establecemos que? Muy simple.

Tengo el botón seleccionado aquí. He aquí sus propiedades. Una de sus propiedades es su imagen de fondo. ¿Bueno? Así que sólo voy a hacer clic aquí, y se puede ver que todas las imágenes que están en mi biblioteca activos estarán aquí. ¿Bueno? Y si había un muy gran cantidad de ellos,

puede escribir y va a coincidir con él. Así que voy a hacer que es el frente de la tarjeta. Por lo que la convirtió en el frente de la tarjeta, pero no veo - ¿dónde está el rect redondeada? ¿Bueno? No puedo ver el rect redondeada. Y eso es porque es demasiado pequeña

para ver las esquinas redondeadas muy bien aquí. Por lo que sólo puede tomar esta cosa y cambiar su tamaño. ¿Bueno? Y voy a hacerlo - Yo quiero que sea entre dos o tres [inaudible]. Así que voy a hacer que sea de 64 por 96. Sé que esto pasa a ser un muy buen tamaño, y he cambiado el tamaño.

Y ahora se puede ver las pequeñas esquinas redondeadas. ¿Lo ves? Así que esta es la imagen que me arrastré en con el botón escrita en la parte superior de la misma. Y, por supuesto, lo moví un poco para que pueda poner de nuevo en el medio usando mis directrices azules, ¿verdad? Y, por supuesto, no quiero mi tarjeta a decir "botón" que;

Quiero que el as de bastos aquí. Así que voy a hacer doble clic en él. También pude editar que hasta aquí. Usted ve aquí donde dice "botón"? Haga clic aquí. Sólo voy hacer doble clic directamente sobre ella.

Voy a escribir "as". ¿Y cómo puedo escribir clubes, alguien sabe? Alt una cosa u otra. Me gusta hacer de esta manera. Voy a editar el menú, caracteres especiales, conseguir esta cosa mágica.

¿Alguna vez has visto esto, una especie de fresco? Basta con hacer doble clic con el botón - encontrar los clubes y haga doble clic. Todo bien. Así que ahí está mi as de bastos. Ahora, pero, ya sabes, eso no es del todo bien, tampoco. Realmente no me gusta que A. azul que realmente quiero la A a ser negro.

Y podría ser un poco más grande. Hay más espacio para ella. Así que puedo ir por aquí, por ejemplo, y cambiar la fuente. Puedo cambiarlo haciendo clic en esta pequeña cosa para hacerlo más grande, o que realmente puede hacer clic en este T e incluso establecer qué tipo de letra que es. Una cosa que es realmente importante

en IOS 7 es la tipografía. ¿Bueno? Recogiendo los estilos de texto adecuados que realmente está, realmente importante en iOS 7. Y no vamos a hablar realmente sobre él aquí; sólo vamos a utilizar la fuente del sistema. Pero eso es algo que hablaremos en la conferencia,

es asegurarse de que tienes que elegir las fuentes adecuadas en los lugares correctos para hacer la mirada de interfaz de usuario muy agradable. Puedo cambiar el tamaño aquí, tal vez de 24 puntos o algo así. Que todavía caben. Y entonces yo no quiero que este azul, por lo que es este el color del texto.

Así que vamos a seguir adelante y hacer que el negro. Todo bien. Así que me dio la tarjeta mirando la manera que quiero. Eso es bueno. Todas estas propiedades que estamos de ajuste, por cierto, si nos fijamos en el botón, verá este config estado aquí?

¿Defecto? De hecho, podemos establecer todas estas cosas de manera diferente para el estado resaltado del botón, o un estado seleccionado, o esté deshabilitado. Pero estamos incluyendo disposiciones como el valor predeterminado. Así que todos nuestros botones siempre va siendo que muestra el estado por defecto.

¿Bueno? Así que los botones son bastante poderosos. Usted puede tener un aspecto diferente ya que resaltan o lo que sea, pero vamos a estar trabajando todo en lo que se llama el "Normal" o estado "default" del botón. Vas a ver que cuando lleguemos al código. Así que en realidad podemos ejecutar este momento.

Así en funcionamiento. Usted tiene todos - la mayoría, de nuevo, hecho de Xcode. Usted sabe cómo ejecutar. Es este pequeño botón de reproducción. En realidad se puede mantener baja, y hay otras cosas que puede hacer como prueba y analizar.

Pero sólo vamos a correr. Por lo tanto, haga clic en Ejecutar, y que va a funcionar esto en un simulador. ¿Bueno? Y aquí está. Y se puede ver que el simulador de tan grande que ni siquiera cabe en la pantalla. Así que tipo de tener que desplazarse alrededor de ella.

Y cuando hago clic en él, no hace nada. ¿Bueno? Así que eso no es bueno. Todo bien. Debido a que no he puesto ningún código en mi controlador de responder a esa cosa de haber sido afectado. Así que eso es lo que vamos a hacer a continuación.

Así que vamos a volver aquí y parada. Bueno. ¿Entonces cómo hacemos eso? Bueno, es bastante interesante cómo lo hacemos, en realidad. Voy a hacer un poco más de espacio aquí. Y lo que tenemos que hacer es conectar hasta nuestro controlador. Y lo hacemos poniendo el código del lado nuestro controlador

a lado con nuestra opinión. ¿Todo bien? Así que voy a hacer clic en este botón pequeño aquí, icono de este botón, y que pone al lado del otro. Y por defecto, si se tiene una vista hasta aquí a la izquierda, que va a poner el código de ese controlador de la derecha.

Y se puede mover esto para conseguir más espacio para el código si lo desea. También puede cambiar entre el encabezado si desea para hacer cosas públicos o la ejecución. ¿Bueno? Y eso es bueno. Ahora, este código aquí es parte

del ciclo de vida del controlador de vista, lo que vamos para hablar en dos o tres semanas. Pero hoy no vamos a hablar de ello. Así que sólo podemos deshacernos de ella. Y vamos a empezar por decir, "Cuando este botón se tocó, queremos que vuelva ".

Así que tenemos que hacer una conexión entre nuestro punto de vista y el controlador. Y vamos a hacer esa cosa en la que colgar la diana y disparar la flecha. ¿Bueno? Llamada "acción de destino." Y esto va a ser una especie de chiflado.

Es probable que ni siquiera vas a creer esto cuando lo ves. La manera de hacer esto es mantener presionada la tecla de control. Así que estoy manteniendo pulsada la tecla de control, y estoy arrastrando una línea desde el punto de vista directamente en nuestro código. ¿Todo bien? ¿Bueno? Y me dejo llevar.

Y dice: "Oh, usted quiere una conexión entre su punto de vista y su controlador, ¿verdad? Esto es lo que necesito saber ". Por lo que nos pide, "Lo que usted quiere llamar a este respecto? " Así que esto va a ser el nombre del método.

Que en realidad va a crear un método que es llamada aquí cuando el botón se tocó. Voy a llamar "botón táctil de la tarjeta." Eso es un buen nombre. Aquí se está diciendo, "Lo que no quiere que el tipo el argumento de que es? "

Ya hablaremos de esto más adelante, pero por ahora obviamente queremos el argumento sea el botón que nos envía esta acción, ¿de acuerdo? ¿Cuál va a ser agradable porque entonces vamos hablar de nuevo a él y decirle que dar la vuelta en sí terminado. Hay otras cosas que podemos establecidos aquí, como:

¿Qué tipo de evento desea enviar esta acción? Y en realidad se puede configurar de modo que no hay argumento, simplemente envía el botón táctil de la tarjeta sin argumentos. Pero aquí nos desea que tenga el argumento del remitente, el botón de enviar este mensaje. Incluso puede enviar el evento a lo largo de toque,

pero que casi nunca hacemos eso - una décima parte de un por ciento del tiempo. Así que aquí voy a tener el remitente. Así que cuando me haga clic en Conectar, se crea un nuevo método. Y que el método está cableado hasta ese botón. De hecho, se ve este pequeño círculo alrededor? Si ratón sobre él, se le mostrará que es lo que se

conectado a. ¿Bueno? Así que esto es sólo un método bastante normal de aspecto aquí. El tipo de retorno, la acción del IB, que en realidad es typedef void. Este método devuelve realmente vacío. La razón de que Xcode pone la acción IB existe

y la acción del IB de typedef para anular, es sólo para que se pueda contar cuáles son los métodos de acción de destino de modo que pueda hacer cosas como esta. ¿Bueno? El puntero del ratón sobre. Sin embargo, el compilador ignora. El compilador ve como vacío porque es typedef para anular.

Es puramente una cosa Xcode a esta cosa acción IB. Y a continuación, se puede ver este método tiene un argumento, que es el remitente. Ese es el botón de envío de este mensaje. Y se va a enviar este mensaje cada vez que un toque va en el interior del botón.

Toque en el interior, ¿verdad? Ese fue el caso. Así que es cuando se va a enviar este mensaje. Así que eso es perfecto. Eso es lo que queremos. Así que cada vez que esto sucede, ¿qué es lo que quiere hacer?

Bueno, queremos dar la vuelta a la tarjeta. Bueno. Así que vamos a empezar con sólo darle la vuelta a la parte posterior. Y la forma en que vamos a hacer eso es que vamos para crear una variable local llamada "imagen de la tarjeta." Bueno. Y te has dado cuenta que estaba tratando de ayudarme escribo allí, y vas a ver un montón de ayudar aquí.

Y la imagen es otra clase de interfaz de usuario en IOS, de acuerdo, al igual que el botón de interfaz de usuario es una clase. imagen de la interfaz de usuario es la clase, como se puede imaginar, almacena una imagen. Podría ser una imagen JPEG, podría ser un GIF animado, que podría ser una imagen TIFF, lo que sea. ¿Bueno? Así que es muy poderosa clase holding imagen.

Y tiene un método de clase llamado "imagen denominada" y se le asigna una cadena como frente de la tarjeta o la tarjeta de nuevo, ¿verdad? Y se verá en la biblioteca de activos y dar una imagen de la resolución adecuada, dependiendo de si se va ser ir en - de hecho, se le dará una imagen con las dos resoluciones.

Y a continuación, dependiendo de dónde mostrarlo, lo hará, ya sabes, seleccionar correctamente la resolución, ya sea en una retina o no. Así que eso está bien. Nos dieron la imagen. Así que ahora sólo vamos a contar el botón para ajustar este como su imagen de fondo en lugar de lo que haya en ella ahora mismo.

Así que para hablar con el botón, nosotros hacemos abrir emisor corchete. ¿Derecha? Usted ve que el remitente es el botón enviándonos este mensaje. ¿Bueno? Conjunto. De acuerdo, voy a empezar a escribir fondo conjunto. Y ves como me pongo a escribir, Xcode está sugiriendo

a mí lo que podría querer. Ahora, se sabe que el remitente es un botón de la interfaz de usuario, por lo que sólo está sugiriendo aquí métodos de botón que empezar con el conjunto B - establecer el color de fondo, establecer una imagen de fondo, y poner límites. ¿Bueno? Note que también estoy haciendo un poco de ayuda en la parte inferior.

Ver, no es genial? Un poco de una o dos líneas de ayuda? Y pude hacer clic en este enlace y que me llevaría a la documentación. No vamos a hacer eso por razones de tiempo. Pero también puedo simplemente haga clic en uno y se recoge que uno

y selecciona inmediatamente el primer argumento. Así que puedo tomar eso. ¿Bueno? Así que voy a hacer eso. imagen de la carta. Y el aviso aquí cuando escribo CA, hay un montón de cosas que comiencen con CA que podría ir allí.

Pero Xcode de muy inteligente. Se sabe que una variable local es mucho más probable que lo quiero aquí que todas estas otras CA - funciones que comienzan con CA. Por lo tanto, que selecciona automáticamente para mí. Y si golpeo pestaña, por cierto,

que va a escapar, básicamente, lo completo. [Inaudible] Y si golpeo otra pestaña, pasa por aquí. Esta pequeña cosa de cuatro estado es justo lo que estaba hablando acerca de donde se puede establecer esto para el estado resaltado, o el estado, o esté deshabilitado seleccionado. Sólo vamos a hacer lo normal,

o por defecto estado de este botón. ¿Bueno? Así que estamos configurando la imagen de fondo para este botón. Y también tenemos que establecer el título, ya que no queremos ver que as de bastos cuando se da la vuelta hacia atrás. Así que sólo voy a configurarlo para que eso.

Bueno. Esa es la cadena vacía. Yo también podría decir nula allí. Bueno. Pero yo estoy diciendo cadena vacía justo para ver qué cadena vacía se parece. Así que en realidad si corremos esto, di tres. De acuerdo, vamos a probar eso.

Oh, fresco. [Inaudible] Y esto es todo. Así que hay una versión en miniatura de la misma. Bueno. Así que aquí está nuestra tarjeta. Y si hago clic en él, oh sí, se da la vuelta. Sí. logo Stanford con el árbol. Pero ahora si hago clic, que no hace otra cosa;

siempre da la vuelta a la parte posterior, que es exactamente lo que hace nuestro código, ¿verdad? Y eso es bueno. Así que vamos a fijar de modo que se voltea en ambos sentidos. ¿Bueno? Y yo voy a hacer que al decir si el - En realidad, yo voy a hacer otra cosa primero

que este Código sea un poco más simple es su lugar de tener esta variable local, sólo puede tomar esta y el pop bien ahí. ¿Bueno? Y eso es muy común para hacer eso. Y si quería envolverlo, se ajuste automáticamente si hago esto demasiado corto.

Pero también puedo poner un retorno en ese país. Y cuando lo haga, mire lo que hace con los dos puntos. Ver cómo las líneas de los dos puntos arriba? Siempre va a hacer eso. Si pulsa retorno en medio de un envío de mensajes que tiene varios argumentos, que se alinean los dos puntos

para todos los argumentos. Realmente genial. Así se puede ver todos los argumentos se alinearon izquierda y derecha. Así que de todos modos, voy a comprobar para ver si el título actual - bien, eso es un método del botón - si se trata de una cadena. Si esa longitud, está bien, es distinto de cero, bien -

así que eso es prueba allí para ver si la longitud de distinto de cero - eso es una manera fresca de hacerlo porque eso va a trabajar si el título del botón es nula o si es la cadena vacía. Debido a que el título del botón comienza nula. Si no se establece que a cualquier cosa, empieza a cabo nula. Así que aquí con una línea de código que he comprobado tanto la inicial

estado, posiblemente, - no en nuestro caso, ya que establece el título al club A - pero en su caso puede ser que sea. A continuación, vamos a establecer que para una cosa, otra cosa vamos a establecer que la otra cosa. Así que lo único que queríamos establecer esto en esto. ¿Todo bien?

Así que si hay un título en el botón, en otras palabras, tiene el as de bastos, a continuación, vamos para cambiar a la parte posterior. Y si no hay ningún título en el botón, a continuación, vamos para cambiar de nuevo a la parte delantera. ¿Bueno? As de bastos.

¿Bueno? Así que ahora cuando nos encontramos, nuestra tarjeta le dará la vuelta en ambos sentidos. ¿Bueno? Así que realmente fácil de cablear cosas en el controlador para hacer lo que quiera. La siguiente cosa que vamos a hacer es en el - bien, te voy a mostrar muy rápido aquí. Si mantiene pulsada la tecla de opción, una clave muy importante,

ves cómo se pone un signo de interrogación y empieza a poner de relieve las cosas? Esto le va a permitir al hacer la transición en la documentación. Así que si quiero saber más acerca de este título, si golpeo opción, haga clic en él -

veo, me da un poco de ayuda aquí. Es una propiedad. Es de sólo lectura, es no atómica. Por cierto, si ve "retener" en la documentación, eso es lo mismo que "fuerte". ¿Bueno? Conservar es el mismo que el fuerte básicamente.

Un poco de descripción aquí, sino también hipervínculos. Y si hago clic en uno de estos hipervínculos, como éste, que me lleva a la documentación. Esta es una ventana separada aquí. Y se puede navegar alrededor en esta documentación. Usted realmente desea conseguir familiarizado con todo esto.

Realmente no puedo mostrar todo a usted hoy para las limitaciones de tiempo, pero se pueden hacer cosas como la búsqueda, que puedo ir a buscar el botón de interfaz de usuario aquí. Bueno. Hay botón de la interfaz de usuario. Yo podría desplazarse hacia abajo e ir a, por ejemplo, conjunto de imágenes de fondo o imagen de fondo establecido

para el estado, lo que acabamos de ver. Tal vez voy a hacer clic para ir imagen interfaz de usuario. Ves todo esto. Hay buenas descripciones de la clase en el comienzo y luego todos los métodos, etc., etc. Así que definitivamente quieren para convertirse en un maestro de dicha documentación.

Puede también la opción de hacer doble clic en las cosas y se le enviará directamente a la documentación. Si no desea conseguir la ayuda de un poco de primera, usted puede ir directamente. Así opción es la clave para eso. Vamos a seguir adelante - está bien.

Observe que este pequeño espacio en la parte inferior apareció aquí cuando nos encontramos con la aplicación - se da cuenta? Este es el depurador de la izquierda, y esta es la consola a la derecha. ¿Bueno? Y que son sin duda va a utilizar el depurador y la consola tanto en esta clase.

Y, de hecho, podría tener tiempo para hacer una rápida - le mostrará cómo hacer la consola. Pero de todos modos, se puede ocultar arrastrándola hacia abajo o también haciendo clic en esta cosa [inaudible]. Todo bien. Así que lo siguiente que vamos a hacer es que vamos

poner un poco de etiqueta en nuestra interfaz de usuario que cuenta los lanzamientos. ¿Bueno? Una pequeña cosa incrementales que se incrementa cada vez que hay un tirón. Y lo hacemos volviendo a aquí y agarrando a nosotros mismos una etiqueta. Por lo que una etiqueta es el trozo de sólo lectura del texto, texto editable.

Y yo sólo voy a arrastrar por aquí y lo puso en la parte inferior izquierda. Voy a hacer doble clic en él para llamarlo "voltea dos puntos cero". Esto es lo que yo quiero que se vea como cuando mi primera interfaz de usuario lanza. Ahora aquí, nunca voy a ser tapping en este y provocando un mensaje para ser enviado como el botón;

es al revés. Mi controlador quiere hablar con esto y contarlo cuando los flips cambia todo el tiempo. ¿Bueno? Así se podría pensar que usted arrastre desde el código a esto se invierte, pero por desgracia no hacen eso. Todavía se mantiene pulsada la tecla Control y arrastre desde aquí.

Pero en lugar de arrastrar hacia abajo en su área de aplicación, lo arrastra en el área de interfase porque vas para crear una propiedad que conecta a dicha etiqueta, básicamente. Así lo hacemos. Obtenemos una cosa aquí.

Nos está pidiendo un poco diferentes preguntas: "¿Cuál es el nombre de esta propiedad?" Voy a llamarlo "voltea la etiqueta". ¿Bueno? Tenga en cuenta que esta propiedad es débil. ¿Bueno? Cuando hago clic en conectar, que va a hacer que una propiedad aquí y que va a ser débil.

Esta es la primera vez que hemos visto débil frente al fuerte. La razón de esto es débil es porque esta etiqueta se mantiene fuertemente por la vista en sí. Por lo que no necesita tener un puntero fuerte para ella, para mantenerlo en el montón. La vista lo hará.

Y si esta etiqueta cada vez sale de la vista, se limpiaron hacia fuera del montón. Y esta propiedad - este puntero a él - se consiga el sistema a cero, que es exactamente lo que queremos. Porque si eso voltea etiqueta no está en la vista, que no queremos siendo su actualización y el envío de mensajes a ella.

Así que es un gran uso de débil aquí. Esta propiedad es normal que usted está acostumbrado a excepto tal vez por esta salida IB. Eso es igual que la acción del IB. Es una cosa de sentido el compilador ignora que Xcode está utilizando.

¿Bueno? De modo que pueda hacer esto - le mostrará lo que está conectado que al pasar el ratón sobre ella. ¿Bueno? Por cierto, se puede ver todas las conexiones También mediante el botón derecho sobre las cosas. Así que aquí sólo haga clic en el botón y se puede ver sus conexiones.

Si alguna vez desea cambiar el nombre - Al igual que si no me gusta el botón táctil de la tarjeta, quiero cambiarle el nombre a algo, no se puede simplemente cambiar el nombre por desgracia. Tienes que ir aquí, haga clic en, utilizar esta pequeña cosa para desconectarlo, y luego controlar la fricción de nuevo.

¿Bueno? Todo el mundo tiene que? Es desafortunado. Sería muy bueno si podría rastrear Xcode que para usted, pero no puede. Así que si alguna vez desea cambiar el nombre de algo, usted tiene que desconectar aquí haciendo clic derecho sobre el mismo,

y luego controlar arrastre uno nuevo y establecer el nombre de esa manera. También puede hacer clic en este pequeño individuo y le mostrará todas las conexiones para su controlador. Abre esta ventana. Y puedo ver la etiqueta. ¿Lo ves? Estoy pasando el ratón sobre el botón.

Etiqueta. También hay esta pequeña propiedad aquí, que es algo que no han visto, que es básicamente una propiedad que señala a la totalidad de la vista desde su controlador. Así que esto es las conexiones con los controladores. Ver, que dice "vista del controlador de juego de cartas"?

¿Bueno? Así que por un clic derecho. Estoy haga clic aquí. Todo bien. Entonces, ¿cómo vamos a hacer este trabajo voltea etiqueta? Vamos a ponerlo a un lado por un segundo. No hay que pensar en ello.

En lugar de eso hacer otra propiedad. Propiedad. El cual es no atómica, que sólo va ser un int, que voy a llamar "recuento flip". ¿Bueno? Así recuento de la moneda es simplemente un número entero que va para mantener el conteo de lanzamientos. Y ver esto.

Algo más de espacio aquí. Ve allí. Sólo voy a bajar aquí y decir recuento self.flip plus plus. ¿Bueno? Ahora, ¿eso lo llaman el colocador o el captador de flip cuenta? Ambos. Exactamente.

Que está llamando tanto la incubadora y el captador. Está llamando al comprador para obtener el recuento del tirón, entonces es más que plussing; y luego esto se llama, el colocador para configurarlo de nuevo. Bueno. Así que es una especie de forro de funky de código allí mismo. Eso es lo mismo que decir conteo es igual a self.flip self.flip

contar más uno. Así que ha de llamar al captador y colocador. Bueno. Así que ahora tenemos este bonito recuento flip. Es mantener un registro de la cuenta; ¿cómo gancho que hasta a esta cosa aquí? ¿Qué voy a hacer un poco más grande, por cierto.

Bueno. ¿Cómo gancho que hasta así que dice voltea uno de colon, voltea dos puntos dos, tres voltea de colon? Bueno, vamos a hacerlo usando la incubadora para el recuento de tapa. ¿Bueno? Así que normalmente un regulador para el recuento de flip se vería así. ¿Bueno? Y aquí hay otra gran uso de incubadoras y captadores, el cual es mantener la interfaz de usuario en sincronía con una propiedad.

Y sólo voy a hacer esto diciendo etiqueta self.flips - voltea label.text iguales - ¡Uy, lo siento. Es difícil escribir de pie. Es igual a la cadena NS, cadena con formato, que se ha visto antes, voltea ciento de colon recuento D self.flip. ¿Bueno? Así que ahora el recuento de cada flip vez que se cambia vamos

para actualizar la interfaz de usuario. ¿Tener sentido? Para cualquier duda acerca de eso? Bueno. Así que vamos a ejecutar. Bueno. Aquí es lo nuestro. Así que haga clic, da la vuelta, actualizaciones de recuento de tirón.

Flip, flip, flip, flip. De ida y vuelta a trabajar, y el recuento de tapa está hacer el seguimiento de la cantidad de lanzamientos que estamos haciendo. ¿Bueno? Así se puede ver esto es realmente fácil de cablear. ¿Bueno? Y, sabes, cuando llegue en la construcción de incluso aplicaciones complicadas,

porque siempre se va a utilizar estos mismos mecanismos con la acción de destino y puntos de venta y vas siendo el uso de incubadoras y captadores para mantener las cosas en sincronía, que va a ser fácil para las personas para entender cómo funciona el código. Ellos saben dónde mirar para ver dónde ocurre la actualización de interfaz de usuario,

etc. Me voy a hacer otra cosa aquí. Tome un minuto y demostrar que se conecte ns. Bueno. Te dije que se podía registrar algo en la consola. Así que vamos a hacer cada vez que esta cosa cambia, vamos a hacer un registro NS. Así que es sólo una función C.

Y se le asigna una cadena de formato, como printf. Así que voy a decir recuento flip es igual a ciento recuento V self.flip. ¿Bueno? Así que sólo hay que poner ese registro NS allí, y ahora cuando nos encontramos que vas a ver en la consola. Se va a llegar cuando hago clic, y se va decir lo que pasó aquí.

Por cierto, por supuesto, puedo hacer que más ancho. Y volver al simulador. Veamos. Bueno. Así que el registro NS - manera impresionante de depuración. ¿Bueno? A veces es mucho más fácil de establecer un punto de interrupción y luego, cuando llegue allí mirando

en las variables y esas cosas. Se limita a imprimir lo que está pasando y lo puede ver. Especialmente en la interfaz de usuario de las cosas a veces son animados, que están sucediendo en el tiempo. A veces es difícil establecer un punto de interrupción en el medio de una animación para ver lo que está pasando.

Pero si lo hace algunos registros NS, que tipo puede de ver cómo el progreso cosas. Todo bien. La última cosa que voy a mostrar aquí es cómo para añadir una nueva clase a su aplicación porque vas a tener que hacer eso.

Vas a agregar cuatro clases para esto. ¿Bueno? Vas a empezar con esto, está bien, y luego se va a añadir cuatro clases - tarjeta, cubierta, etc, y la forma en que se agrega una clase que es - y, de hecho, la forma de agregar cualquier archivo a su proyecto - es que vaya al menú archivo, archivo nuevo.

¿Bueno? Y no todos los tipos diferentes de cosas que usted puede agregar aquí, archivo de base de datos, archivos de esquema y todo. Pero desea que esta uno de clase Objective-C-arriba a la izquierda. ¿Bueno? Aquí sólo vamos a escribir el nombre de la clase. Así, por ejemplo, si voy a agregar a la tarjeta

y el nombre de la superclase. Bueno. Si usted está haciendo la tarjeta de juego, puede escribir la tarjeta aquí. No tiene que ser algo que se elige de esta lista, bien, que son los IOS. Así que aquí voy a hacer la tarjeta. Podría poner la tarjeta aquí.

Está preguntando dónde almacenar esto. Podría ponerlo justo en el mismo lugar que mi controlador de juego de cartas es, ¿ves? Pero en realidad soy un gran fan de poner el modelo en su propio directorio. Así que usaría nueva carpeta aquí abajo.

Vamos a crear como un directorio del modelo, y que crea un directorio del modelo aquí. Hay un controlador, aquí está el directorio del modelo. Y así crear. Así que va a crear la tarjeta de puntos H y M. A continuación del punto tarjeta de H y M, de acuerdo, versiones tipo de blanco de ellos.

Puede alternar entre ellos aquí. Tenga en cuenta que si cambio la izquierda, los cambios adecuados para que coincidan. ¿Lo ves? Cambiar esto, esto coincide. Esto se debe a que he elegido homólogos aquí. Si usted va a manual y elegir manualmente este archivo,

entonces no va a hacer que la magia más. Pero siempre se puede volver a contrapartes y que se mantendrá sincronizados. Bueno. Lo que puede tener - algunas personas como su archivo de cabecera a la izquierda, un poco a la derecha, lo que sea. Además, observe aquí sería bueno

si puedo también el grupo de estas cosas en el navegador. Y puedo teniéndolos seleccionado haga clic en Nuevo grupo. Decir modelo. Aquí. Y ahora yo he puesto mi modelo en su propio pequeño lugar aquí. Incluso puedo mover esto alrededor, lo dejó aquí, lo que sea.

Podría poner todas mis cuatro clases allí. Es posible vincular este grupo para el sistema de archivos. De hecho, si sólo hace clic en un archivo y abrir el inspector en él aquí, se puede ver que tiene esta ubicación donde se puede especificar si se trata de una ruta absoluta, o relevantes para el grupo que se encuentra, o lo que sea.

Así que usted puede controlar eso. Y eso es. Así que creo que eso es todo lo que necesita para hacer su tarea. No eres más que va a escribir todo el código aquí para la tarjeta y añadir sus otros tres más. Escribir todo ese código en.

Y entonces todo lo que tienes que hacer es asegurarse de que la tarjeta en su lugar de mostrar as de bastos todo el tiempo, tiene que ir a través de la cubierta, ¿de acuerdo? Hay una preparación detallada de escritura de hasta publicado. Cuenta con todo tipo de consejos y ayuda, y le dice acerca de lo que son las tareas requeridas,

y criterios de evaluación, y todas esas cosas. Así que sin duda leer esa cosa en detalle, de acuerdo? No se salte esas cosas y sólo tratar de ir directamente a hacerlo. Y si tiene alguna pregunta, voy a estar aquí. Eso es. >> Para más información, por favor visítenos en Stanford.edu.



Video Description

This is the second lecture of the course as it was published by Stanford University. It has Creative Commons rights.