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



Subtitles / Closed Captions - French

>> Université de Stanford.

>> Paul Hegarty: D'accord. Eh bien, bienvenue à la leçon numéro deux de CS 193P pour l'automne de 2013/2014 année scolaire. Et aujourd'hui, nous allons avoir quelques diapositives au début, peu plus parler, et puis je vais d'avoir une grande démonstration tout à fait ce qui se passe pour essayer

et nous espérons synthétiser toutes les choses que je vous ai parlé environ sur les lames pour les deux premières conférences, qui est que nous allons commencer à construire notre jeu de cartes. D'accord. Ce jeu d'association de cartes va être notre substrat pour les deux premières semaines d'apprentissage certains Objective-C, l'apprentissage de Xcode, l'apprentissage sur la façon dont iOS crochets

le contrôleur, et la vue, et le modèle pour faire une interface utilisateur. Donc, si vous vous souvenez de la dernière fois, nous avons fait cette chose de carte que - nous l'avons fait toute la carte. Il était une classe très simple. Vous avez un couple de propriétés - trois propriétés là-bas - et une méthode.

Et c'est à peu près tout. Et aujourd'hui, nous allons continuer et faire une autre classe, qui est une plate-forme, d'accord? Le jeu de cartes. Et rappelez-vous, cette carte et le pont sont génériques; ils ne sont pas spécifiques à jouer aux cartes, à droite?

Une carte à jouer, comme l'as de trèfle ou le roi des coeurs - quelque chose qui a tout ce qui en elle - qui est une chose de cartes à jouer. Ce sont des cartes générales et des ponts. Donc, cela pourrait être un jeu de cartes flash, un jeu de mots en langue étrangère que vous essayez

d'apprendre ou autre chose. Donc, nous essayons de garder ces pont et les classes de cartes assez générique. Alors, voici le pont. Il devrait sembler familier en termes de sa structure de base, non? Nous importons notre cadre de superclasses là,

puis importer évidemment notre propre fichier d'en-tête dans notre mise en œuvre. Et l'interface pour le pont va avoir ces deux types des méthodes fondamentales: On ajoute une carte à la plate-forme et on tire une carte au hasard sur le pont. D'accord? Et l'ajout d'une carte à la plate-forme est un peu nouveau pour vous

parce que vous pouvez le voir a deux arguments. D'accord? Ceci est la première méthode que vous avez vu qui a deux arguments. Jusqu'à présent, vous avez seulement des méthodes sans arguments ou une méthode vu avec un argument comme celui - match - correspondance avait un argument ou les setters,

ils ont aussi un argument. Donc remarquerez que lorsque vous avez plusieurs arguments et les objectifs, ils voient genre de intercalées avec les noms des méthodes. D'accord? Ainsi, le nom de ce procédé, cette longue méthode est d'ajouter la carte du côlon en haut du côlon.

C'est le nom de cette méthode. D'accord? Ainsi, la partie en haut est en fait partie le nom de ce procédé. Et les arguments, comme la carte que vous allez ajouter et en haut - qui est un booléen si vous souhaitez ajouter au sommet du pont ou au bas de la plate-forme -

d'accord, ces arguments sont intercalés. Et nous allons voir comment vous appelez une telle méthode dans un moment ici. Et puis piochez une carte aléatoire est comme un, vous le savez, semblable à un getter en ce qu'elle renvoie une valeur et il n'a pas d'arguments. Mais ce n'est pas un getter parce que nous ne faisons cette propriété.

Et il est assez important de comprendre que vous auriez pu faire de cette propriété un comme une propriété ou quelque chose en lecture seule qui le lit, mais depuis piocher une carte aléatoire type de fait quelque chose, il a en quelque sorte d'un algorithme à elle - un mécanisme - vous généralement pas en faire une propriété.

Il est un peu un abus de getter de le faire. Un getter est vraiment juste réglage et d'obtenir une valeur. Il pourrait avoir des effets secondaires, comme la mise, il pourrait mettre à jour l'interface utilisateur ou d'obtenir, il pourrait vous assurer qu'il est initialisé en premier - ce genre de choses. Tu ne vas pas à - quelque chose qui fait quelque chose

comme le dessin d'une carte ne va pas être une propriété. Maintenant, si vous voulez avoir, comme, que en haut l'argument facultative, d'accord, la seule façon de le faire en Objective-C - évidemment nous avons besoin de notre fichier d'en-tête là - la seule façon de le faire en Objective-C est

de déclarer une nouvelle méthode, ajouter la carte du côlon sans en haut sur elle. Donc, ceci est une méthode totalement différente, totalement indépendant l'autre procédé à l'exception que dans sa mise en oeuvre de cette autre méthode que nous allons juste d'appeler l'autre, d'accord? Donc, dans la carte add nous allons dire auto ajouter la carte au dessus du côlon,

tout ce que nous voulons que le défaut d'être, que je vais dire est non. D'accord? Il suffit donc de comprendre que, vous le savez, dans certaines langues, comme, certains arguments peuvent être facultatifs ou vous pouvez genre des choses de surcharge d'avoir le même nom de méthode ont différents arguments.

Non, en Objective-C chaque méthode est complètement distincte et a un nom distinct. Et des arguments supplémentaires sont intercalées comme ça. D'accord? Donc, ce serait deux méthodes différentes. C'est logique? D'accord.

Donc, nous allons parler de notre mise en œuvre de notre plate-forme. Donc, notre plate-forme va juste pour contenir un tas de cartes. Nous avons besoin d'une sorte de structure de données interne pour stocker toutes nos cartes. Et ce que nous allons do est que nous allons obtenir un tableau modifiable. Donc, vous avez déjà vu la classe réseau NS,

qui est le tableau de classe de fondation, qui est un tableau d'objets. Ces objets, par ailleurs, dans le tableau peuvent être de toute classe. Il n'y a vraiment aucun moyen de spécifier quel type de classe de l'objet est dans un tableau. Certaines langues vous permettent de le faire.

Vous pouvez spécifier "Ceci est un tableau des cordes », et il le sait. Mais en Objective-C vous ne pouvez pas faire cela. Et nous allons parler de la façon dont nous traitons avec cela. Voilà un peu de l'ouest sauvage de Objective-C, mais il existe des moyens de type de contrôle

et voir ce que les objets sont si vous voulez pour être vraiment sûr à ce sujet. Mais dans ce cas, nous avons juste ce tableau mutable. Et des moyens mutables que nous pouvons ajouter des objets à la matrice. Normalement, un tableau NS est immuable. D'accord? Une fois qu'il est créé, quels que soient les objets y entrer,

c'est les objets qui sont en elle pour toujours - vous ne pouvez pas prendre toute et vous ne pouvez pas mettre tout dans. Donc, si nous voulons tableau où nous pouvons ajouter des choses, nous devons utiliser cette sous-classe de NS tableau appelé NS tableau mutable. D'accord? Vous pouvez voir qu'il est une propriété.

Elle est forte parce que nous voulons que ce réseau pour rester dans le tas aussi longtemps que nous le pointant. Et bien sûr, nous mettons toujours nonatomic là. D'accord? Donc, cela va être un tableau de cartes. Maintenant que nous avons, nous pourrions facilement mettre en œuvre ajouter la carte, par exemple, en disant simplement: «Si en haut, puis insérez l'objet,"

la carte, qui est l'argument de cette méthode - premier argument - "ajouter indice zéro." Donc, insérer l'objet ajouter l'index est une méthode NS tableau modifiable, pas dans le tableau NS - seulement dans NS tableau modifiable parce que ce serait Mutating it - qui insère l'objet à l'index dans le tableau

et l'indice zéro va être le haut que nous allons définir. Et puis sinon, si on ne va pas le mettre en haut, nous allons le mettre au fond, nous allons utiliser une méthode de tableau mutable différents de NS appelé ajouter objet.

Et cela ajoute quelque chose à la fin du tableau. Donc tout le monde cool avec ça? Donc, je viens de mettre la plupart du temps cette méthode ici juste vous montrer il y a un couple de différentes méthodes sur tableau mutable et, vous savez, comment nous pouvons utiliser les arguments. Il n'y a pas grand chose ici; il est juste un peu pour obtenir le plus utilisé

à ce qui se passe ici. D'accord. Voilà donc ajouter la carte. Très, très simple. Et il y a un problème, cependant. Dans cette ajouter des cartes, si nous venons de créer une plate-forme

puis appelé carte d'extension, cela ne fonctionnerait pas. D'accord? Il ne ferait rien. Pourquoi serait-il ne rien faire? Parce que les cartes de propriété, d'accord - est self.cards comment nous accédons notre propre propriété - son getter ressemble que par défaut.

Si nous ne donnons pas un getter, qui est ce que le getter ressemble. Il va juste retourner ce Underbar cartes variable d'instance. Eh bien, cette variable cartes Underbar instance va de commencer à zéro parce que toutes les variables d'instance

dans un objet Objective-C commencer à zéro. Tous. D'accord? Donc, y compris des pointeurs. Donc, ce pointeur sera zéro, ce qui est que nous appelons nil, ce qui signifie qu'il ne pointe pas vers quoi que ce soit, ce qui signifie qu'il n'y a pas ensemble, d'accord?

Nous avons obtenu un pointeur sur un tableau qui ne pointe pas à tout moment. D'accord? Voilà donc un problème. Alors, quand nous exécutons le code dans les cartes d'extension comme self.cards ajouter la carte d'objet, que ça va pas planter mais pas faire quoi que ce soit, que ce soit.

D'accord? Parce que je vous ai dit que vous pouvez envoyer des messages à zéro, envoyer des messages à des pointeurs, des objets où il n'est pas de pointage l'une à l'époque, et il ne plantera pas. Si vous envoyez un message qui renvoie une valeur, ce message ne sera pas exécuter le code mais il sera de retour à zéro.

D'accord? Il y a donc beaucoup de zéros voler ici. D'accord? Alors, comment allons-nous résoudre ce problème? Comment allons-nous faire en sorte que d'ajouter des œuvres de cartes? Eh bien, nous pourrions mettre quelque chose au début de carte d'extension qui dit: «Si self.cards est nul, alors allez allouer un tableau dans le tas et le point à lui, et nous allons l'utiliser ".

D'accord? Mais cela voudrait dire chaque fois que nous avons à utiliser self.cards que nous aurions à faire le tour et vérifier et assurez-vous qu'il est non nul. Et ce serait très ennuyeux. D'accord? Ce serait très sujette à erreur, bug-prone, on oublie de le faire quelque part.

Toutes ces choses. Donc, un excellent endroit pour faire ce petit si le chèque est dans le getter, d'accord? Ce getter que nous avons là pour cartes - c'est le getter pour nos cartes de propriété privée - au lieu de simplement retourner les cartes, nous allons mettre un droit de ligne

en face qui dit: «Si les cartes est nul, alors allons allouer un dans le tas et l'assigner à la variable d'instance ". D'accord? Donc, la façon dont vous allouer un tableau dans le tas est que vous utilisez NS mutable réseau alloc initialisation. Voilà donc deux appels de messages imbriqués dans les uns des autres.

Le alloc attribue le membre dans le tas, et init initialise que la mémoire pour que ce soit un, vous savez, un tableau sensible. Et nous allons voir comment nous construisons notre propre initialiseur dans quelques diapositives ici. Donc, de cette façon chaque fois que vous appelez self.cards,

vous pouvez être sûr que ce n'est pas nul; il est au moins va être un tableau vide. Est-ce que tout le monde comprend ce code? Il est important de comprendre cela. Ouais. [Inaudible]

>> Paul Hegarty: D'accord. Donc la question est: au lieu d'avoir ce code d'initialisation soit dans ce getter, pourquoi je fais pas un initialiseur comme init pour le pont et de mettre cette plate-forme à l'intérieur? D'accord? Et cela est une autre option.

Et encore une fois, nous allons voir initialiseur pour jouer jeu de cartes, nous allons faire un initialiseur. Et nous pourrions faire cela. Mais avoir l'initialisation de cette chose se rapprocher à la réelle obtenir de la propriété est plus - il fait init moins plein d'un tas de ferraille comme ça.

Et ceci est appelé instanciation paresseux, par ailleurs, cette façon de faire. Nous attendons paresseusement à la dernière seconde jusqu'à ce que nous instancions. Ce modèle est quelque chose que chacun en Objective-C est utilisé pour,

et vous devez absolument utiliser plutôt que de faire les choses dans votre fichier init. Dans initialisation que vous voulez, vous savez, mettre les choses, les valeurs établies qui, vous le savez, ne peuvent pas facilement être en défaut comme ça. D'accord? Mais c'est une très bonne question. Et nous allons voir init quelques diapositives.

D'accord? Donc, de cette façon nous self.cards garanti est jamais nul. Ouais? >> [Inaudible] >> Paul Hegarty: Oui. Ainsi, le soulignement est de la dernière conférence.

Rappelez-vous que lorsque nous créons une propriété, Objective-C automatiquement ne cette chose, affectez synthétisent: Cartes est égal à underbar cartes. Donc, en d'autres termes, il assigne une variable d'instance appelée Nom de la propriété underbar comme l'espace de stockage pour cette propriété.

Voilà pourquoi les cartes Underbar sont automatiquement créés pour nous il dans les coulisses. Ce signe au synthétise un pop up dans notre code, mais il est là dans les coulisses. Voilà une très bonne question. Toutes les autres questions à ce sujet?

D'accord. Donc, nous allons effondrer bas certaines de ces choses et de regarder à tirer une carte au hasard, d'accord? Donc, tirer une carte au hasard, tout ce qu'il veut faire est d'obtenir une carte au hasard hors de ce self.cards, d'accord? Alors que le code est très simple aussi. Donc, nous venons d'obtenir un nombre entier aléatoire.

Voilà ce que l'arc 4 au hasard fait si vous ne savez pas. Il est juste une fonction de bibliothèque C. Il obtient un nombre entier aléatoire. Puis ce petit pour cent après cela signifie mod - ok, entier modulo - puis self.cards.count est le nombre des cartes dans nos self.cards.

D'accord? Donc, nous allons juste pour obtenir un indice aléatoire dans self.cards, puis attribuer une carte au hasard être self.cards carré indice des crochets, d'accord? Donc, cela est que les mêmes crochets pour accéder à une sorte de syntaxe de tableau. Et il est intéressant,

que self.cards carré indice des parenthèses, en fait, c'est un message send croire ou non. Voilà même que self.cards objet à l'index de l'index. D'accord? Il est juste une syntaxe spéciale et le sucre syntaxique de faire en sorte que vous n'avez pas d'avoir objet long index add.

Il est en fait objection à l'index indicé ou quelque chose avec un vrai nom long de la méthode. Donc, ceci est juste une belle petite syntaxe simple. Mais cela est un message envoyer pour obtenir la carte à cet index de la matrice. Et puis nous allons aussi retirer cette carte

sur le tableau parce que c'est dessiner une carte au hasard, d'accord? Il est dessiner la carte hors de la plate-forme. Il est donc pas dans la plate-forme plus, non? Maintenant, il y a un problème avec ce code aussi bien, qui est: Que faire si le pont est vide? D'accord? Si le pont est vide, alors que l'indice unsigned va

à zéro, à droite, parce que ça va à l'arc 4 zéro mod aléatoire. Cela va être nul. Et vous allez dire, «Carte aléatoire est égale à self.card sous zéro." Eh bien, cela va planter votre programme

parce que si self.cards est un tableau vide, alors il n'y a pas d'objet à l'index zéro et vous allez pour obtenir l'indice de tableau hors limites. D'accord? Soyez donc prudent de cela. L'indice - vous ne pouvez pas obtenir l'index - si un tableau n'a pas d'objet

de cet indice, vous ne pouvez pas l'obtenir. Donc, qui est facile à fixer, cependant. Nous allons simplement dire: «Si self.cards comptent," en d'autres termes, s'il y a des choses dans le tableau, "alors nous le ferons. Sinon, nous allons tout simplement renvoyer une carte aléatoire, "

que je heureusement initialisée à zéro au début de ma méthode. Et voilà pourquoi je un peu comme cette chose de l'initialiser à la valeur par défaut que vous voulez, puis réglez-le, puis revenir. Et de cette façon si le réglage échoue pour une raison comme ça - il échoue parce qu'il n'y a pas de cartes dans le jeu -

il retournera la valeur par défaut raisonnable. C'est juste une sorte de chose de style de codage. D'accord? Nous avons fait la même chose avec le score and match. D'accord? Une question sur cela? Ouais? [Inaudible]

>> Paul Hegarty: Grande question. Donc la question est: Quand dois-je utiliser NS entier ou NSU entier par rapport int ou même NS numéro, qui est un objet que nous avons pas parlé encore? Et la réponse est qu'il est une question de style. Et nous allons parler un peu de ce style

et quand utiliser ces choses. Ici, je ne veux pas vraiment d'utiliser un nombre NS qui est un objet quand je suis juste l'utiliser, vous le savez, comme une petite chose locale comme ça. Vous ne feriez jamais cela. Vous utilisez les numéros NS essentiellement

de les transmettre à des méthodes. Et même alors, vous pourriez passer ints, vous le savez, et les flotteurs. Ainsi, il sera devenu évident que je parle de numéro NS, que nous ferons la semaine prochaine. D'accord. Voilà donc pour le pont. Deck, très simple classe ainsi.

Passons donc sur une autre classe, qui joue la carte. D'accord? La raison pour laquelle je montre les cartes que vous jouer, Je veux juste vous montrer à quoi ça ressemble de faire une sous-classe d'une autre classe que vous avez écrit. Donc, la carte à jouer est une sous-classe de la carte. Et ceci est la carte spécifique comme roi de cœur,

trois des diamants, ce genre de carte, d'accord? Or, il a des propriétés qui sont spécifiques à une carte à jouer, qui est le costume et le rang. D'accord? Le rang étant comme un trois, quatre, un jack, roi, non? Et le costume étant coeurs, diamants, clubs.

Et je vais représenter le costume comme un seul caractère - les caractères coeurs, le caractère des clubs. Se souvenir de moi tapé le caractère des clubs, je pense que dans la carte que nous aurions pu montré que. Je ne sais pas. Mais vous pouvez taper un seul caractère.

Unicode a un caractère pour chacune des quatre combinaisons. Voilà ce que mon costume va être. Et puis le rang va être un certain nombre entre zéro et treize ans. Est-ce que le roi? Ouais. Représenter le rang.

Voilà donc comment je vais représenter mon API publique. Et là, je suis en utilisant un avis NSU entier au lieu de unsigned int. Alors NSU entier et unsigned int sont presque exactement les même chose. La seule chose à propos de NSU entier est son typedef. Il serait peut-être un peu différent sur différentes plates-formes.

Par exemple, les nouveaux 5s iPhone sont transformatrices 64 bits. Alors NSU entier va être un int 64 bits, unsigned int sur un iPhone 5. Et il pourrait seulement environ un 32-bit de retour sur un iPhone 4 et avant. D'accord? Voilà donc un peu différent.

Ainsi, un int mineur. Nous étions probablement pas représentions entiers. Certes, ici, nous allons seulement zéro à treize ans. Probablement n'a pas d'importance. Mais, vous savez, nous ne sommes pas représenter des nombres entiers qui sont si gigantesque que nous allons être en utilisant le bit 33e.

Donc remarquer que dans la carte de jeu nous cartes impérieuses Méthode contenu. D'accord? Nous héritons le contenu de notre superclasse. Et par le contenu par défaut retourne juste la valeur quelle que soit la propriété de contenu est. Mais ici, dans la carte à jouer, nous allons remplacer le contenu

pour calculer réellement nos contenus, sur la base de ces deux autres propriétés. D'accord? Donc, nous redéfinissant la getter du contenu de sorte qu'elle retourne toujours une chaîne - le contenu de cette carte à jouer - qui est calculée à partir de la combinaison et le rang.

Vous voyez ce que nous faisons ici? Nous sommes donc essentiellement prendre le stockage des matières - contenu Underbar - de notre superclasse et ignorant parce que nous surchargeons son getter. D'accord? Donc, cela est une raison parfaitement valable pourquoi nous faisons ces propriétés ainsi parce que nous pourrions avoir une meilleure façon

à faire des choses que le stockage. Maintenant, voici une façon que nous pourrions mettre en œuvre: Nous pouvons simplement retourner une chaîne, d'accord? chaîne NS, chaîne avec le format comme une chaîne printf ing. Ne vous inquiétez pas que la syntaxe trop. Et je printf-ing une chaîne avec pour cent D et pour cent au signe.

Donc pour cent D signifie entier; pour cent au panneau signifie un objet. D'accord? Une représentation de chaîne d'un objet. Et puis, je suis juste en utilisant le rang et la couleur. Donc, ce serait une façon de faire mes contenus. Ce n'est pas une très bonne façon parce que, par exemple, la prise de coeurs dirait 11 coeurs, d'accord?

Il ne va pas dire J au moins; nous voulons dire J, pas 11. Donc, ce n'est pas une très bonne façon. Ainsi, au lieu que je vais faire un tableau qui a toutes les bonnes choses comme un A pour un, et J pour 11, et un Q 12, et un K pour 13, à droite? Donc, je fais juste ce tableau ici.

Au milieu, je devais couper pour l'adapter, à droite? Et même je fis zéro soit interrogation. Donc, si votre rang est égal à zéro, il va être, comme, d'interrogation, comme, unset. Vous savez, votre rang est fondamentalement pas défini. Et puis je retourne une chaîne, qui prend rang sur

ce tableau et en ajoutant sur elle la petite chaîne de costume, le coeur, ou du club, ou le diamant. Tout le monde comprend cela? Je suis une sorte de vous donner ce que vous puissiez voir comment nous mélanger dans la notation de tableau, et l'envoi de message, et tout type mélanges de façon transparente à l'intérieur.

D'accord? Alors maintenant, le contenu retourne J coeurs, ou 5 diamants, ou autre chose. Notez que notre rang est vraiment sympa parce que si notre rang est égal à zéro, qu'il commence d'être quand nous disons nouvelle carte de jeu - toutes les variables d'instance sont nuls donc rang seraient nuls -

nous obtenons cette belle interrogation. Mais notre costume commence comme nul, et ce serait bien si la combinaison a également retourné d'interrogation si elle était non-dit, si elle était nulle. Donc ici, je suis juste remplaçant le getter de costume-à-dire, "Si le retour, si mon costume est nul, puis retourner le point d'interrogation,

autrement quand mon costume est non nul, puis retourner ce que le costume est. " D'accord? Donc, je suis juste sorte de protéger mon API pour vous assurer que je reviens toujours d'interrogation lorsque le rang ou la poursuite ne sont pas réglées. Ouais.

>> [Inaudible] >> Paul Hegarty: Désolé. Tout petit à petit signe - le rouge à des signes, vous voulez dire? Ouais. Je suppose qu'on n'a pas eu à celle de la carte. Mais nous pourrions avoir. Mais rappelez-vous que toutes les chaînes que nous allons travailler

avec dans cette classe sont des objets de chaîne, non const étoiles de soins, non? Ils sont des objets de chaîne. Et le compilateur, si vous mettez un arobase en face d'une chaîne, il fera un objet chaîne pour vous, d'accord? Voilà donc ce que ceux de signes font,

ils font toutes ces chaînes soient des objets chaîne parce que nous ne pouvons pas mettre une étoile de soins const dans un tableau NS. tableau NS est pour les objets, nous devons donc mettre des objets là comme des cordes NS. Ce sont des objets. D'accord? Bonne question.

Ouais? [Inaudible] >> Paul Hegarty: Oui. D'accord. C'est une bonne question. Si nous avions utilisé que getter est égale à la notation que nous avons utilisé pour est choisi et est adapté à changer le nom,

puis quand nous remplaçons nous devons utiliser le nouveau nom. Il faudrait est que ce soit. Maintenant, ce n'est pas le cas ici. Mais je sais ce que vous dites, et oui, vous auriez à utiliser le nouveau nom. Grande question.

Toutes les autres questions à ce sujet? D'accord. Donc, cela aide le costume retourne toujours d'interrogation si la combinaison est nul ou non défini. Gardons-nous de protéger les personnes installant le costume à quelque chose de mal. D'accord? Disons seulement laisser les gens régler le costume en utilisant cette propriété,

le setter public de la propriété. Nous ne laissons les gens mis le costume l'un des quatre couleurs. Je viens donc à la volée dans le milieu, il a créé un tableau de ces quatre costumes. Et puis-je utiliser cette méthode contient l'objet;

quelle classe pensez-vous contient l'objet est de ce bit sur? N'importe qui? [Inaudible] >> [Inaudible] >> Paul Hegarty: Il est une méthode de tableau NS, exactement. Donc, contient l'objet est une méthode de tableau NS. Je l'envoyer au tableau que je crée à droite en place là-bas.

Le tableau qui a des coeurs, diamants, bêches et clubs en elle. Et je vous demande simplement: Avez-vous contenir cette chaîne? Et qui contient l'objet va comparer le contenu de cette chaîne contre tout cela en utilisant une méthode est égale. En fait, il va dire est égal à quatre d'entre eux

avec le costume comme argument; pas est égal à cordes - est égal. Et dans la chaîne est égale est mis en œuvre par appel est égal à chaîne si l'argument est une chaîne. Quoi qu'il en soit, plus de détails que vous avez besoin probablement là. Mais cela est évidemment protéger.

Donc il n'y a aucun moyen que nous pouvons définir notre variable de stockage costume interne à quoi que ce soit à l'exception des quatre costumes. Ouais? [Inaudible] >> Paul Hegarty: Grande question. Vous les gars sont juste au-dessus de celui-ci.

Ainsi, chaque fois que j'utilise le signe ouvrir crochet - le bleu - pour créer un tableau, qui est en fait la création d'un nouveau tableau à chaque fois. D'accord? Parce que je vous ai dit que ce signe au crochet et tout ce tableau des choses est vraiment juste appeler des méthodes? Eh bien, que cela appelle une méthode comme alloc init tableau

avec des objets ou quelque chose comme ça. Droite? Donc, il crée lui. Donc, il serait bon de le déplacer, et nous allons le faire. Bien que, encore une fois, attention à ne pas preoptimize. Il ne serait probablement pas faire autrement. Je vais seulement le déplacer hors de rendre mon code plus propre;

Je ne vais pas le déplacer pour une raison quelconque de la performance. Ouais? >> [Inaudible] >> Paul Hegarty: Oui. >> [Inaudible] >> Paul Hegarty: La question est: Est-ce que LLVM simplement prendre soin

de cela, d'optimiser ce que pour vous? Et ce ne serait probablement pas parce que c'est un envoi de message; il est pas sûr de ce qu'il pourrait y avoir des effets secondaires de lui. Mais en tout cas, nous allons juste faire juste pour rendre notre propre code de look. Et la performance serait négligeable ici.

Nous parlons UI. Il est même pas proche. Une chose à noter, cependant, avant de faire cela est puisque nous avons mis en place à la fois le compositeur et le getter de costume, nous sommes maintenant tenus de le faire le signe synthétisent. D'accord? En d'autres termes, normalement, nous ne disposons pas

pour ce faire au signe synthétisent. Il est fait pour nous. Mais si nous mettons en œuvre à la fois le setter et le getter, maintenant que nous faisons. Il est facile à faire car il est toujours de cette même forme exacte. Mais nous devons le faire.

D'accord. Donc, voici - nous allons faire ce que nous disions. Prenons ce petit tableau de combinaisons que nous avons là-bas et le mettre dans une autre méthode. Maintenant, encore une fois, je ne reçois pas toute prestation en faisant cela, d'accord? Je suis juste le code de propreté en faisant cela parce que je suis toujours - chaque fois que j'appelle costumes valides,

il va créer à nouveau. Maintenant, je pouvais utiliser une variable statique. Ceci est C. Je pouvais stocker ce tableau. Commencé à être nul. Si elle est nulle, réglez-le sur ce tableau, et alors il ne ferait que créer une fois.

Mais fais attention. Encore une fois, le code de propreté et de manière compréhensible dix fois plus importante que les performances de ce genre. Donc, à moins que vous allez appeler costumes valides dans la boucle interne des milliers de fois,

il ne va pas vraiment à la matière. Mais une fois que je propose que vers le haut dans une méthode différente, ce genre de méthode que je me suis déplacé à est un peu différent. Notez qu'il a un plus. Vous voyez un plus là, au lieu d'un moins le commencer? De plus NS tableau costumes valides?

D'accord. Procédé de plus est une méthode de classe. D'accord? Cela signifie que vous envoyez à la classe, pas à une instance d'un objet. D'accord? Donc, puisque vous n'êtes pas l'envoyer à une instance, vous ne pouvez pas utiliser toutes les variables d'instance ou quelque chose comme ça.

Vous ne pouvez juste genre de faire des choses génériques. Donc, la seule chose que nous utilisons vraiment des méthodes ainsi que pour, les méthodes de classe, est deux choses vraiment: les choses Création comme dans la diapositive précédente lorsque nous avons eu la chaîne avec le format - qui est une méthode de classe qui a été crée une chaîne pour nous; puis aussi des méthodes d'utilitaire comme celui-ci,

comme les constantes de retour et les choses qui, vous le savez, notre classe veut et méthodes utilitaires. Mais voici un exemple. Et la façon dont nous appelons la méthode de classe - vous avez déjà vu moi appeler quelques-uns d'entre eux - mais ici vous appelle ici est que nous mis ouvrir crochet,

le nom de la classe, le nom de la méthode. Et encore, il pourrait avoir des arguments. Il est juste comme toute autre méthode. Mais tout le monde à comprendre cela? D'accord. Et si vous allez en arrière et regarder quelques diapositives et vous voyez le support carré ouvert chaîne NS, chaîne avec le format,

même type exact de la syntaxe. D'accord? Voilà donc ce une méthode de classe ressemble. Encore une fois, pour créer des choses essentiellement et pour les méthodes d'utilité. Et nous allons parler de la différence de: Quand est-ce que nous créons quelque chose

avec une méthode de classe en fonction d'initialisation alloc? Nous parlerons bientôt. Je vais aussi faire des costumes valides public. Et de cette façon les gens qui utilisent ma carte de jeu savent ce les costumes sont valides. Et tout ce que je dois faire est de mettre dans le fichier d'en-tête.

Boom, il est maintenant public. D'accord? Alors, faisons une chose semblable ici avec ces chaînes de rang. D'accord? Donc, je vais prendre les rangs des chaînes - ce tableau de chaînes de rang juste là-haut - et je vais le mettre dans une méthode de classe.

D'accord? Et encore une fois, cela est pour une meilleure lisibilité, pas pour la performance. Parce que chaque fois que j'appeler les chaînes de rang, il est toujours en cours pour créer à nouveau cette chose. Et puis je l'appelle la place là-haut. Et je ne vais pas faire de rang lui-même les chaînes publiques,

mais je vais faire une autre méthode de classe appelée rang max, qui ressemble juste combien de chaînes sont des chaînes de rang. Et je vais revenir que comme une méthode publique. Donc, il y a trois méthodes de classe pour vous de couler vos dents en - deux d'entre eux publique, on ne. D'accord.

Et ils sont donc toutes les méthodes d'utilité, non? Nous ne sommes pas accès à toutes les variables d'instance dans toute de ces méthodes, d'accord? Voilà la seule raison pour laquelle je montre ceux-ci, est juste si vous voyez ce que une méthode de classe ressemble. Nous pourrions également remplacer le setter de rang juste

pour être complet ici pour vous assurer qu'il ne vous permet pas pour définir un mauvais rang comme ensemble rang 15 - il n'y a pas de carte tels que 15. Donc, nous allons faire en sorte que le rang est inférieur au rang max, qui est la méthode de l'utilité que nous venons de faire. D'accord? Est-ce que tous se réunissent pour vous, donner un sens?

Donc, cela est une sorte de matériel de référence. Vous avez ces diapositives qui ont toutes les annotations de toutes les choses que je dis. Donc, ne hésitez pas à revenir en arrière et regarder et rappelez-vous à propos de tous ces NS tableau, la syntaxe, et toutes les méthodes de classe, ce genre de choses.

D'accord. La dernière chose que nous allons examiner à est la méthode init entreprise. D'accord? Donc, nous allons avoir une autre classe appelée ici jouer jeu de cartes. D'accord? Et un jeu de cartes de jeu est une sous-classe de pont.

D'accord? Et il n'a pas API publique. Il va juste pour remplacer une méthode qu'il hérite indirectement de l'objet NS - ok, NS objet à travers le pont, qui ne touche pas - tout le chemin à jouer jeu de cartes.

Et cette méthode est appelée initialisation. D'accord? Donc, c'est le même init, même genre de méthode que lorsque nous avons créé ce tableau - ce tableau mutable nous avons dit NS mutable tableau alloc initialisation. Donc, quelqu'un va appeler cette carte de jeu méthode deck init - à savoir que vous dans vos devoirs allez appeler cette

en faisant jouer jeu de cartes alloc, puis à l'extérieur, init. D'accord? Et voilà comment vous allez pour créer un jeu de cartes de jeu. Et voilà comment nous créons la plupart des cas d'objets - pas tous. Parfois, nous faisons des choses comme la NS string, string au format.

Mais la plupart du temps - plus de la moitié du temps - nous faisons alloc puis sur init extérieur. D'accord. Écoutez attentivement: Ne jamais appeler que alloc chose sans emballage init autour d'elle. D'accord? Ne jamais faire cela. Cela n'a aucun sens d'avoir alloué un objet

dans le tas qui n'a jamais été initialisé. Ayez toujours que imbriqué. Et vice versa: Ne jamais appeler que init sauf quand vous l'envelopper autour d'un alloc. Et certainement jamais appeler que init plus d'une fois. D'accord? Et si vous obéissez à ma règle de ne l'appeler enveloppé

autour d'un alloc, vous ne pouvez pas l'appeler plus d'une fois. D'accord? Init est pas quelque chose que vous pouvez re-init. Init se produit une fois juste après alloc, et voilà. D'accord? C'est une règle dure et rapide, nous ne rompons. D'accord? Donc, vous l'avez entendu ici. Ne pas oublier.

D'accord. Regardons le type de retour whacky à cette méthode d'initialisation, d'accord? Vous pourriez penser que cette méthode d'initialisation doit retourner une carte à jouer étoiles de pont, car il est une sorte d'initialisation et peut-être qu'elle se retourne. Et en fait, init ne revient toujours soi-même, d'accord?

Alors init est toujours va revenir soi. D'accord. Plus whackiness là, que je vais décrire. Juste pour plus de commodité, il renvoie toujours l'auto de sorte que vous pouvez faire, comme, en jouant la carte pont alloc init, envoyé un message. D'accord? Donc, il est tout simplement la commodité qu'elle retourne auto. Mais il ne peut pas vraiment avoir son type de retour étant carte à jouer

deck étoiles parce qu'il a hérité de ce de l'objet NS. Et l'objet NS déjà défini comme NS objet étoile. Tu vois? Donc, il est un peu bizarre que vous hériter d'une méthode dont la valeur de retour aurait de changer chaque fois que vous, vous le savez, l'emportait sur elle. Donc, ils ont inventé cette nouvelle chose - ce qui est nouveau pour iOS 7,

par le chemin - appelé type d'instance. Et quel exemple signifie type est que cela va pour retourner un objet qui est de la même instance - même type, même type de classe - comme l'objet que vous avez envoyé ce message. D'accord? Ce qui fait sens pour inits.

Et dans cette classe qui est probablement tout ce que vous allez à utiliser pour ici. Donc, si vous ne comprenez pas vraiment ce que je viens de dire - il est expliqué dans les coulisses - mais si vous ne comprenez vraiment pas, il suffit de savoir que chaque fois que vous faites un initialiseur,

il va revenir type d'instance que son type de retour et vous allez toujours revenir auto. D'accord? Maintenant, aussi juste prendre mon mot pour lui. Nous allons faire ces prochaines lignes de codes, ainsi parce qu'ils sont vraiment étrange. Cette première ligne, l'auto est égal super init, qui est bizarre.

Qui est super bizarre. D'accord? Assignation quelque chose à l'auto en Objective-C - tout simplement jamais le faire, sauf pour cette fois et c'est dans votre fichier init. D'accord? Vous prenez l'auto et vous affectez pour appeler votre superclasses initialiseur

afin que votre superclasse s'initialisée. Pourquoi avons-nous assignons le résultat à l'auto? Il est le genre de l'histoire ancienne la raison pour laquelle cela a été fait depuis longtemps. Fondamentalement, nous vérifions le retour de nos superclasses initialisation pour vous assurer qu'il initialisé correctement.

Parce que, à tout moment si votre initialiseur ne peut pas initialiser lui-même, il convient de revenir à zéro. D'accord? Et qui laisse tout le monde sait l'un de vos sous-classes ou toute personne essayant de alloc et vous initialiser, vous ne pouviez pas créer un objet bien formé. D'accord? Donc, vous pouvez voir comment ce code, aussi étrange que cela est -

auto est égal super init, puis si l'auto, Je vais me initialiser, retour auto - qui va faire en sorte que je ne cherche même pas me initialiser si mon superclasse, quand je l'appelle init, vous le savez, ne peut pas s'initialiser. D'accord? Il suffit donc de le faire.

Si vous ne comprenez pas, ne vous inquiétez pas trop. Fais-le. Maintenant, une chose est ici nous parlons à propos de init sans arguments. Il est possible d'avoir initializers avec des arguments parce que parfois vous avez besoin d'arguments

pour initialiser correctement une classe. Et nous allons parler un peu plus lundi. D'accord? Donc, aujourd'hui, nous allons juste genre d'os nus initialisation. Alors qu'est-ce init besoin de faire? Que dois-je faire pour avoir un jeu initialisée bien formé jeu de cartes?

Eh bien, un jeu de cartes de jeu a 52 cartes en elle, un de chaque type de carte. D'accord? Roi des clubs, trois des diamants - tous les 52 d'entre eux. Donc, je dois juste itérer à tous les costumes, puis itérer à travers tous les rangs, et de créer une carte, et l'ajouter à moi-même.

Voici donc ça me itérer à travers les costumes, itérer les rangs. Tout le monde cool avec ça? Ensuite, je vais importer carte à jouer parce que je vais pour créer une carte à jouer, cartes à jouer alloc initialisation. Ensuite, je vais mettre

le rang de cette carte, définissez ce que le costume de carte. Rang et costume sont mes petites variables d'itération là. Et puis je vais l'ajouter à moi-même. Je suis une plate-forme, de sorte que c'est parfaitement bien. Tout le monde cool avec ce code? Alors maintenant, je suis un jeu de cartes à jouer bien formé et je peux être utilisé

de tirer des cartes aléatoires et tout ce genre de choses, dont vous aurez besoin à faire pour vos devoirs. D'accord? Et en fait, pour vos devoirs, vous allez avoir de taper tous les quatre de ces classes. Je veux que vous obtenez des classes expérience entrantes, taper une chose, en regardant Xcode se plaint à vous

comme vous tromper dans les choses, et des choses comme ça. Et puis vous allez à l'aide de jeu de cartes de jeu et cartes à jouer. Eh bien, en jouant le pont de la carte et sont vraiment les deux principales vous allez utiliser pour faire vos devoirs. D'accord? Questions à ce sujet?

D'accord. Voilà donc pour les diapositives. Alors maintenant, je vais faire une grande démonstration de vieux. Et cette démo va d'intégrer tout ce que vous avez vu jusqu'à présent, d'accord? Plus particulièrement que MVC choses, nous avons parlé, comme l'action cible, vous savez, laisser tomber la cible

et le tir à l'action ou la sortie de flèche verte que les points dans l'autre sens. D'accord? Nous allons vous montrer ce que qui ressemble en fait comme dans Xcode. Je pense que quand j'ai demandé qui vous avez fait Xcode, presque chacun d'entre vous ont soulevé vos mains.

Donc, je ne vais pas passer trop de temps à parler sur tous les boutons dans Xcode. Je pense que je vais rapidement passer au-dessus de ceux-ci. Mais si vous ne l'avez pas utilisé Xcode, il est dans beaucoup de détails dans les coulisses de cours. Il est le genre de cette procédure.

Par ailleurs, si vous suivez dans les diapositives de cours, ma démo ne va pas être exactement comme ce qui est dans les coulisses. Les diapositives couvrent un peu plus que je peux couvrir en quarante minutes ici. Et il est aussi du matériel de référence.

D'accord? Donc, si je fais quelque chose aujourd'hui dans cette démo et vous êtes comme, "Oh, comment at-il fait cela?" si vous allez regarder dans ces diapositives, il vous dira. Alors ne me sens pas comme: «Je suis arrivé à écrire furieusement vers le bas à chaque clic de bouton, il va faire dans les quarante prochaines minutes. "

En aucune façon. D'accord? Suivez le long de ces diapositives si vous voulez, ou tout simplement fermer votre ordinateur portable, et regarder, et laisser couler parce que vous allez avoir à reproduire ce que je fais dans les quarante prochaines minutes pour vos devoirs. Et ces diapositives vont vous promener

étape par étape comment le faire. Donc, ne vous sentez pas comme vous avez besoin de faire quelque chose en ce moment mais laissez tout cela évier. Avoir une idée de ce qui se passe. D'accord? Et puis quand vous vous asseyez pour le faire, vous serez guidé à travers elle.

La semaine prochaine, nous allons parler beaucoup plus sur Objective-C, répondre à certaines de ces questions plus détaillées comme le nombre NS et certains de ces autres choses que les gens demandent. Et nous allons parler de quelques-unes des choses spécifiques à propos de Objective-C comme liaison dynamique, et des protocoles, et les choses que vous ne voient généralement pas autant

dans d'autres langues ou n'existent pas dans d'autres langues. Donc, nous allons essayer de couvrir tout cela. Donc, à la fin de la semaine prochaine vous êtes jusqu'à la vitesse en Objective-C. Vous commencez à courir vraiment avec Xcode. Et la semaine d'après, nous pouvons vraiment commencer à faire certains,

vous savez, iOS haute puissance 7 choses. D'accord. Donc, la démo ici. [Inaudible] que. D'accord. Donc, la démo que je vais courir dans Xcode. Donc, je vais juste lancer Xcode.

Donc, Xcode vous obtenez en exécutant - aller à votre app store Mac. C'est cette chose ici-bas, à droite? Obtenez le App Store sur votre Mac, et vous venez de recherche pour Xcode, trouver. C'est gratuit. Vous le télécharger et l'exécuter.

D'accord? C'est aussi simple que ça. Ceci est ce que ça va ressembler quand vous apporter la première vers le haut, cet écran d'accueil ici. Comme le trimestre se poursuit, cela remplira avec tous les projets que vous faites. Vous êtes probablement habitué à ce que si vous savez Xcode.

Et ce que nous allons faire aujourd'hui est de créer un nouveau projet. Vous pouvez vérifier un projet existant hors de contrôle source ou vous pouvez en créer un nouveau. Et donc nous allons créer un nouveau. Ainsi, lorsque nous créons un nouveau, il veut nous donner un peu d'aide en proposant de créer un modèle pour différents types

des applications comme un jeu d'openGL. D'accord. Il va créer un certain cadre pour cela pour vous. applications de détail Master, quelque chose que nous allons à faire plus tard au cours du trimestre, bien que nous allons pour construire tout le code nous; on ne va pas utiliser ce modèle.

Et ce point de vue l'application seule ici est fondamentalement un seule MVC, ce qui est de savoir comment nous allons commencer tout cela de nos applications dans cette salle de classe - avec un seul MVC. Ensuite, nous allons ajouter plus de CVM et de construire. D'accord? Donc, ceci est votre seule base app MVC. Je vais donc cliquer sur ce.

Et ici, il va demander des informations à ce sujet comme ce que voulez-vous appeler cette application? Ceci est un jeu de cartes de correspondance que j'ai décidé appeler Machismo, d'accord? Alors que ça va être le nom de notre application juste pour le plaisir. Et le nom de l'organisation peut être tout ce que vous voulez.

Il va apparaître dans les en-têtes de toutes les classes que vous créez. Donc, je fais le mien être l'Université de Stanford. Vous pouvez faire le vôtre être Game House de Bob ou autre. Cet identifiant doit être unique pour vous. Je dois donc edu.Stanford.cs193p.instructor.

Vous pourriez avoir edu.Stanford.cs193p dot votre ID SUNET. Ce sera tout à fait unique. Ces DNS inverse est une très bonne façon pour créer un nom unique. Et il va créer un nom unique pour cette application

en combinant cela avec les noms. Donc, vous pouvez voir qu'il est fait ici, cet identifiant de bundle. Et puis ce préfixe de classe - ce modèle va créer une vue et un contrôleur pour nous. Et cela veut dire, "Que voulez-vous le nom de votre classe de contrôleur pour être? "

Par défaut, il va être appelé «contrôleur de vue," d'accord? Mais si vous tapez quelque chose comme "jeu de cartes," maintenant ça va d'être appelé "contrôleur de vue de jeu de cartes," qui est un peu meilleur nom pour nous. Voilà donc juste le préfixe qu'il va mettre sur le nom de votre contrôleur qu'il crée pour vous.

Et puis enfin là, nous pouvons créer une application ici juste pour iPad, ou tout simplement pour iPhone, ou une application universelle qui se déroulera sur les deux plates-formes. Maintenant, lorsque vous créez une application universelle, vous avez encore pour concevoir votre UI séparément parce que si vous avez plus de règles d'écran, vous allez juste

pour la conception d'une interface utilisateur différent. D'accord? iPad est pas seulement un gros iPhone. Vous pouvez faire beaucoup plus de choses si vous avez plus écran de l'immobilier. Mais vous pourriez encore avoir beaucoup de votre MVC de partage, à droite, parce que l'iPad pourrait avoir peu sous-zones qui sont dans MVC

qui sont exactement les mêmes que sur un iPhone ou très, très semblable. Donc, totalement pris en charge dans iOS 7 pour construire des applications cet objectif deux plates-formes et a d'excellents outils pour vous laisser construire votre deux UI séparément et partager tous les CVM dessous. D'accord? Nous allons faire iPhone seulement ici juste

car il maintient le petit écran et je dois seulement tant immobilier ici. [Inaudible] >> Paul Hegarty: Oui. Donc la question est: Si je suis sur mon iPad et je lance une application qui est iPhone uniquement, oui,

il y a un mode d'émulation essentiellement qui va genre de faire une grande chose en forme de l'iPhone sur l'écran iPad. Donc, nous allons faire ici iPhone. Alors c'est tout. Je vais frapper à côté. Ensuite, il veut savoir,

"Où allez-vous, il a mis ce projet?" Je recommande fortement de le mettre dans votre répertoire personnel - dans un répertoire appelé "développeur" dans votre répertoire personnel. D'accord? À moins que nous sommes peut-être travailler sur différentes classes. Peut-être que vous avez le CS 193P

dans votre répertoire personnel et autre classe. Mais la ligne de fond: Mettez-le dans votre répertoire personnel; ne le mettez pas, comme, en root ou quelque part comme ça. Cela a dans le passé a causé des problèmes. Mais un bon endroit pour le mettre ici. Ceci est mon répertoire personnel, CS 193P là.

Je vois répertoire personnel, développeur. Ceci est où je vais le mettre. Je n'ai pas encore de projets. Cette petite chose ici-bas, le contrôle de la source, nous allons parler de cela. Il est vraiment bien intégré dans Xcode, mais on ne va pas

d'en parler aujourd'hui. Alors laissez que déclipsée. Et voici notre nouveau projet. Vous pouvez le voir nous montre cet écran, que vous obtenez à en cliquant sur cette chose très haut ici. Donc, cela est un peu comme nos paramètres du projet.

Et il y a tout un tas de paramètres ici. Nous serons talk étant tout ce genre de choses que le trimestre se poursuit. Mais aujourd'hui, on ne va pas parler de tout ça parce que nous voulons nous concentrer sur notre MVC. Et notre MVC, ce droit ici, main.storyboard, est notre point de vue. D'accord? Voilà notre point de vue de notre MVC.

Et puis vous voyez ce jeu de cartes contrôleur de vue M et H? Voilà notre contrôleur. Il y a pas de modèle ici. Votre modèle va être ces quatre classes - pont, carte, cartes à jouer, jouer jeu de cartes - que ça va être votre modèle.

Ainsi, vous aurez à entrer que. Je vais vous montrer, à la fin comment faire cela. Cette petite chose ici, jeu de cartes [inaudible] dot H et M, nous allons parler brièvement, surtout quand on commence à parler sur des choses comme le multitâche. Mais je tiens à déplacer seulement ceux de la route.

Donc, je mets souvent les ici dans ce dossier des fichiers de support. Et vous pouvez simplement prendre un fichier, par le chemin, et déplacez-les partout où vous voulez ici pour genre de nettoyer votre vue. Donc ici, j'ai ma vue et mon contrôleur ne montrant ici. D'accord? Donc, nous allons aller directement à la vue

et de voir à quoi ça ressemble. Alors, voici mon avis. Il est un iPhone blanc 5 taille, non? Une vue grand et mince. Et il est vide. Rien de nouveau.

C'est blanc. Cette zone sur la gauche, par le chemin, où nous avons cliqué sur ces fichiers, qui est ce qu'on appelle le «navigateur». Et non seulement vous pouvez naviguer tous vos fichiers ici, mais vous pouvez naviguer dans vos points de rupture, et de construire des problèmes, et vos hiérarchies de classes.

Tous ces trucs ici. Donc, encore une fois, la plupart d'entre vous connaissent Xcode, de sorte que vous savez probablement plus de ce genre de choses. Nous allons faire des démonstrations tout cela comme le trimestre se poursuit. Et cette zone ici est appelé le «secteur des services publics." Et ceci est où vous trouverez essentiellement des détails

à propos de ce qui se passe ici. Ainsi, les inspecteurs pour les attributs et les dimensions et les connexions, et des choses comme ça vont ici. Et cela est également où vous pouvez faire glisser les choses que vous allez utiliser pour construire votre interface utilisateur parce que nous allons construire notre point de vue entièrement graphique.

D'accord? On ne va pas à écrire du code, pour la plupart, pour construire notre point de vue. Comme le trimestre se poursuit, nous allons apprendre un peu plus sur la façon dont pour construire notre point de vue dans le code, mais nous allons commencer out juste purement faire notre point de vue par les choses traînent graphiquement et en réunissant le câblage vers le haut.

Et nous allons mettre notre code dans notre contrôleur. Ces deux côtés peuvent être cachés et représentés avec ces deux boutons. Voir? Vous pouvez masquer ceux-ci. [Inaudible] Cela peut paraître aussi, cette zone ici, ce petit bouton ici-bas. Ceci est appelé le «plan du document."

Ceci est vraiment élégant pratique. Mais encore une fois, on ne va pas, il parle de cela aujourd'hui. Nous ne pouvons parler tant à la fois. Le plan du document. Cela montre à vous toutes les instances d'objets à votre avis sous forme de schéma commun.

Ainsi, vous pouvez vraiment les trouver facilement et leurs relations les uns aux autres. L'autre chose que vous pouvez faire est que je ne veux pas l'iPhone 5 de taille chose parce que mon écran est basse résolution ici de sorte qu'il fonctionne sur le projecteur. Donc, je vais cliquer sur ce petit bouton ici-bas,

qui me réduit vers le bas pour iPhone 4 taille. D'accord? Ou iPhone 4S. Maintenant, je suis grand et mince. Mais vous pouvez cliquer en arrière et déplacez-les de suite. Et je suis juste essayer de tout faire rentrer à l'écran ici. D'accord. Donc, nous allons simplement plonger à droite dans la construction de notre point de vue ici.

Qu'est-ce que notre point de vue va être aujourd'hui une seule carte avec un as de trèfle écrit sur elle. D'accord? Cela va l'être. Et je vais être en mesure de cliquer sur la carte et il se renversera, montrer le dos de la carte, puis cliquez sur sur elle à nouveau, il retourner en arrière pour me montrer l'as

du club de nouveau - avant et en arrière, avant et en arrière. D'accord? Et vos devoirs va être de le faire alors quand la carte bascule vers le haut, il ne montre pas l'as de trèfle, il montre une carte aléatoire tiré de la plate-forme. D'accord? Ça va être toute vos devoirs qui est due Lundi.

D'accord. Donc, nous allons le faire. Vraiment simple. Nous allons à ce domaine ici, cette bibliothèque d'objets. D'accord? C'est le troisième bouton ici, montrer bibliothèque d'objets. Et c'est là tous nos objets sont. Si vous regardez ici et vous ne voyez pas ces objets,

il pourrait être utile en cliquant sur votre point de vue. Parfois Xcode veut savoir ce que la destination est que vous allez traîner les choses en. Donc, si vous cliquez dessus, vous verrez ces choses. Et nous allons juste attraper un de ces boutons ici. Donc, je vais choisir ce bouton et faites-le glisser sur.

Et remarquez, que je traîne dehors, ces petites lignes bleues apparaissent - ces lignes directrices. D'accord. Ces lignes directrices sont super important. Ils semblent tout comme une commodité pour vous aider à le mettre au milieu ou à droite dans le coin à droite.

Et ils sont, mais ils sont vraiment importants pour faire en sorte que toutes les choses dans votre vue sont en quelque sorte, comme, espace standard à part, non? Et alignés contre les bords. Alors que les utilisateurs passent d'une application à une autre, les choses seront tous séparés par des espaces prévisibles

et tout sera compatible. Il est vraiment important. Et il y a un mécanisme - vous pouvez voir ce commutateur ici, utiliser la mise en page automatique, qui a été introduit dans iOS 6 et grandement amélioré dans iOS 7, en particulier dans Xcode - qui permet lorsque votre interface utilisateur change de taille,

comme il va d'être un iPhone 4 à un iPhone 5, ou il tourne d'être vertical étant horizontal, ou il est sur un iPad dans un espace plus grand. Pour tous les boutons et tout à type de déménagement à une nouvelle position qui fait sens ou au moins la plupart d'entre eux, non?

Et puis peut-être vous pourriez avoir à déplacer quelques-uns d'entre eux à la main, en fonction de ce qui se passe. Mais il met surtout automatiquement it out. Et ce qui est vraiment important parce que je suis sûr que les appareils continueront d'être différentes tailles comme neuf, vous le savez, les appareils sortent au fil des ans.

Ce faisant la mise en page automatique est important, et ces lignes directrices bleues sont le nombre plus important chose pour la mise en page automatique. Nous allons couvrir la mise en page automatique dans le détail, et il y a beaucoup à elle. Tous ces boutons ici-bas ont à voir avec la mise en page automatique.

Mais obtenir ces lignes directrices bleu, faire en sorte que vous déposez les choses avec au moins un guide bleu est quelque part vraiment important pour obtenir genre, vous allez dans la bonne voie avec le bien auto aménagé UI. Nous avons donc ce bouton ici.

Mais avant - et bien sûr, nous pouvons aller ici à cela est l'inspecteur des attributs et cliquez dessus. Et nous verrons toutes sortes d'attributs. En fait, si je me cache cela, des tonnes et des tonnes des attributs pour ce bouton. D'accord? Non seulement le bouton lui-même,

mais en réalité sa superclasse possède des attributs. Le contrôle est sa superclasse, puis vue est la superclasse de contrôle et il possède des attributs. D'accord. Donc, ceci est un inspecteur axé sur les objectifs qui montrera tous les attributs de toutes les choses

à travers la hiérarchie d'héritage. Et ce qui se passe ici est que nous sommes en train de l'édition d'un par exemple d'un bouton ici. Donc, nous ne sommes pas - et je sais dans certains systèmes, vous la mise en page sur le bouton, vous définissez la taille, et vous définissez les attributs.

Et puis, vous savez, dans les coulisses d'un groupe code est généré pour créer le bouton. Ce n'est pas ce que nous faisons ici. Nous sommes en fait l'édition des objets vivants. Ils sont essentiellement vont être lyophilisé. Et puis, quand votre application fonctionne, ajouter de l'eau, ils viennent à la vie, d'accord,

avec leurs attributs définis, et toutes leurs tailles et leurs positions, et toutes leurs informations de mise en page automatique dans l'objet. D'accord? Il est donc un peu différent que vous pourriez être utilisé dans d'autres systèmes. Donc, de toute façon, avant de modifier les attributs de ce bouton, cependant, nous allons changer notre fond

parce que c'est un jeu de cartes. Et la plupart des jeux de cartes sont sur, comme, feutre vert, à droite? Donc, nous allons faire de notre fond soit plus comme un feutre vert. Donc, je vais juste cliquer sur l'arrière-plan, qui est ce point de vue ici, et vous pouvez voir ses propriétés. Donc, je vais changer un couple -

ou tout simplement une de ses propriétés - ce qui est l'arrière-plan. Vous voyez ce fond de couleur blanche ici? Donc, si je clique sur ce, j'ai quelques couleurs récemment utilisées. J'ai tous ces types de couleurs noir et blanc. Et je dois aussi d'autres. Et je soulève d'autre part, fait apparaître les crayons, ok?

Il soulève aussi d'autres façons de choisir les couleurs, mais j'aime les crayons. D'accord? Et où sont mes crayons? Ils sont là. Donc, nous allons choisir un vert, comme, la mousse est un bon vert. Trèfle. Je peu comme la mousse mieux.

Voilà donc une sorte de fond de jeu de cartes. Et c'est tout. Donc, nous avons mis la couleur de nos vues d'arrière-plan. D'accord? Et tous les réglages de l'attribut est comme ceci: Vous venez de définir et l'oublier. Donc, nous allons revenir à la touche et ses propriétés.

D'accord. Le bouton Je veux ressembler à une carte. Eh bien, un bouton dans iOS 7 ressemble fondamentalement beaucoup comme un lien hypertexte sur une page Web, tout comme ce bouton fait là. D'accord? Ce bouton bleu. Cela ne veut pas vraiment approprié pour ce que nous voulons.

Nous voulons qu'il ressemble à une carte avec un peu rect arrondi et un fond blanc, à droite? Et je veux que le dos de la carte à la même apparence mais avoir une sorte de conception sur elle ou quelque chose comme ça. Donc, la façon dont je vais faire est que je vais pour définir une image de fond pour mon bouton.

D'accord? Une image de fond qui est comme un rect arrondi. Prenons donc un peu de côté ici et parler de: Comment pouvons-nous obtenir des images dans notre application? D'accord. Nous voulons utiliser des images dans notre application; il est très fréquent à vouloir utiliser des images dans une application graphique comme sur un téléphone.

Alors, comment voulez-vous faire? Et la réponse est que vous allez ici à cet endroit appelé le "Bibliothèque d'actifs d'image" - actifs images.xc ou actifs Xcode. Et vous pouvez voir il y a déjà un couple des fentes pour les icônes ici.

Ils ne sont pas réglés, mais cela est l'icône de l'application. Et aussi, vous pouvez avoir une image de lancement qui apparaîtra instantanément quand quelqu'un lance votre application. Et puis comme vous l'initialisation, ayant derrière l'image de lancement, puis il montrera que vous êtes l'interface utilisateur réelle. Donc, il est en quelque sorte l'image de lancement rapide de.

Et nous allons parler de ce lundi. Nous allons mettre l'arrière-plan d'application pour Machismo ici. Mais je vais effectivement glisser dans une autre image. J'ai donc quelques images ici. Et par exemple, j'ai ce logo Stanford ici. Je vais donc faire glisser que Stanford logo

parce que je veux l'utiliser. Et c'est tout; vous venez de le faire glisser ici. Il dit Stanford. Mais remarquez que ce genre de a cette chose bizarre ici, ce 1X et 2X. Tu vois ça?

Et c'est parce que chaque image que vous allez utiliser dans iOS veut avoir une version normale de résolution qui va pour être utilisé comme sur l'iPhone 4 - nonretina affiche essentiellement. Et puis un 2X, deux fois plus haute résolution - celui qui sera utilisé sur la rétine. Et il sera automatiquement choisir le bon,

en fonction de ce que vous êtes en cours d'exécution sur. D'accord? Vous n'êtes pas obligé de faire quelque chose à ce sujet. Mais vous ne voulez fournir ces res les plus élevés. Et ces res les plus élevés ne sont pas seulement nécessairement la même exacte l'image, juste, vous le savez, fait plus haute résolution. Ils pourraient vous permettre de faire -

par exemple, ici, j'ai un logo Stanford avec le petit arbre. Voir? Voir l'arbre là-bas? Alors peut-être ce qui est trop basse résolution pour vraiment un beau arbre. Mais je peux obtenir l'arbre dans une résolution plus élevée,

donc je l'ai mis là-dedans. Donc, il est pas commun que les deux seraient ceux effectivement différente prospectifs, mais ils pourraient l'être. Certes, ils pourraient être autorisés. Je ne veux pas vraiment appeler cela "Stanford." Je vais l'utiliser comme ma carte de sauvegarde.

Au lieu d'avoir, vous le savez, une sorte de conception, Je vais avoir le logo Stanford être le dos de ma carte. Lorsque retourné ma carte vers le bas et je vois le dos, Je vais voir le logo standard. Je vais donc appeler cette «carte de retour." Je peux l'appeler tout ce que je veux.

Je dois aussi des choses pour l'avant ici. Celui-ci ici. Ceci est une carte vierge avec un coin arrondi. Le voilà. Vous ne pouvez pas le voir. Parce qu'il est une carte blanche de sorte que vous ne pouvez pas le voir.

Mais je vais l'utiliser. Je vais appeler cette "avant de la carte." Et je vais aussi avoir une version haute résolution de cela aussi. D'accord. Donc, ce qui est bon. Donc, autant que nous pouvons voir de celui-ci.

D'accord. Alors maintenant, je suis quelques images. Et maintenant, je veux les utiliser à mon avis. Je sorte de veux mettre cette carte à utiliser. Donc, je vais commencer avec ma carte étant ici le visage quand il fonctionne. Lorsque mon application fonctionne, la carte va commencer face vers le haut.

Dans votre application lorsque vous obtenez vos devoirs, vous allez probablement de vouloir démarrer facedown. La raison en est que mon application ne montre une carte: Ace of clubs. Donc, il est très bien s'il arrive avec as de trèfle. Mais vous ne voulez pas votre carte à venir as de trèfle à coup sûr.

Et il pourrait être un peu plus de travail pour vous de codage-sage pour l'initialiser à venir avec une carte au hasard. Je vais donc ai venir facedown. Faire beaucoup plus facile sur vous. D'accord? Alors, comment nous avons mis cela? Vraiment simple.

J'ai le bouton sélectionné ici. Voici ses propriétés. L'une de ses propriétés est son image d'arrière-plan. D'accord? Donc, je vais juste cliquer ici, et vous pouvez voir que toutes les images qui sont dans ma bibliothèque d'actifs seront ici. D'accord? Et s'il y avait vraiment beaucoup d'entre eux,

vous pouvez taper et il va correspondre. Donc, je vais faire ce soit le recto de la carte. Donc, il a fait le recto de la carte, mais je ne vois pas - où est le rect arrondi? D'accord? Je ne peux pas voir le rect arrondi. Et c'est parce qu'il est trop petit

pour voir les coins arrondis très bien ici. Donc, vous pouvez simplement prendre cette chose et la redimensionner. D'accord? Et je vais le faire - Je veux que ce soit environ deux à trois [inaudible]. Donc, je vais faire 64 par 96. Je sais que cela se trouve être une très bonne taille, et je l'ai redimensionné il.

Et maintenant, vous pouvez voir les petits coins arrondis. Tu vois? Donc, ce que l'image que je traînais avec le bouton écrit sur le dessus de celui-ci. Et bien sûr, je me suis déplacé un peu pour que je puisse le remettre au milieu en utilisant mes directives bleu, à droite? Et bien sûr, je ne veux pas ma carte pour dire "bouton" il;

Je veux l'as de clubs ici. Donc, je vais double-cliquez dessus. Je pourrais aussi modifier ce ici. Vous voyez ici où il est dit "bouton"? Cliquez ici. Je vais juste double-cliquer directement sur elle.

Je vais taper "ace". Et comment puis-je tape clubs, quelqu'un sait? quelque chose de Alt ou autre. Je tiens à faire de cette façon. Je vais modifier menu, des caractères spéciaux, obtenir cette chose magique.

Vous avez déjà vu cela, sorte de fraîcheur? Il suffit de double-cliquer - trouver les clubs et double-clic. D'accord. Donc, il y a mon as de trèfle. Maintenant, mais, vous savez, ce n'est pas tout à fait raison, que ce soit. Je ne suis pas vraiment comme ça A. bleu Je veux vraiment l'A à être noir.

Et il pourrait être un peu plus grand. Il y a plus de place pour elle. Donc, je peux aller ici, par exemple, et changer la police. Je peux changer en cliquant sur cette petite chose pour le rendre plus grand, ou je peux effectivement cliquer sur ce T et même définir quelle police il est. Une chose qui est vraiment important

dans iOS 7 est la typographie. D'accord? Choisir les styles de texte à droite est vraiment, vraiment important dans iOS 7. Et on ne va pas vraiment parler ici; nous allons simplement utiliser la police système. Mais c'est quelque chose que nous allons parler en conférence,

est en vous assurant de choisir les bonnes polices dans les bons endroits pour faire le look de l'interface utilisateur très agréable. Je peux changer la taille ici, peut-être 24 points ou quelque chose comme ça. Ce sera encore en forme. Et puis, je ne veux pas ce bleu, de sorte que c'est la couleur du texte.

Donc, nous allons aller de l'avant et de faire que le noir. D'accord. Alors je suis la carte en regardant la façon dont je veux. C'est bon. Toutes ces propriétés que nous mettons en place, par la manière, si vous regardez le bouton, vous voyez cet état config ici?

Défaut? Nous pouvons effectivement mettre toutes ces choses différemment pour l'état de surbrillance du bouton, ou d'un état sélectionné, ou état désactivé. Mais nous établissons ces comme la valeur par défaut. Donc, tous nos boutons vont toujours être l'affichage de l'état par défaut.

D'accord? Donc, les boutons sont assez puissants. Vous pouvez les avoir un aspect différent car ils mettent en lumière ou autre, mais nous allons travailler ensemble dans ce qu'on appelle la «Normal» ou état du bouton "par défaut". Vous verrez que lorsque nous arriverons à le code. Nous pouvons donc exécuter ce moment.

Donc, en cours d'exécution. Vous avez tous - plus, encore une fois, fait Xcode. Vous savez comment faire fonctionner. Il est ce petit bouton de lecture. Vous pouvez réellement la maintenir enfoncée, et il y a d'autres choses que vous pouvez faire comme tester et analyser.

Mais nous allons juste courir. Donc, je clique sur l'exécution, et ça va exécuter ce dans un simulateur. D'accord? Et ici il est. Et vous pouvez voir que ce simulateur si grand qu'il ne même pas tenir sur mon écran. Je sorte de devoir faire défiler autour d'elle.

Et quand je clique dessus, il ne fait rien. D'accord? Donc, ce n'est pas bon. D'accord. Parce que je ne l'ai pas mis tout code dans mon contrôleur pour répondre à cette chose être touché. Voilà donc ce que nous allons faire ensuite.

Donc, nous allons revenir ici et arrêter. D'accord. Donc, comment fait-on cela? Eh bien, il est assez intéressant de voir comment nous faisons cela, en fait. Je vais faire un peu plus de place ici. Et ce que nous devons faire est de connecter jusqu'à notre contrôleur. Et nous le faisons en mettant du côté du code de notre contrôleur

côte à côte avec notre point de vue. D'accord? Donc, je vais cliquer sur ce petit bouton ici, ce bouton icône, et qui met côte à côte. Et par défaut si vous avez une vue ici sur la gauche, il va mettre le code de ce contrôleur sur la droite.

Et vous pouvez déplacer ce pour obtenir plus d'espace pour le code si vous voulez. Vous pouvez également basculer entre l'en-tête si vous voulez de faire des choses publiques ou la mise en œuvre. D'accord? Donc, ce qui est bon. Maintenant, ce code ici fait partie

du cycle de vie vue contrôleur, que nous allons parler dans deux ou trois semaines. Mais aujourd'hui, on ne va pas en parler. Donc, nous pouvons tout simplement se débarrasser de lui. Et nous allons juste commencer en disant: «Quand ce bouton se touché, nous voulons qu'il retourner sur ".

Nous avons donc besoin d'établir une connexion entre notre point de vue et le contrôleur. Et nous allons faire cette chose où nous accrochons la cible out et tirer la flèche. D'accord? Appelé «l'action cible." Et cela va être une sorte de whacky.

Vous êtes même probablement pas à croire quand vous le voyez. La façon de le faire est que vous maintenez la touche de commande. Donc, je suis maintenant la touche de commande, et je traîne une ligne du point de vue directement dans notre code. D'accord? D'accord? Et je laisse aller.

Et il dit: «Oh, vous voulez une connexion entre votre vue et votre contrôleur, pensez-vous? Voici ce que je dois savoir. " Donc, il nous demande: «Qu'est-ce que vous voulez-vous d'appeler cette connexion? " Donc, cela va être le nom de la méthode.

Il va réellement créer une méthode qui est appelée ici lorsque le bouton se touché. Je vais l'appeler "bouton de carte toucher." Voilà un bon nom. Ici, il est dit: "Qu'est-ce que vous voulez-vous le type de l'argument d'être? "

Nous en parlerons plus tard, mais pour l'instant, nous voulons évidemment l'argument soit le bouton qui nous envoie cette action, d'accord? Ce qui va être agréable parce que nous allons de parler de nouveau à lui et de lui dire de se retourner sur. Il y a d'autres choses que nous pouvons établir ici, comme:

Quel type d'événement voulez-vous envoyer cette action? Et vous pouvez réellement définir, donc il n'y a aucun argument, il envoie simplement le bouton de carte de contact avec aucun argument. Mais ici, nous voulons qu'il ait l'argument de l'expéditeur, le bouton envoyer ce message. Vous pouvez même envoyer l'événement tactile long,

mais nous presque jamais faire cela - un dixième de pour cent du temps. Donc ici, je vais avoir l'expéditeur. Alors, quand je clique sur connecter, il crée une nouvelle méthode. Et cette méthode est câblé à ce bouton. En fait, vous voyez ce petit cercle autour? Si je souris dessus, il va vous montrer c'est ce qu'il est

connecté à. D'accord? Donc, ceci est juste une méthode assez normal prospectifs ici. Le type de retour, l'action IB, qui est en fait typedef vide. Cette méthode retourne effectivement vide. La raison pour laquelle Xcode met l'action IB il

et IB l'action de typedef pour annuler, il est juste pour qu'il puisse dire quelles sont les méthodes action ciblée afin qu'il puisse faire des choses comme ça. D'accord? La souris. Mais le compilateur ignore. Le compilateur considère comme nul parce qu'il est typedef d'annuler.

Il est purement une chose Xcode à cette action chose IB. Et alors vous pouvez voir cette méthode a un argument, qui est l'expéditeur. C'est le bouton de nous envoyer ce message. Et il va envoyer ce message à chaque fois une touche va à l'intérieur du bouton.

Touchez à l'intérieur, à droite? Ce fut l'événement. Voilà donc quand il va envoyer ce message. Voilà donc parfait. Voilà ce que nous voulons. Ainsi, chaque fois que cela arrive, qu'est-ce que nous voulons faire?

Eh bien, nous voulons retourner la carte au-dessus. D'accord. Commençons donc par tout simplement la retournant à l'arrière. Et la façon dont nous allons faire est que nous allons pour créer une variable locale appelée "image de la carte." D'accord. Et vous l'avez remarqué essayait de me aider tape là, et vous allez voir beaucoup d'aide ici.

Et l'image interface utilisateur est une autre classe dans iOS, d'accord, tout comme le bouton UI est une classe. l'image UI est la classe, comme vous pouvez l'imaginer, stocke une image. Peut-être une image JPEG, pourrait être un GIF animé, il pourrait être une image TIFF, peu importe. D'accord? Il est donc très puissante classe image de maintien.

Et il a une méthode de classe appelée "image nommée" et vous donnez une chaîne comme recto de la carte ou la carte arrière, à droite? Et il va chercher dans la bibliothèque d'actifs et de donner une image de la bonne résolution, selon que cela va être aller sur - en fait, il vous donnera une image avec les deux résolutions.

Et puis selon l'endroit où vous l'afficher, il sera, vous le savez, choisir la bonne résolution, que ce soit sur une rétine ou non. Donc c'est cool. Nous avons obtenu l'image. Alors maintenant, nous allons juste de dire le bouton pour régler cette comme son image de fond au lieu de tout ce qui est sur elle en ce moment.

Donc, pour parler du bouton, nous faisons ouvrir crochet expéditeur. Droite? Vous voyez que l'expéditeur est le bouton de nous envoyer ce message. D'accord? Ensemble. D'accord, je vais commencer à taper set background. Et vous voyez que je commence à taper, Xcode suggère

pour moi ce que je pourrais avoir besoin. Maintenant, il sait que l'expéditeur est un bouton de l'interface utilisateur, il est donc seulement suggérer des méthodes bouton ici que commencer avec l'ensemble B - définir la couleur d'arrière-plan, définir l'image d'arrière-plan, et mettre des bornes. D'accord? Remarquez que je suis aussi obtenir de l'aide au fond.

Voir, est-ce pas cool? Un peu une ou deux lignes d'aide? Et je pourrais cliquer sur ce lien et il me faudrait à la documentation. On ne va pas le faire pour des raisons de temps. Mais je peux aussi simplement cliquer sur l'un et il ramasse qu'un

et sélectionne immédiatement le premier argument. Donc, je peux prendre ça. D'accord? Donc, je vais le faire. l'image de la carte. Et remarquez ici quand je tape CA, il y a beaucoup de choses qui commencent avec CA qui pourrait y aller.

Mais Xcode est assez intelligent. Il sait qu'une variable locale est beaucoup plus probable que vous veulent ici que tous ces autres CA - fonctions qui commencent par CA. Donc, il sélectionne automatiquement que pour moi. Et si je frappe onglet, par la manière,

il va échapper essentiellement complète il. [Inaudible] Et si je frappe un autre onglet, il va ici. Cette petite chose à quatre états est juste ce dont je parlais à propos de laquelle vous pouvez définir ce pour l'état mis en surbrillance, ou de l'état, ou état désactivé sélectionné. Nous allons juste faire de la normale

ou de l'état de ce bouton par défaut. D'accord? Nous allons donc fixer l'image d'arrière-plan pour ce bouton. Et nous devons aussi définir le titre parce que nous ne voulons pas de voir que as de trèfle quand nous la retourner en arrière. Donc, je vais le mettre à cela.

D'accord. C'est la chaîne vide. Je pourrais aussi dire nulle là. D'accord. Mais je dis simplement une chaîne vide pour voir ce que chaîne vide ressemble. Donc, en fait, si nous courons cela, commandent trois. D'accord, nous allons essayer cela.

Oh cool. [Inaudible] Donc là vous allez. Donc, il y a une version miniature de celui-ci. D'accord. Alors, voici notre carte. Et si je clique dessus, oh ouais, il bascule. Oui. logo Stanford avec l'arbre. Mais maintenant, si je clique, il ne fait rien d'autre;

il retourne toujours vers l'arrière, qui est exactement ce que notre code ne, pas vrai? Donc, ce qui est bon. Donc, nous allons fixer pour qu'il retourne dans les deux sens. D'accord? Et je vais le faire en disant que si le - en fait, je vais faire une autre chose première

de rendre ce code un peu plus simple est la place d'avoir cette variable locale, je ne peux prendre ce et de la pop juste là. D'accord? Et ce qui est très commun pour le faire. Et si je voulais envelopper, il se terminera automatiquement si je fais ce trop court.

Mais je peux aussi mettre un retour là-dedans. Et quand je fais, regardez ce qu'il fait avec les colons. Voyez comment il lignes côlons up? Ce sera toujours le faire. Si vous appuyez sur le retour au milieu d'un envoi de message qui a plusieurs arguments, il alignera les colons

pour tous les arguments. Vraiment cool. Ainsi, vous pouvez voir tous les arguments alignés à gauche et à droite. Donc, de toute façon, je vais vérifier pour voir si le titre en cours - ok, c'est une méthode de bouton - si elle est une chaîne. Si cette longueur, d'accord, est différent de zéro, d'accord -

de sorte que ce test pour voir si la longueur non nulle - qui est une façon cool de le faire parce que cela va travailler si le titre du bouton est nul ou qu'il est si la chaîne vide. Parce que le titre du bouton commence à zéro. Si vous ne définissez pas à quoi que ce soit, il commence à zéro. Donc, ici avec une seule ligne de code que j'ai vérifié à la fois la première

Etat peut - pas dans notre cas parce que nous avons mis le titre à un club - mais dans votre cas, il serait peut-être. Ensuite, nous allons mettre à une chose, sinon nous allons mettre à l'autre chose. Donc, nous voulions juste mettre cela à cela. D'accord?

Donc, s'il y a un titre sur le bouton, en d'autres termes, il a l'as de trèfle, alors nous allons de passer à l'arrière. Et s'il n'y a pas de titre sur le bouton, nous allons pour revenir à l'avant. D'accord? Ace of clubs.

D'accord? Alors maintenant, quand nous courons, notre carte sera retourner dans les deux sens. D'accord? Donc, vraiment simple à câbler choses dans votre contrôleur pour faire ce que vous voulez. La prochaine chose que nous allons faire est dans le - ok, je vais vous montrer très rapidement ici. Si vous maintenez enfoncée la touche option, une clé très importante,

ne voyez-vous la façon dont il met un point d'interrogation et commence à mettre en évidence les choses? Cela va permettre à vous de la transition dans la documentation. Donc, si je veux en savoir plus sur ce titre, si je frappe option, cliquez sur elle -

vois, je reçois un peu d'aide ici. Il est une propriété. Il est en lecture seule, il est nonatomic. Par ailleurs, si vous voyez «conserver» dans la documentation, qui est la même chose que «fort». D'accord? Maintenir est le même que fort fondamentalement.

Un peu de la description ici, mais aussi des hyperliens. Et si je clique sur un de ces liens, comme celui-ci, il me prend dans la documentation. Ceci est une fenêtre séparée ici. Et vous pouvez naviguer autour de cette documentation. Vous voulez vraiment de se familiariser avec tout cela.

Je ne peux pas vraiment montrer tout à vous aujourd'hui pour des contraintes de temps, mais vous pouvez faire des choses comme la recherche, comme je peux aller trouver le bouton de l'interface utilisateur ici. D'accord. Il y a bouton UI. Je pourrais faire défiler vers le bas et aller, par exemple, ensemble image de fond ou de définir l'image d'arrière-plan

pour l'état, que nous venons de voir. Peut-être que je clique pour aller l'image de l'interface utilisateur. Vous voyez tout cela. Il y a de belles descriptions de la classe au début puis toutes les méthodes, etc., etc. veulent donc définitivement pour devenir un maître de cette documentation.

Vous pouvez également l'option double-cliquez sur les choses et il vous enverra directement à la documentation. Si vous ne voulez pas d'obtenir le peu d'aide d'un premier, vous pouvez aller directement à. Donc, l'option est la clé un pour cela. Allons de l'avant - d'accord.

Notez que ce petit espace le long du fond ici est apparu quand nous avons eu l'application - vous voyez cela? Ceci est le débogueur à gauche, et ceci est la console droite. D'accord? Et vous allez certainement être en utilisant le débogueur et la console à la fois dans cette classe.

Et effectivement, je pourrais avoir le temps de faire un rapide - vous montrer comment faire la console. Mais de toute façon, vous pouvez le cacher en le faisant glisser vers le bas ou encore en cliquant sur cette chose [inaudible]. D'accord. Donc, la prochaine chose que nous allons faire est que nous allons

de mettre un peu l'étiquette sur notre interface utilisateur qui compte les flips. D'accord? Une petite chose incrémentale qui incrémente chaque fois qu'il ya un flip. Et nous le faisons en revenant ici et nous attrapant une étiquette. Donc, une étiquette est un morceau de texte, texte non modifiable en lecture seule.

Et je vais le faire glisser ici et le mettre dans le coin inférieur gauche. Je vais double-cliquez dessus pour l'appeler "flips colon zéro." Voilà ce que je veux qu'il ressemble quand mon interface utilisateur lance le premier. Maintenant, ici, je ne vais jamais à taper sur ce et provoquant un message à envoyer comme le bouton;

il est dans l'autre sens. Mon contrôleur veut parler à cela et le dire lorsque les flips change tout le temps. D'accord? Donc, vous pourriez penser que vous faites glisser à partir du code jusqu'à ce flips, mais malheureusement vous ne faites pas cela. Vous détenez toujours vers le bas contrôle et faites glisser à partir d'ici.

Mais au lieu de glisser vers le bas dans votre zone de mise en œuvre, vous le faites glisser dans la zone d'interface parce que vous allez pour créer une propriété qui relie à cette étiquette essentiellement. Donc, nous faisons cela. Nous obtenons une chose ici.

Il nous demande un peu différentes questions: "Quel est le nom de cette propriété?" Je vais l'appeler "flips étiquette." D'accord? Notez que cette propriété est faible. D'accord? Lorsque je clique sur connecter, il va faire un bien ici et il va être faible.

Ceci est la première fois que nous avons vu la faiblesse par rapport fort. La raison pour laquelle cela est faible est parce que cette étiquette est maintenue fermement par la vue elle-même. Donc, on n'a pas besoin d'avoir un pointeur fort pour elle, pour le garder dans le tas. La vue sera.

Et si cette étiquette ne quitte jamais la vue, il obtiendra nettoyé à partir du tas. Et cette propriété - ce pointeur vers elle - va se mis à zéro, ce qui est exactement ce que nous voulons. Parce que si ce flips étiquette est pas dans la vue, nous ne voulons pas d'être mise à jour et l'envoi des messages.

Donc, il est un grand usage de faible ici. C'est une propriété normale que vous êtes habitué à excepter pour peut-être cette sortie IB. C'est tout comme l'action de l'IB. Il est une chose de son sens le compilateur ignore que Xcode utilise.

D'accord? Alors qu'il peut le faire - vous montrer ce qu'il est connecté quand vous souris dessus. D'accord? Par ailleurs, vous pouvez voir toutes les connexions par également un clic droit sur les choses. Donc ici, je juste-cliqué sur le bouton et vous pouvez voir ses connexions.

Si jamais vous souhaitez renommer - comme si je n'aime pas le bouton de la carte tactile, je veux renommer à quelque chose, vous ne pouvez pas renommer malheureusement. Vous devez aller ici, clic droit, utiliser cette petite chose pour le débrancher, puis contrôler à nouveau glisser.

D'accord? Tout le monde a cela? C'est regrettable. Ce serait vraiment bien si Xcode pourrait suivre que pour vous, mais il ne peut pas. Donc, si jamais vous voulez renommer quelque chose, vous devez vous déconnecter ici par un clic droit sur elle,

puis contrôler glisser un nouveau et définir le nom de cette façon. Vous pouvez aussi cliquer à droite sur ce petit gars et il vous montrera toutes les connexions pour votre contrôleur. Ouvre cette fenêtre. Et je peux voir l'étiquette. Tu vois? Je souris sur le bouton.

Étiquette. Il y a aussi cette petite propriété ici, qui est quelque chose que vous ne l'avez pas vu, qui est essentiellement une propriété qui pointe à la vue entière de votre contrôleur. Donc, ce sont les connexions à vos contrôleurs. Voir, il est dit "contrôleur de vue de jeu de cartes"?

D'accord? Voilà donc un clic droit. Je clic droit sur ici. D'accord. Alors, comment allons-nous faire de ce flips travail de label? Nous allons le mettre de côté pour une seconde. Ne pensons pas à ce sujet.

Disons plutôt faire une autre propriété. Propriété. Ce qui est nonatomic, qui va tout simplement être un int, ce que je vais appeler «le nombre de flip." D'accord? count Donc bascule est juste un nombre entier qui va pour maintenir le nombre de flips. Et regarder cela.

Un peu plus d'espace ici. Va là-bas. Je vais descendre ici et dire comte self.flip plus plus. D'accord? Maintenant, est-ce que appellent le setter ou le getter pour bascule compte? Tous les deux. Exactement.

Qui appelle à la fois le compositeur et le getter. Il est d'appeler le getter pour obtenir le nombre de feuilles, alors il est ainsi plussing il; puis qu'il appelle le setter pour le mettre en arrière. D'accord. Voilà donc une sorte de doublure funky de Code là. C'est la même chose que dire le nombre de self.flip est égal à self.flip

compter plus un. Alors qu'il appelle le getter et le setter. D'accord. Alors maintenant, nous avons cette belle nombre de flip. Il est garder la trace du comte; comment pouvons-nous accrochons que jusqu'à à cette chose ici? Ce que je vais faire un peu plus grand, par la manière.

D'accord. Comment pouvons-nous crochet de façon à ce que dit flips colon un, flips colon deux, flips colon trois? Eh bien, nous allons le faire en utilisant le setter pour compte flip. D'accord? Donc, normalement, un setter pour le nombre bascule devrait ressembler à ceci. D'accord? Et voici une autre grande utilisation des setters et getters, qui est de garder l'interface utilisateur en synchronisation avec une propriété.

Et je vais juste faire cela en disant self.flips étiquette - flips Label.text est égal à - oops, désolé. Il est difficile de taper debout. Égal chaîne NS, chaîne avec le format, que vous avez vu avant, flips colon pour cent le nombre D de self.flip. D'accord? Alors maintenant compter chaque bascule de temps est modifié, nous allons

de mettre à jour l'interface utilisateur. Donner un sens? Une question sur cela? D'accord. Donc, nous allons courir. D'accord. Voici notre truc. Alors cliquez, flips plus, les mises à jour de comptage à feuilles mobiles.

Flip, flip, flip, flip. Retour en arrière de travail, et le nombre de clapet est garder la trace de combien de flips nous faisons. D'accord? Donc vous pouvez voir ce genre de choses est vraiment simple à câbler. D'accord? Et, vous savez, quand vous obtenez dans la construction même des applications complexes,

parce que vous allez toujours utiliser ces mêmes mécanismes d'action et de points cible et vous allez être en utilisant setters et getters pour garder les choses en synchronisation, ça va être facile pour les gens de comprendre comment votre code fonctionne. Ils savent où regarder pour voir où l'interface utilisateur mise à jour se produit,

etc. Je vais faire une autre chose ici. Prenez une minute et vous montrer NS connectez. D'accord. Je vous ai dit que vous pourriez vous connecter quelque chose dans la console. Alors, faisons chaque fois que cette chose changements, nous allons faire un journal NS. Donc, il est juste une fonction C.

Et vous lui donnez une chaîne de format comme printf. Donc, je vais dire le nombre de bascule est égale pour cent le nombre de V self.flip. D'accord? Donc, vous venez de mettre ce journal NS là-dedans, et maintenant quand nous courons vous allez le voir dans la console. Il va arriver quand je clique, et il va à-dire ce qui est arrivé ici.

Par ailleurs, bien sûr, je peux faire ce que plus large. Et revenir au simulateur. Voyons voir. D'accord. Donc, NS exploitation forestière - manière impressionnante de débogage. D'accord? Parfois, beaucoup plus facile que de fixer un point d'arrêt puis quand vous y arrivez à la recherche

les variables et d'autres choses. Elle imprime tout ce qui se passe et vous pouvez le regarder. Surtout dans l'interface utilisateur des choses sont parfois animées, ils se passe au fil du temps. Il est parfois difficile de mettre un point d'arrêt au milieu d'une animation pour voir ce qui se passe.

Mais si vous faites quelques bûches NS, vous pouvez genre de voir comment les choses progressent. D'accord. La dernière chose que je vais vous montrer ici comment d'ajouter une nouvelle classe à votre application parce que vous allez avoir besoin de le faire.

Vous allez ajouter quatre classes à cela. D'accord? Vous allez commencer avec ça, d'accord, et puis vous allez ajouter quatre classes - carte, pont, etc. Et la façon dont vous ajoutez une classe est vous - et en fait, la façon dont vous ajoutez un fichier à votre projet - est vous allez dans le menu Fichier, nouveau fichier.

D'accord? Et il y a tous les différents types des choses que vous pouvez ajouter ici, le fichier de base de données, fichiers de schéma et tout. Mais vous voulez que cette seule classe supérieur gauche Objective-C. D'accord? Ici, vous allez juste à taper le nom de la classe. Ainsi, par exemple, si je vais ajouter la carte

et le nom de la classe mère. D'accord. Si vous faites carte à jouer, vous pouvez taper la carte ici. Il ne doit pas être quelque chose qui est choisi dans cette liste, d'accord, qui sont ceux iOS. Donc ici, je vais faire la carte. Je pourrais mettre la carte ici.

Il est demandé où stocker cette. Je pourrais le mettre à droite dans le même lieu que mon contrôleur de jeu de cartes est, vous voyez? Mais je suis vraiment un grand fan de mettre votre modèle dans son propre répertoire. Donc, vous pouvez utiliser nouveau dossier ici.

Créons comme un répertoire de modèle, et qui crée un répertoire de modèle ici. Il y a un contrôleur, voici le répertoire du modèle. Et ainsi créer. Donc, cela va créer des cartes de points H et M. Voici la carte dot H et M, d'accord, versions sorte de blanc d'entre eux.

Vous pouvez basculer entre eux ici. Notez que si je passe la gauche, les bons changements pour correspondre. Tu vois? Changer cela, cela correspond. C'est parce que je l'ai choisi homologues ici. Si vous allez au manuel et choisissez ce fichier manuellement,

alors il ne sera pas fait que la magie plus. Mais vous pouvez toujours revenir à leurs homologues et il va les garder synchronisés. D'accord. Ainsi vous pouvez avoir - certaines personnes aiment leur dossier d'en-tête sur la gauche, certains à droite, peu importe. En outre, notez ici que ce serait bien

si je peux aussi regrouper ces choses dans le navigateur. Et je peux en leur choisi un clic droit sur un nouveau groupe. Dites modèle. Ici. Et maintenant, je l'ai mis mon modèle dans sa propre petite place ici. Je peux même déplacer ce autour, mettez-le ici, peu importe.

Je pourrais mettre tous mes quatre classes là-dedans. Il est possible de lier ce groupe au système de fichiers. En fait, si vous cliquez sur un fichier et mettre en place l'inspecteur à ce sujet ici, vous pouvez voir qu'il a obtenu cet endroit où vous pouvez spécifier si elle est un chemin absolu, ou pertinentes pour le groupe est dans, ou autre chose.

Ainsi, vous pouvez contrôler cela. Et c'est tout. Donc, je pense que ce tout ce que vous devez faire vos devoirs. Vous allez juste à taper dans tout votre code ici pour la carte et d'ajouter vos trois autres. Tapez tout ce code.

Et puis tout ce que vous avez à faire est de cette carte à la place de montrer as de trèfle tout le temps, a besoin de passer par le pont, d'accord? Il y a un devoir détaillé écrire jusqu'à posté. Il a toutes sortes de conseils et d'aide, et vous dit à ce que les tâches requises sont,

et les critères d'évaluation, et ce genre de choses. Donc certainement lu cette chose en détail, d'accord? Ne sautez pas de ce genre de choses et juste essayer d'aller directement à le faire. Et si vous avez des questions, je vais être ici. C'est tout. >> Pour en savoir plus, s'il vous plaît nous rendre visite à Stanford.edu.



Video Description

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