[Powered by Google Translate] [Séminaire] [iOS: Rédaction applications Like a Boss] [Tommy MacWilliam] [Université de Harvard] [C'est CS50.] [CS50.TV] D'accord, tout le monde, bienvenue à iOS: les applications écriture comme un patron. Ce séminaire va se concentrer sur l'écriture des applications pour l'iPhone et à son tour écrire des applications pour l'iPad, et nous sommes donc fondamentalement va marcher à travers un couple de différents exemples de la façon de faire une application, un jeu simple comme Tic Tac Toe, ou si vous êtes plus intéressé à faire un soft comme une sorte de lecteur de nouvelles ou quelque chose qui interagit avec l'Internet, je vais en parler aussi. Voici notre bref ordre du jour. Applications IOS sont écrits dans un langage appelé Objective-C, et donc c'est un peu similaire à C, mais pas vraiment du tout, donc nous allons parler un peu de la langue elle-même et puis comment créer des applications iPhone en utilisant ce programme soft appelé XCode, qui, si vous ne l'avez pas encore téléchargé, n'hésitez pas à commencer le téléchargement maintenant. C'est plusieurs giga-octets. Il devrait être disponible sur l'App Store, vous aurez donc besoin d'avoir un Mac idéalement utilisez la dernière version de Mac OS X. Si vous n'êtes pas, pas de problème. Nous avons Mac dans le centre de sciences à votre disposition avec XCode installé, et alors n'hésitez pas à utiliser ceux pour le développement. Si vous voulez faire une application mais vous n'avez pas un Mac, ne vous inquiétez pas. Il ya beaucoup de ressources du campus pour cela. Et alors, nous allons couvrir 2 exemples agrandie de différentes applications que vous pouvez faire. Objective-C est techniquement ce qu'on appelle un super ensemble de C. Cela signifie que tout code C est également valable code Objective-C. Cela signifie que nous avons un peu scotchée sur quelques fonctionnalités supplémentaires à C. Certaines de ces caractéristiques comprennent pas avoir à jamais écrire malloc encore, Dieu merci, sans avoir à vous soucier de ces pointeurs stupides et les libérer et tout ça vous avez détesté à propos de C, et c'est le genre de parti en Objective-C. Maintenant, Objective-C dispose également d'une bibliothèque standard beaucoup plus grande, il ya donc beaucoup plus de fonctionnalités que vous obtenez pour l'intérieur sans Objective-C. Rappelez-vous quand nous écrivions PHP nous avons remarqué que nous sommes passés de cette petite langue de la bibliothèque géante de toutes ces choses folles que vous pouvez faire. La même chose se passe dans iOS. Il ya des objets pour des choses comme le calendrier bouddhiste, et vraiment rien vous pouvez éventuellement penser existe probablement déjà dans la mise en œuvre Objective-C. La partie objective de l'Objective-C est quelque chose de référencement appelé Object-Oriented Programming. Il s'agit d'une sorte de nouveau concept, mais nous avons fait surtout appris beaucoup de ces concepts déjà. L'idée derrière la programmation orientée objet, c'est que vous allez structurer une grande partie de votre code autour de ces choses appelées classes, Ces classes sont vraiment glorifié structures. A l'intérieur d'une structure en gros nous avons dit ici, c'est une chose, et cette chose peut avoir des membres. Par exemple, un noeud dans une liste chaînée pourrait avoir d'autres choses comme une valeur, un pointeur vers le nœud suivant dans la liste, et en même temps que le pointeur et cette valeur a composé ce seul cas d'un struct. Les classes sont très similaires, sauf classes peuvent aussi avoir des fonctions à l'intérieur d'eux. Lorsque nous avons déclaré un struct, nous ne pouvions dire ou int n * nœud suivant. Maintenant, avec Objective-C, nous pouvons effectivement mis fonctions l'intérieur de ces choses. Une autre chose que les classes puissent faire, c'est qu'ils peuvent hériter d'autres classes de données. Par exemple, nous allons regarder un tas de haut-classes Objective-C. L'un d'eux pourrait être la classe qui représente le point de vue d'un écran, et ainsi de suite en disant que je veux mettre en oeuvre mon propre point de vue nous avons essentiellement dire quelqu'un chez Apple, les gens probablement très belles, a écrit cette classe pour moi, et il gère les choses comme l'affichage des boutons ou de rendre l'écran, et nous serions vraiment peinée de mettre en œuvre toutes les fonctionnalités que nous-mêmes, et ainsi de suite, simplement en héritant de données, on peut dire tout ce que vous avez fait dans cette classe Je tiens également à l'intérieur de ma classe, et puis je vais faire d'autres choses, à savoir la mise en œuvre d'une application. C'est ce que l'héritage mot signifie. Nous verrons un exemple plus concret. Et enfin, la clé avec la programmation orientée objet est que il conduit à l'encapsulation de données. Dans certains de nos problèmes établit que nous pourrions avoir ces grandes variables globales et globales partout, et c'est comme ça que nous avions garder la trace de l'Etat. Avec des classes, nous pouvons commencer à encapsuler l'information à l'intérieur d'un objet. Si nous avons un écran de notre application, nous n'avons pas vraiment besoin d'avoir des données de un autre écran dans notre intérieur de cette application, et ainsi en encapsulant les choses dans les classes ce qui conduit effectivement à la conception de code bien meilleur, et cela est possible avec certaines des fonctionnalités supplémentaires d'Objective-C. Avertissement, la syntaxe de l'Objective-C est la banane. Il est comme rien que nous avons vu auparavant, il est donc un peu d'une courbe d'apprentissage pour s'habituer à ce que le diable que cela signifie? Mais une fois que vous avez passé cette courbe d'apprentissage initiale, il est vraiment, vraiment bon pour commencer à écrire des applications. Pour déclarer une classe, dire ici, c'est ma classe, il existe, et peut-être voici quelques choses que je vais définir plus tard, Je vais dire @ interface. Je vais dire @ interface. Je vais vous donner ma classe un nom. Et puis, plus tard ailleurs je vais dire @ end, et tout le reste de l'interface et la fin @ @ va être ma classe. Cela va être ce qu'il ya dedans de nos fichiers. H. Tout comme dans nos fichiers. C h a dit essentiellement voici quelques choses qui existent. Je ne suis pas nécessairement vous dire ce qu'ils font encore, mais le compilateur a besoin de savoir qu'ils existent. Plus tard, à l'intérieur de notre. Fichiers m-m parce que pour Objective-C C'est là que nous allons en fait de définir ce que ces classes font. Tout comme nos fichiers c., Nous avons fourni une implémentation pour les fonctions. A l'intérieur de notre. M fichier que nous allons dire ici, c'est que toutes les fonctions à l'intérieur de ma classe-ce qu'ils font tous. Et enfin, à l'intérieur d'une structure, on pourrait dire à l'intérieur de ces accolades int, n ou le nœud suivant * et en Objective-C, nous allons utiliser le mot clé @ property, et c'est ce qui va définir les propriétés, ou les fonctions non-qui font partie de mes classes. Appel de fonctions en Objective-C est aussi la banane. Lorsque nous avons déclaré des fonctions en C nous dit quelque chose comme int foo et ouvert parenthèses, puis lui a donné une liste d'arguments. C'est ce que déclare méthodes ou fonctions ressemble en Objective-C. Si je veux déclarer une fonction ou d'une méthode où je dis que la méthode est vraiment juste une fonction qui est membre d'une classe, la gentillesse du interchangeables, mais pas vraiment, donc à l'intérieur de ma méthode, je veux créer une nouvelle méthode. Ça va rien renvoyer, donc ça va être de type void. C'est le type de retour de ma fonction. Maintenant, nous avons parens ici parce-que je ne sais pas. Prochaine va être le nom de ma fonction, et puis finalement nous avons un point-virgule comme nous avions en C. Ce qui est nouveau ici, c'est ce gars là. Ce trait d'union est réellement nécessaire, et ce que cela dit, c'est que cette méthode ici doit être appelée sur une instance d'une classe. Après, nous avons déclaré nos structs nous avons probablement dit quelque chose comme n nœuds struct, et qui a créé ou instancié un de ces structs pour que je puisse réellement commencer à travailler avec ce qui est à l'intérieur de celui-ci, si ce trait signifie que nous devons instancier la classe juste comme nous avons instancié que struct avant que nous puissions appeler cette méthode sur elle. Si je veux commencer à ajouter des arguments à mes méthodes il devient encore plus bananes. Voici mon nom de la méthode. Ensuite, je vais avoir un côlon, du côlon et après ce qu'il dit ici vient des arguments. Cette méthode prend un argument. Le type de son argument est un int, et le nom de cet argument ou la variable que je vais commencer à utiliser à l'intérieur de la méthode est appelée i. Encore une fois, c'est la méthode. Elle prend un argument. Si vous voulez commencer à ajouter plus d'arguments qu'il obtient plus de bananes dans ce que nous avons dit ici côlon qui vient à ma liste d'arguments. Ce premier argument est un nombre entier. Maintenant, ce deuxième argument est intéressant. La variable que je vais utiliser à l'intérieur de ma fonction est appelée f, donc à l'intérieur de ma fonction je pourrais dire f + = 1 ou quelque chose. Cette chose ici est une clé pour cet argument ou paramètre. Tout comme nous avons eu paires clé-valeur et quelque chose comme JSON ou tableaux associatifs Objective-C a pris la décision de dire, d'accord, juste pour que ce soit vraiment clair lorsque vous appelez une méthode que tous ces paramètres sont Je vais en fait pour tous les nommer. Lorsque vous appelez une méthode, vous allez vraiment vous dire andFloat, et puis vous passerez devant po Fait intéressant, celui-ci n'est pas nommé, mais tous les autres paramètres sont, si nous avions un 3ème argument que je pourrais dire andFloat et un autre flotteur et ainsi de suite. Quand j'appelle ces méthodes, il est de bananes cours, donc si j'ai un objet, et j'ai défini une méthode appelée foo, et je veux l'appeler, plutôt que de dire foo ouvert / parens proches Je vais ouvrir une parenthèse. Voici le nom de ma méthode. Je vais fermer la parenthèse, et c'est l'objet J'appelle ça de suite. Rappelez-vous, toutes ces méthodes existent au sein des classes parce que les classes peuvent avoir des méthodes définies à l'intérieur d'eux. Ici, j'ai arbitrairement créé un objet d'une classe, et c'est la syntaxe pour faire cela. Il ya 2 étapes à la création d'un objet. La première étape consiste à dire que je veux allouer de l'espace. C'est l'équivalent d'un malloc. Nous n'avons pas besoin de dire plus malloc. Nous avons abandonné la m, a alloc, et a remplacé le c. Avec. M. Après avoir quelque chose de alloc puis nous nous devez l'initialiser. Fondamentalement, lorsque vous créez des objets que vous voudrez peut-être avoir une certaine logique qui s'exécute lorsque ils ont été créés, de sorte que vous pouvez passer des valeurs par défaut ou quelque chose comme ça, et si cette méthode init est ce qui crée en fait l'objet. Nous avons d'abord allouer de l'espace, tout comme nous l'avons fait en C, et puis nous l'initialiser, ce qui peut ou ne peut pas faire grand-chose. Puis nous revenons cette chose dans un objet o. Il est une star ici parce que cela est techniquement un pointeur, mais ne vous inquiétez pas, les pointeurs ne sont pas un gros problème en Objective-C plus. Maintenant, nous avons instancié cette classe NSObject appelé, et c'est juste une classe aléatoire que Apple a. Nous avons instancié cela, et maintenant j'ai une instance de cette classe o dans ce but, ce qui signifie que si je définis ces méthodes que je pouvais les appeler comme ça. De même, si je voulais appeler une méthode avec un argument, c'est donc la méthode bar, qui prend un argument, et voici le baz: Méthode qux, donc cela prend 2 arguments. Cette appelle une fonction sur cette objet o. Donner un sens? La syntaxe doit avoir du sens, mais vous sorte de s'habituer à elle. Ok, nous allons parler de quelques choses qui sont intégrées dans Objective-C qui ne sont pas nécessairement intégrés dans C. En C, nous sorte de dû faire face à des chaînes comme ces tableaux de caractères stupides, et il a vraiment ennuyeux. Objective-C a ceux qui les construit en pour nous, et il est construit en en utilisant cette classe NSString appelée. Quand je veux créer un NSString nous avons syntaxe plus mystérieux. Plutôt que de dire "CS50" nous disons @ "CS50" et ce n'est que la syntaxe de déclaration des chaînes en Objective-C. Cela est extrêmement facile d'oublier, il ne faut pas. Maintenant, une fois que j'ai ça, c'est une chaîne, mais notez c'est vraiment juste un objet. J'ai dit NSString, ce qui signifie que je instancié la classe NSString appelée, que quelqu'un d'autre a écrit pour moi, et ils étaient très gentils, et maintenant Je peux commencer à appeler des méthodes sur elle. Si j'appelle la longueur de cette méthode a pour objet ça va me revenir la longueur de la chaîne. C'est exactement comme strlen en C. Ce serait revenir 4. De même, une autre méthode je pourrais avoir besoin de se soucier de ce characterAtIndex. Il s'agit d'une méthode qui est dit sur cette chaîne s Je veux que vous pour obtenir le personnage 0e, et donc ce serait revenir à moi le caractère c, et il ya tout un tas de plusieurs de ces méthodes que vous pouvez très facilement sur Google. La documentation d'Apple est grand, et nous allons jeter un coup d'oeil à cela dans un peu. Ce sont des chaînes de caractères. Nous avons également des tableaux de taille variable construit po Rappelez-vous dans C quand nous avons déclaré un tableau nous avions à dire, vous avez 5 éléments, à la fin de l'histoire. Quand nous sommes arrivés à JavaScript et PHP nous pourrions commencer faire des choses comme l'ajout d'éléments ou éléments mobiles. Nous pouvons faire la même chose en Objective-C. Plutôt que de créer un tableau de la façon normale C nous avons encore une autre classe appelée NSMutableArray. Il ya aussi NSArray, et cela va essentiellement encapsuler une matrice. Ceci dit, la première chose que je veux faire est que je veux consacrer l'espace pour une nouvelle baie, et après je l'ai allouer J'ai alors besoin de l'initialiser. Encore une fois, l'appel de ces 2 méthodes. Maintenant, cela signifie que l'intérieur de cet objet une J'ai un tableau vide assis là. Si je veux ajouter quelque chose à ce tableau, je peux appeler la méthode addObject. Je veux ajouter un objet à un tableau, et je veux ajouter la chaîne CS50. Si je voulais retirer l'inverse que je peux dire que je tiens à retirer l'objet à la première place sur le tableau ou l'objet a. Donner un sens? Ok, vous sorte de s'habituer à cette chose crochet. Soit dit en passant, à l'intérieur d'un grand nombre de bibliothèques d'Apple, vous verrez ce NS. La Nouvelle-Écosse se fait pour l'étape suivante, qui est l'une des sociétés Steve premiers emplois, et c'est là qu'il a vraiment commencé à écrire beaucoup de code comme une sorte de base de Mac OS X et tous les autres trucs, et si ce NS est une sorte de cet héritage bien crier à l'une des sociétés antérieures l'époque où Apple a été débutez. Elle est partout. Jetons un coup d'oeil à une approche holistique Objective-C de plus par exemple. Ici, je suis à l'intérieur de XCode. Pour arriver ici, j'ai téléchargé XCode sur l'App Store, ai ouvert, et puis je suis ici pour le fichier, ici à nouveau projet, puis. Après je fais ce que j'ai toutes ces options de ce que je veux créer, et nous allons donc jeter un oeil à ces options plus tard, mais juste pour cet exemple, parce que nous ne sommes pas vraiment allez avoir une application encore, Je suis venu ici-bas, et j'ai dit outil de ligne de commande, et c'est un soft que je pouvais courir à la ligne de commande tout comme nous avons mis en place à partir de C. C'est comme ça que j'ai créé ce projet, et maintenant je suis ici, Examinons donc d'abord à ce fichier, et cela devrait ressembler assez familier. J'ai un nom int. Il est mon ami argc, argv mon autre copain. Et ainsi, nous pouvons voir que c'est le point d'entrée pour mon premier Objectif-C. Ici, nous pouvons ignorer cela pour l'instant. Il s'agit essentiellement des trucs gestion de la mémoire que vous n'aurez pas vraiment jamais avoir à s'inquiéter. Regardons ce premier bloc ici. Cette première ligne, si je dis Étudiant * alice = [alloc élèves [] init] ce que ça fait? Ce premier étudiant ici, c'est probablement une classe. Ce n'est pas une classe que Apple a écrit, mais c'est une classe que j'ai écrit. La première chose que je veux faire est que je veux allouer de l'espace pour un nouvel élève, et puis je veux l'initialiser, donc cela me redonne cet objet nouvel étudiant, et je suis stocker cela dans une variable appelée Alice. D'où vient cette classe vient-il? Eh bien, là-bas sur le côté gauche ce sont tous des fichiers différents à l'intérieur de mon projet. Nous pouvons voir ici j'ai un Student.h et un Student.m. Le fichier. H, rappelez-vous, c'est là que je déclare toutes les choses qui existent au sein de la classe. Jetons un coup d'oeil. Très bien, nous avons ici cette interface @, ce qui indique que voici les déclarations de tout ce qui existe au sein de ma classe. Puis-je avoir un côlon. Puis-je avoir cette chose NSObject. Cet côlon signifie que bit d'héritage que nous discutions un peu plus tôt. Ceci dit tout d'un NSObject peut faire où est cette classe NSObject écrit par quelqu'un d'autre, tout ce NSObject peut que je veux être en mesure de le faire. En disant: NSObject qui signifie que j'ai pratiquement hérité de toutes les fonctionnalités d'une autre classe. Cela m'a vraiment donné tout un tas de différentes méthodes et propriétés que je peux utiliser. Ici-bas, je crée 2 propriétés. Cela signifie que mon élève, s'il s'agissait d'un struct, ce serait les 2 choses à l'intérieur de ma structure, de sorte que chaque élève a un nom qui est une chaîne, et un étudiant dispose également d'un grade, qui est un int. Enfin, ici-bas, je vais créer une méthode pour mon élève. J'ai appelé ma méthode, initWithName, et il prend un argument, et que l'argument est une chaîne, et j'ai appelé le nommer. Maintenant, nous allons voir comment nous pouvons effectivement mis en œuvre cette classe. Ici, maintenant, je suis à l'intérieur de mon fichier. M, m pour la mise en œuvre, je suppose. J'ai mon œuvre, ma fin, et c'est là que je suis en train de définir ce initWithName fait. J'ai initWithName, le nom de mon paramètre, puis ce C'est là que je suis en train de créer un étudiant, et donc c'est un peu cryptique, mais c'est une sorte de passe-partout que vous souhaitez inclure dans vos constructeurs. Cette fonction d'initialisation ici, initWithName, est un type de constructeur. Vous êtes essentiellement la construction d'un objet nouvel étudiant et peut-être d'envoyer des données à l'intérieur de celui-ci. La première chose que je veux faire, c'est que je veux appeler init sur ce truc super. Rappelez-vous que quand j'ai dit de retour ici dans le fichier. H que tout un NSObject a un étudiant a par ailleurs. Cela signifie que lorsque je crée un étudiant que j'ai aussi besoin de faire est assurez-vous que le NSObject que je hériter de toutes ces données à partir de est également initialisée correctement. Ce que je dois dire, c'est ce qui se passe réellement superbe pour faire référence à la classe parente que je suis hériter de, donc je veux m'assurer que je initialiser tout ce que je suis en fonction avant de commencer à essayer de l'utiliser. Ensuite, si ce initialisé correctement c'est juste envie de dire si malloc ne pas retourner NULL, alors je peux commencer à mettre certaines propriétés. En JavaScript et PHP nous avions ce mot-clé appelé ce, et cette référence à l'instance actuelle d'une classe. En Objective-C, nous appelons cette auto. Quand je dis self.name, cela signifie que l'objet Je viens de créer quand j'ai dit alloc étudiant init, qui va me rendre un objet. Cela signifie que je veux pour définir le nom de cet objet à tout ce que je viens de passé po Tout comme dans C, nous avons accès à des membres de ce point, si self.name dit le nom de l'objet étudiant va maintenant être tout ce que vous venez de passer po Et si finalement, je peux le retourner si je réellement obtenir quelque chose en retour. Des questions? Ok, donc cette auto = super init, si vous n'avez pas tout à fait comprendre les choses héritage ne vous inquiétez pas. Il suffit de savoir que si jamais vous voulez faire votre propre méthode d'initialisation juste le faire, et vous serez prêt à partir. Ouais. >> [Étudiants] Que signifie l'auto si? Cela signifie que lorsque malloc nous quelque chose que nous toujours vérifié si elle était égale à null, et si elle était nulle, puis nous sommes sortis. C'est la même chose, parce que si cela retourne null, alors nous allons probablement faute seg si on commence à essayer de la manipuler. C'est notre classe étudiant. Cela signifie que nous pouvons initialiser nos étudiants dans l'une des deux façons. Si je dis alloc init a étudiante je n'utilise pas cette méthode que je viens d'écrire, et à la place je peux simplement dire alice.name, et maintenant je vais mettre ce nom de propriété. De même, si je veux utiliser cette méthode initWithName Je peux simplement dire alloc, puis plutôt que de dire d'initialisation Je vais appeler cette méthode que je viens de créer, et je vais passer à Bob. À ce stade, ce Bob objet a un nom égal à Bob. Bon, ici j'utilise ce NSMutableArray que nous avons vu précédemment. Je suis allocation space.Then je l'initialisation d'un nouveau tableau. Je vais ajouter 2 choses à elle. Ce tableau contient maintenant des objets d'études. Notez que nulle part ai-je dû dire que c'est un tableau d'étudiants. Je l'ai dit, c'est un tableau, période. Alors je peux mettre ce que l'intérieur de ce que je veux. Ici, j'ai 2 objets. Enfin, j'ai un autre objet, ici, cette TF. Ici dans TF.h fondamentalement la même chose. Je suis héritant de NSObject, et par la manière, lorsque vous créez des classes tout cela est fait pour vous, ce genre de passe-partout interface. Il possède une propriété d'étudiants. J'ai un couple d'ici méthodes qui ne sont pas vraiment faire grand-chose, et donc ça veut dire après avoir créé cet objet TF Je peux appeler cette méthode sur l'année comme ça. Toute question relative à la syntaxe Objective-C avant de commencer le déplacement en un peu plus intéressant le développement des trucs applications? Ok, nous allons donc fait faire une application iPhone. Les classes de base que vous allez utiliser à l'intérieur de votre application iPhone sont appelés contrôleurs de vue, et un contrôleur de vue représente essentiellement un seul écran à l'intérieur de votre application, donc si je suis sur l'app musique, par exemple, un contrôleur de vue pourrait représenter le point de vue où je afficher toutes les chansons sur mon iPhone. Un autre contrôleur de vue pourrait être quand je clique sur une chanson et de commencer à jouer ou comme je le forage vers le bas dans les artistes. Chacun de ces écrans différents peuvent être représentés en tant que contrôleur de vue différent, et un contrôleur de vue est vraiment juste une classe qui explique comment fonctionne cet écran. Choses à l'intérieur d'un contrôleur de vue, nous allons avoir des propriétés, tant de choses comme un bouton va être une propriété de notre contrôleur de vue. Nous allons aussi avoir des méthodes, et ce sont essentiellement des gestionnaires d'événements. Cette méthode indique lorsque vous appuyez sur ce bouton Je veux faire quelque chose, et enfin, à nouveau, nous allons utiliser ce mot-clé auto pour accéder à l'instance actuelle. Pour construire des interfaces dans iOS est en fait vraiment, vraiment facile. Ils ont cette traînée agréable et drop interface appelée Interface Builder, et les 2 concepts de base que le fil de votre Objective-C à Interface Builder sont IBOutlet et IBAction. Un IBOutlet dit simplement que si vous déclarez une propriété qui est un bouton, et que vous voulez le brancher à quelque chose dans votre interface réelle, vous allez dire que c'est une prise de courant. De même, si vous voulez représenter un gestionnaire d'événements alors vous allez dire que c'est une action. Pour câbler réellement cette représentation graphique et votre code, il est vraiment, vraiment simple. Si vous souhaitez joindre un IBOutlet, tout ce que vous avez à faire est de contrôler clic, et nous allons voir un exemple de ce très rapide. Vous contrôlez cliquez là où il est dit View Controller. Vous allez glisser dans l'interface, ou inversement, si vous voulez brancher un gestionnaire d'événements que vous allez glisser à partir de l'interface dans l'autre sens. Jetons un coup d'oeil à un exemple très simple iOS. Nous allons créer un nouveau projet. Je vais venir ici à la demande, et je vais cliquez sur Application Vue simple. Je vais cliquer sur suivant. Je vais vous donner mon projet un nom. Je vais l'appeler Bonjour. Fait intéressant, Apple n'assume vous créez un produit de sorte que vous pouvez le vendre et ils peuvent gagner de l'argent. Ici-bas, je vais dire que c'est une application iPhone. Vous pouvez créer une application iPad, ou si vous souhaitez en créer un de ces applications qui prend en charge les périphériques que vous pouvez faire cela aussi. Ce sont ce que vous voulez que vos coches ressembler. Vous souhaitez utiliser des storyboards, que nous verrons plus tard, et vous voulez absolument utiliser le comptage automatique de la référence, qui est une fonctionnalité intéressante qui vous évite d'avoir à dire malloc et free. Sauf si vous voulez appeler malloc et free, je quitterais ce cochée. Je vais cliquer sur suivant, et enfin, cela va me demander où je veux l'enregistrer. Je vais frapper créer, et c'est parti. J'ai créé un nouveau projet. Ici à gauche sont tous les fichiers qui sont à l'intérieur de mon projet, et remarquez que j'ai eu tout un tas, et je n'ai même pas faire quoi que ce soit. IOS est grande. Par exemple, voici ce ViewController.h, cela va représenter mon contrôleur première vue, de sorte que le premier écran à l'intérieur de mon application. Maintenant, nous savons ce que cela veut dire. Nous disons que j'appelle cette ViewController classe, et un ViewController fait tout ce que fait un UIViewController, et ce, encore une fois, c'est une classe qui a écrit d'Apple qui fait beaucoup de choses à portée de main pour nous telles que l'affichage de l'écran. C'est là où je peux réellement commencer à définir ce que mon contrôleur de vue le fait, et il s'avère que je n'ai vraiment pas besoin de tout cela. Ceci est du code passe-partout que Apple me donne gratuitement. J'ai besoin de cette première ligne, ou je n'ai pas une classe, de sorte que nous pouvons nous débarrasser de cela et se débarrasser de ce. Bon, c'est mon écran vide. Maintenant, nous allons cliquer sur ce MainStoryboard.storyboard, et c'est là que ça commence à devenir intéressant. Ceci représente le premier écran sur mon application. Si je veux ajouter un bouton, en HTML, j'ai dû créer une balise button. Dans Android, vous devez créer une balise button, mais dans iOS si je viens ici en bas à droite et si je clique sur ce 3ème est ici où il est dit Objets, et je peux faire défiler vers le bas, ou je peux commencer à chercher bouton. Et regardez, un bouton, donc si je fait glisser et déposer ce droit là-bas, Je viens d'ajouter un bouton à l'écran sur mon application. Si je veux changer le texte, je ne peux double-cliquez dessus, dire quelque chose comme incitant «Moi Appuyez sur." Bon, maintenant, si je lance cette application, nous avons donc compiler, afin de l'exécuter je clique sur le bouton de lecture dans le coin supérieur gauche, et il ya mon application. Je n'ai rien fait, et j'ai eu une application iPhone douce à la recherche. Si je veux l'arrêter, vous pouvez cliquer sur le bouton d'arrêt parce que c'est plus amusant. Disons que je veux vraiment quelque chose se passe lorsque j'appuie sur ce bouton. Pour ce faire, ce que je dois faire, c'est que je dois créer un nouveau gestionnaire d'événement ou d'une action. Cela signifie que j'ai besoin de créer une méthode que je veux être appelé lorsque j'appuie sur le bouton, nous allons donc créer une nouvelle méthode. Je suis à l'intérieur de ViewController.h. Je dois dire qu'il existe une méthode. J'ai besoin d'un trait d'union abord parce que je vais être appelé cette vue sur le contrôleur. J'ai besoin de donner ce type. Le type de ce qui se passe à cette chose IBAction que nous avons vu précédemment. Il s'agit d'un gestionnaire d'événements, de sorte qu'il va y retourner un IBAction, et c'est une indication pour XCode pour dire que c'est quelque chose que je veux quelque chose à câbler. Je peux lui donner un nom, comme buttonPressed, point-virgule. Maintenant, j'ai déclaré une méthode nouvelle à l'intérieur de ma classe. Je l'ai dit cette méthode doit exister. Maintenant, nous allons entrer en ViewController.m, et disons ce que cette méthode peut faire. Si je commence à taper, par exemple, (void) buttonPressed préavis XCode est vraiment sympa et autocompletes pour moi. C'est vraiment merveilleux. Notez ici que l'intérieur du fichier. M Je peux aussi dire nulle, et c'est parce que IBAction n'est pas réellement un type. Il s'agit en fait hashtag défini quelque part pour être un vide, et encore une fois, c'est juste une indication pour XCode qui dit Je veux que ce soit un gestionnaire d'événements, et nous verrons pourquoi dans un instant. Lorsque ce bouton est pressé, je vais faire quelque chose de gênant comme afficher un popup. Pour ce faire, je peux créer une nouvelle instance de cette classe appelée UIAlertView, et c'est une classe qui a écrit d'Apple qui va afficher les popups ennuyants. Nous appellerons cette alerte pop-up, et j'ai 2 étapes, rappelez-vous, à la création de cet objet. La première chose que je dois faire est d'allouer l'espace. Je veux un UIAlertView. Je tiens à allouer de l'espace. C'est ma première méthode. Ma méthode suivante est que je veux pour l'initialiser, et je n'ai donc ce gros méthode longtemps appelé initWithTitle. C'est essentiellement ce qui va contrôler ce popup dit. Le titre de mon popup peut être bonjour. Le message de cette même fenêtre peut être "C'est iOS." Délégué chose, je ne sais pas ce que c'est. Disons que ce n'est rien. Maintenant, le bouton qui va apparaître pouvez dire quelque chose comme «C'est sûr», et je ne veux pas vraiment les autres boutons, nous allons donc supprimer cela et fermer la parenthèse. Bon, j'ai créé un supplémentaire. Nous y voilà. C'est comment je peux créer une nouvelle fenêtre,. Si je veux vraiment montrer la popup je veux appeler la méthode show. Pour ce faire, je peux dire d'alerte et de montrer, et encore une fois, saisie semi-automatique était super gentil. Si j'ai oublié ce que c'était, si je viens de tapé dans s, Je peux faire défiler ici pour comprendre de quoi il s'agissait, et il filtre bien. Maintenant, j'ai créé cette nouvelle fenêtre,. Nous allons revenir sur ce que signifie délégué tard, et maintenant, je veux dire que je veux que cette méthode soit tiré lorsque j'appuie sur le bouton, je vais revenir à mon storyboard, et je veux maintenant joindre ce IBAction. La première chose que vous voulez faire est de cliquer sur le bouton. Lorsque j'appuie sur ce bouton je veux quelque chose se produise. Je ne vais pas maintenez la touche Ctrl. Je vais cliquer et faire glisser à partir du bouton d'ici où il est dit View Controller. Nous pouvons voir qu'il éclaire bien en place. Si je laisse aller avec ma souris j'ai maintenant cette même fenêtre, là-bas où j'ai quelques options. L'une d'elles est les événements que je peux enregistrer. Ce sont toutes ces méthodes que j'ai déclaré dans mon dossier que IBActions h. C'est ainsi que XCode sait ce qui doit apparaître dans cette petite liste, donc c'est juste un soupçon. Si je clique sur le bouton pressé, j'ai maintenant enregistré le gestionnaire d'événements. En JavaScript, nous avons dû dire que j'ai un peu de code qui a enregistré le gestionnaire d'événements. En Objective-C, il est vraiment facile. Si je lance ce nouveau maintenant, quand j'appuie sur le bouton mon gestionnaire d'événements va tirer, et je vais obtenir cette fenêtre. Super, super simple là-bas. Si jamais vous voulez voir tous les événements qui se produisent à l'enregistrement sur un composant si je clique sur ce bouton et je viens ici pour le côté droit première fois que vous pouvez voir ici que je peux faire des choses comme le type du bouton, donc si vous voulez un de ceux de I ou sur le bouton Ajouter un contact ou autre chose. Si je veux voir tous les événements qui sont sur ce bouton si je fait tout ce chemin là-bas sur le côté droit nous pouvons voir ici les événements que j'ai tous ces différents événements. Je peux appuyer sur le bouton, quand je lâche le bouton, lorsque je double robinet ou que ce soit, et celle que je viens de m'inscrire cet événement est appelé Touch Up Inside, et cela explique que dès que mon doigt se détache sur le bouton cet événement se passe au feu, et c'est exactement ce qui s'est passé. C'est le genre de l'événement par défaut du bouton pressé. Toutes les questions jusqu'ici? Bon, c'est comme ça que nous pouvons commencer à câbler les choses dans notre code dans les choses à l'intérieur de notre interface. Rappelez-vous la première chose que nous avions à faire était de trouver le code, puis on câblé jusqu'à l'interface avec le code, et il ya notre première application. Ok, c'était vraiment cool, et nous avons créé ce bouton. Que faire si nous ne voulons pas avoir à créer un groupe de propriétés représentant ces boutons? Par exemple, dans Tic Tac Toe j'ai 9 boutons, et ce serait super, super-ennuyeux d'avoir à faire glisser et déposer 9 fois ou si je devais faire Tic Tac Toe avec 81 au lieu de 9 et j'ai dû glisser et déposer 81 fois, et c'est boiteux. Ce que nous pouvons faire, c'est un peu comme une page HTML quand nous avons eu des choses comme ID et les noms et nous pouvons chercher des choses par leur ID, il ya une notion similaire dans iOS appelées balises. Un tag est simplement un identifiant numérique unique pour un composant. Si je dis cela a un tag de 0, par exemple, si je crée un bouton et lui donner une étiquette de 0, et nous verrons comment faire cela en seulement une seconde, si je veux obtenir ce bouton je peux simplement dire que je veux appeler l', viewWithTag méthode sur l'objet ici l'self.vue, qui représente l'écran en cours, par exemple. Si j'appelle cette méthode viewWithTag, je vais retirer le bouton avec l'étiquette 0. Jetons un coup d'oeil à ce bâtiment par Tic Tac Toe. Tout d'abord, c'est mon storyboard. J'ai créé ces 10 boutons d'interface utilisateur. Notez qu'ils sont tous de la même taille. Si je clique sur l'un de ceux-ci et je reviens ici sur ce côté droit vous verrez que je réglé la police ici, alors j'ai fait la police un peu plus grand, mais ce que j'ai fait aussi étais-je mettre cette balise. J'ai dit que cela a une balise de 1, ce qui est en haut à gauche. Maintenant, si je clique sur un autre bouton, comme celui-ci seconde ici, maintenant, vous verrez que mon tag est 2. Chacun de ces boutons est juste une étiquette unique, et si ce n'est plus tard comment je vais commencer à interagir avec mon application. C'est tout à l'intérieur d'un contrôleur de vue, mais voici ce que nous avons. Nous avons 3 propriétés ici. La première et la dernière vont représenter l'état de mon bord. Fondamentalement, ce premier est un tableau représentant où le X et S sont. Cet autre nous dit ici dont c'est le tour. Vous remarquerez que j'ai aussi ces choses ici. Avant, quand nous avons déclaré propriétés nous leur avons donné un nom et un type. On peut aussi leur donner quelques informations supplémentaires ici. Ce premier dit non atomique, et ce que cela dit est essentiellement une seule chose ne sera jamais essayer d'accéder à cette variable à la fois. Vous pourriez faire des applications plus complexes qui sont multi-thread, et ainsi de retour dans Scratch nous avons eu des threads différents, et les sprites différents pourraient faire des choses différentes en même temps. Si ce n'est pas le cas, ce qui n'est pas quelque chose que nous allons examiner, si nous disons non atomique il va vraiment rendre les choses un peu plus vite. Nous avons également cette chose appelée assign, forte ou faible. Cette attribuer dit juste que c'est un type standard. Ce n'est pas un objet ou un pointeur parce que c'est juste un bool, si bool est intégré à l'Objective-C. Ceci dit ne pas essayer de faire quelque chose de compliqué avec des pointeurs ici. Il s'agit d'une mise à l'échelle régulier vieux. Forts et les faibles, cette faiblesse dit que fait Je veux que ce soit en montrant quelque chose dans le contrôleur de vue. Je ne vais pas réellement affecter ou init a moi-même. Le constructeur d'interface, quand je lance l'application, va gérer tout ce que l'initialisation. Si je dis faible, qui dit que quelqu'un d'autre va être la création de ce. Si je dis forte, cela dit que je vais être le seul qui est la création de cet objet conseil d'administration, et si j'ai ici quelques méthodes plus ici, par exemple, une action lorsque le bouton est pressé nouveau jeu, une action lorsque l'une des autres touches sont pressées, et cetera. Nous n'allons pas entrer dans trop de la logique de Tic Tac Toe, même si c'est très excitant, mais nous allons jeter un coup d'oeil à quelques-unes des choses que nous pouvons faire à l'intérieur de l'iOS. Cette méthode nouveau jeu va être tiré chaque fois que j'appuie sur le bouton nouvelle partie. Pour accrocher jusqu'à ce que j'ai tout simplement venir à mon storyboard. J'ai cliqué sur le jeu de nouveau. Si je viens ici vers la droite je vois que Touch Up Inside est câblé à la méthode NewGame. C'est pourquoi ce qui se passe à faire virer. La méthode NewGame va faire un peu de mise en place. Il va dire que je veux que vous pour effacer l'état de la carte. Il s'agit d'une bonne méthode de mutables tableaux. Cela va dire que c'est maintenant au tour de X, et maintenant je vais profiter de cette chose viewWithTag. Je sais que mes boutons ont des étiquettes 1-9, et c'est quelque chose que je arbitrairement choisi. Si je veux mettre le texte de chaque bouton pour être vide parce que je viens de commencer un nouveau jeu et je ne veux pas Xs ou Os pour être laissé sur ce que je peux faire. Je peux dire que je veux la vue avec la balise, 1, 2, 3, 4, et cetera. Cela tirera une touche différente à chaque fois. Ici, je vais le jeter aux UIButton. Tout comme nous avons pu jeter ints à des flotteurs et vice-versa cela dit que je veux lancer ce à un UIButton. Cela signifie que le type de ce sera un * UIButton en raison des pointeurs, mais ne vous inquiétez pas, ils ne sont pas plus effrayant. Une fois que j'ai ce bouton, je vais appeler une méthode sur elle. Cette méthode est appelée setTitle pourState, et si cela en dit Je veux mettre le texte du bouton pour être la chaîne vide, et je veux que ce soit la chaîne vide quand il n'est pas pressé. Si j'utilise cette méthode, je peux changer le texte du bouton dès que quelqu'un le frappe, mais nous voulons dire lorsque le bouton est juste assis là Je veux que le texte soit vide. Enfin, nous allons initialiser mon conseil, et je vais dire que tout est actuellement à 0, si les membres du conseil de cette immuable est un tableau modifiable, ce qui signifie que je peux appeler la méthode addObject et juste un intérieur 0 de celui-ci. C'est ce qui arrive lorsque je crée une nouvelle partie. Jetons un coup d'oeil à un autre. Cette méthode ici est le IBAction qui va être pressé chaque fois que l'un de ces carrés est pressée. Maintenant, nous avons une certaine logique Tic Tac Toe ici. Nous trouver dont c'est le tour, et sur cette base nous soit mis un X ou un O, mais nous remarquons que nous sommes réutiliser ce même gestionnaire d'événements pour chacun de ces boutons. Cela signifie que je n'ai pas une méthode pour le bouton en haut à gauche, une méthode différente pour le bouton en bas à droite, même si je pouvais avoir fait cela. Cela ne serait pas vraiment une bonne conception. Qu'est-ce que je fais ici, c'est que je vais en fait de déterminer ce que l'étiquette de la touche qui a été pressée est. Vous remarquerez que cette méthode de lecture prend un argument. C'est ce qu'on appelle l'expéditeur, et ce qui est l'expéditeur est l'expéditeur va représentent exactement ce qui a été pris des mesures sur. Si j'appuie sur un bouton, cet expéditeur sera que UIButton que j'ai vraiment pressé, ce qui signifie que cette UIButton porte une étiquette parce que je créé un raccourci. Si je veux obtenir à la balise Je peux simplement dire Je veux l'étiquette de l'expéditeur, et encore une fois, je viens de coulée à un UIButton. Je sais que l'expéditeur sera un UIButton. Il n'est pas toujours besoin d'être un UIButton. Je pourrais, par exemple, inscrire le gestionnaire d'événement  pour une pour une touche, une pour un curseur. Dans ce cas, je sais qu'ils sont tous les boutons, donc je vais dire Je veux que ce soit un bouton, et puis je peux obtenir le tag, et à partir de la balise Je sais maintenant où je suis à l'intérieur de la carte. Ensuite, je peux simplement mettre X ou O, peuvent retourner la tour, vérifier qui a gagné, et cetera. Toute question concernant cette mesure? Ok, tout le code, nous avons affiché en ligne, nous ne voulons pas entrer dans trop de de la logique de Tic Tac Toe, mais maintenant vous pouvez constater que tout ce que nous faisons, c'est que nous sommes une boucle sur ce tableau, Nous avons donc un couple de boucles pour ici, et nous ne faisons que comparer à voir avons-nous un match dans toutes les lignes, un match dans une colonne ou quelque chose comme ça. Pour réellement exécuter cette application, si je tape sur un de ces boutons que méthode de lecture a été congédié, ce qui signifie que je viens de mettre le bouton pour être un X, alors maintenant ce bouton sera un O, et ainsi de suite, et c'est comme ça que nous commençons à interagir avec cette application seule page. Nous allons afficher le code, alors n'hésitez pas à prendre connaissance de ce que, mais nous allons maintenant parler de certaines applications qui ne sont plus d'une page. Aussi excitant que Tic Tac Toe est, beaucoup d'applications à l'intérieur de l'iOS sont des sortes de ces drill down choses avec plusieurs écrans. Le premier concept que nous aurons besoin de parler sont des protocoles, et un protocole est tout simplement un ensemble de méthodes que vous pouvez promettre à définir. Si je crée ce nouveau protocole avec 2 méthodes, cette première, si le type de retour est void, je l'ai appelé foo. Il ne prend aucun argument. J'ai une autre méthode. Elle retourne un int. Je l'ai appelé barrer, et il prend un argument. Tout ce protocole est que l'on appelle SomeProtocol ici, C'est un ensemble de choses que quelqu'un peut mettre en œuvre. Je n'ai pas à l'intérieur de ce protocole dit ce truc fait. Au lieu de cela, je dis juste que vous pouvez définir foo si vous voulez. Si je crée un contrôleur de vue ou la création d'une classe Je peux l'intérieur de cette promesse classe pour implémenter certaines de ces méthodes, ainsi par exemple, si par exemple cela dit maintenant je fais une promesse que l'intérieur de cette classe contrôleur de vue je vais avoir des définitions pour les deux foo et bar. Pourquoi est-ce utile? Un grand nombre de composants à l'intérieur de l'iOS profiter de cette modèle de conception appelé délégation, et ce que dit la délégation c'est que, par exemple, si j'ai une zone de texte et il ya des événements qui pourraient être inscrits à l'intérieur de ma zone de texte, plutôt que de créer des événements séparés ce que je peux faire, c'est que je peux dire le délégué de cette zone de texte sera un objet. Quand je dis que c'est un délégué présent, cela signifie que chaque fois qu'un événement aurait été renvoyé dans la zone de texte plutôt que d'avoir à l'enregistrer ou quelque chose comme ça il va tout simplement d'appeler une méthode sur le délégué. Par exemple, à l'intérieur de ma zone de texte j'ai une méthode pour quand j'appuie sur que fait le bouton en bas à droite, et ainsi de suite plutôt que d'enregistrer ce gestionnaire d'événement que je peux dire est zone de texte, voici un objet que je veux que vous appelez une méthode sur quelqu'un appuie sur le bouton à chaque fois fait, et cela signifie que cet objet doit mettre en œuvre un protocole qui dit que je promets de définir cette action du bouton fait, parce que si elle ne définit pas cette méthode et que vous appuyez sur Terminé, alors il va y avoir confusion. Jetons un coup d'oeil à un exemple. Ici, je n'ai tout simplement une zone de texte, et l'une des propriétés de cette zone de texte plus ici sur ce côté droit est le délégué. Il s'agit d'une propriété de la classe. Ce que j'ai fait ici, c'est que je contrôler cliqué, et j'ai traîné de cet endroit par ici le contrôleur de vue, et que dit maintenant le délégué de cette zone de texte va être le contrôleur de vue. Cela signifie que lorsque certaines actions se produisent, plutôt que d'enregistrer les gestionnaires d'événements distincts je veux que vous les envoyer au délégué. Maintenant, nous allons jeter un oeil à mon contrôleur de vue. A l'intérieur du fichier. H J'ai fait une promesse. J'ai promis de mettre en œuvre certaines méthodes à l'intérieur de ce protocole appelé UITextFieldDelegate, et encore une fois, c'est juste une liste de certaines choses que je peux choisir de mettre en œuvre. Si je viens ici, dans mon. M dossier, j'ai mis en œuvre un tel procédé. Je l'ai appelé textFieldShouldReturn parce que c'est ce qu'il a été appelé à l'intérieur du protocole. Et maintenant, chaque fois que j'appuie sur le bouton de l'intérieur fait de ce champ de texte c'est ce qui va se faire appelé, donc je n'ai pas enregistrer un gestionnaire d'événements. J'ai branché le délégué, et chaque fois que cet événement se déclenche c'est la méthode qui sera appelée, si je viens ici à mon storyboard et exécutez-le- tandis que son chargement, nous pouvons voir ce qu'il fait. Sur mon écran, j'ai 2 choses. J'ai ce champ de texte, et j'ai cette étiquette. Je dis simplement que je veux que le texte de cette étiquette pour être égale à ce que l'utilisateur a entré à l'intérieur de la zone de texte. Cette ligne suivante ici est tout simplement une méthode que je vais appeler sur le champ de texte qui dit que je veux que vous pour masquer le clavier. C'est juste la méthode arbitraire que Apple a choisi. Encore une fois, avant je faisais quelque chose que j'avais à câbler tout, donc je suis arrivé ici. Depuis le contrôleur de vue je fais glisser vers la zone de texte. Je laisse aller, et je peux voir que je peux faire ce bien le texte du champ depuis plus ici dans le contrôleur de vue que j'ai défini une propriété qui est un IBOutlet d'un champ de texte. Ceci signifie que je peux câbler cette propriété jusqu'à à un champ de texte dans mon interface. Maintenant, quand je clique sur ce que je peux commencer à taper. Maintenant, si je clique sur le bouton fait ce qui se passe au feu un événement que je peux maintenant répondre. Aucun des gestionnaires d'événements. C'est ainsi que je viens de répondre à ce bouton fait. Donner un sens? Ce n'est pas un modèle de conception qui, vous pourriez ne jamais vous retrouver créer votre propre protocole, mais il suffit de savoir que certains différents composants iOS enregistrer les événements de différentes manières. Boutons, par exemple, utiliser ces IBActions. Les champs de texte, d'autre part, vont utiliser des délégués. Nous pouvons voir et vous pouvez regarder tout cela à l'intérieur de la documentation. Soit dit en passant, il ya en fait une tonne de choses interface utilisateur intégrées à iOS pour vous, Ainsi, par exemple, la façon dont j'ai fait ce que disent fait en bas à droite est J'ai choisi cet champ de texte. Je suis venu ici. J'ai fait défiler vers le bas pour revenir clé, et je peux réellement faire une foule de choses, comme si je veux ça pour dire appel d'urgence à la place que je peux faire, ce qui est totalement aléatoire, et je ne sais pas pourquoi il ya un bouton intégré d'appel d'urgence, mais il ya, dit-il d'appel d'urgence en lettres très petites. Là vous allez. Certainement explorer toutes ces différentes options dans iOS. Toutes les questions sur les délégués? Encore une fois, un design pattern intéressant que vous devriez être au courant. Ok, la prochaine jeter un oeil à vues de table. Une vue de table est essentiellement que la liste des éléments qui sont un peu partout dans iOS. Lorsque vous êtes en feuilletant l'ensemble de vos contacts, vous cherchez à la page de configuration, et ce genre de liste de choses est appelé un tableau. La mise en œuvre d'une vue de table dans iOS est assez simple. Au lieu de faire une classe qui dérive de celle UIViewController comme nous l'avons fait avant nous avons simplement besoin de dire plutôt que tout un UIViewController ne je veux faire, Je dis tout un UITableViewController ne je veux faire, donc qui ajoute simplement quelques choses supplémentaires qui sont totalement fait pour nous. Nous devons faire très peu pour essentiellement remplir les espaces vides à l'intérieur de la table. Pour afficher un tableau que je dois répondre à quelques questions. La première question que je dois répondre est combien de sections sont dans le tableau? Lorsque vous êtes en feuilletant votre application Contacts, vous remarquerez que c'est le genre de organisé par l'As, alors vous avez le monde entier, et vous avez cette tête sous peu. Chacun de ceux qu'on appelle une section. Vous pouvez ou ne pouvez pas besoin de ça. La première chose que vous devez faire est de mettre en œuvre une méthode appelé tableView: numberOfSectionsInTableView. Qui retourne simplement le nombre de sections que vous avez, alors cela pourrait dire retourner un si vous avez un point de vue grande table. La prochaine question que iOS a besoin de savoir, c'est combien de lignes avez-vous? Par exemple, vous êtes en feuilletant un tableau. Vous disposez d'un nombre fixe de chansons que vous cherchez à ou un nombre fixe de contacts. Si vous êtes moi, bien sûr, pas tant que ça, et c'est comme ça que iOS ne sait combien de cellules à afficher. Encore une fois, cela pourrait dire quelque chose comme retour 3. Mon point de vue le tableau a 3 lignes. Enfin, iOS a besoin de savoir ce que chaque cellule ressemble, donc ce qu'il se passe réellement à faire est d'appeler cette méthode ici-bas, ce tableView: cellForRowAtIndexPath. Il va appeler cette méthode sur chaque cellule à l'intérieur de votre table. Comment sait-il combien de fois l'appeler? Eh bien, vous avez dit à l'intérieur du nombre de lignes dans la section. Nous allons appeler ce sur chacune de nos cellules, et à l'intérieur de ce que vous pouvez faire des choses comme définir le texte ou vous dire ce que le petit bouton bleu sur le côté droit fait. Le motif pour obtenir ces cellules, nous allons utiliser cette méthode appelé dequeueReusableCellWithIdentifier. Objective-C est en fait très bien connu pour la longueur ridicule de leurs noms de méthodes, et c'est vraiment une jolie boîte en exemple de point. Que cette méthode ne fait que cela en dit juste que je veux que vous me donniez une cellule. Juste une chose iOS. Si vous avez quelque chose comme 100.000 chansons sur votre iPod ce que iOS ne veut pas faire est d'allouer 100.000 cellules, parce que si vous êtes au sommet de votre liste, avez-vous vraiment besoin d'allouer de la mémoire de la cellule qui est 99.000 lignes vers le bas? Non, parce que vous vous pouvez faire défiler genre d'affecter comme vous allez le long. Ceci est fait pour vous. Vous n'avez pas à vous soucier de tous ces trucs stupides performances. Tout ce que vous dites est ce que vous appelez la méthode dequeueReusableCellWithIdentifier, et cela dit, d'accord, si vous avez besoin d', je vais créer une nouvelle cellule pour vous. Mais si vous êtes au bas de la table et que vous avez déjà alloué certaines cellules dans la partie supérieure de la table qui vous êtes vraiment pas avoir besoin de sitôt Je vais vous donner un de ceux qui reviennent au lieu d'allouer une nouvelle, et c'est donc une préoccupation belle performance. Vous n'avez pas besoin d'allouer les cellules-même. Cela va vous redonner une cellule. Il va revenir à vous un objet de cellule. Une fois que vous avez l'objet de cellule, vous pouvez faire des choses pour elle. Vous pouvez définir le texte de la cellule avec cette propriété appelée étiquette de texte. Vous pouvez ajouter cette flèche à droite ou à d'autres choses au hasard avec cette autre propriété appelée accessoryType, et ainsi de suite, et ainsi de suite. Jetons un coup d'oeil à la mise en œuvre fait maintenant une vue de tableau. Quand j'ai créé ce projet plutôt que de dire l'application seule vue fait, je suis venu ici de maître-détail d'application, et donc en gros ce qui correspond à l'application électronique sur l'iPad avec l'affichage du tableau sur la gauche et ensuite le contenu sur la droite. Sur l'iPod ou de l'iPhone cela va correspondre à une vue de tableau unique. C'est là que j'ai eu mon code de démarrage. Jetons d'abord un coup d'oeil à la table de montage. Tout cela a été fait pour moi, essentiellement créé. Cette barre de navigation m'a montré ce qu'est une cellule par exemple pourrait ressembler, et je peux double-cliquez sur cela, modifiez le titre. Toute préoccupation interface autres que je peux gérer là-bas. Le fichier d'en-tête ressemble vraiment simple. Plutôt que de dire que c'est UIViewController nous sommes en train de dire que c'est une TableViewController, donc nous savons que nous voulons appeler toutes les méthodes de table. Ensuite, je veux créer une propriété qui va représenter les choses à l'intérieur de ma table. Ce tableau va afficher arbitrairement une liste de fruits, et donc j'ai besoin de créer une gamme dans laquelle je peux insérer des fruits. A l'intérieur de mon fichier d'implémentation, la première chose que je veux faire c'est que je veux m'assurer que je initialiser ce tableau. J'ai dit alloc init, créé mon tableau de fruits, et je suis en ajoutant 4 choses à lui, dont l'un est beaucoup plus controversé que les 3 autres. Et maintenant, j'ai un tableau de taille 4. Nous sommes en l'agitant en CS50. J'ai maintenant un tableau de taille 4. Maintenant, je vais commencer à répondre à ces questions, et en fait, quand j'ai créé cette application tout cela a été déjà fait pour moi. Je n'ai pas besoin de taper sur le nombre de sections en vue tableau. Il était déjà là, et je suis de remplir les blancs. Combien de sections ai-je? One. Tout est fait. Combien de lignes puis-je avoir? Eh bien, j'ai une ligne pour chaque fruit, ce nombre est une propriété d'un tableau qui indique quelle est sa taille? C'est le nombre de lignes que j'ai. Enfin, je dois dire qu'est-ce que chaque cellule ressemble? Je vais dire dequeueReusableCellWithIdentifier. Encore une fois, cela a déjà été écrit pour moi. Je n'ai pas eu à le faire moi-même, et je veux revenir cette cellule à cet endroit. Rappelez-vous que nous appelons cette même méthode sur chaque cellule, et cet argument ici, cet argument indexPath, dit ce que je suis dedans rangée Si je dis indexPath.row ici ce sera 0, alors il sera de 1, alors il sera 2, et ce n'est donc je sais quelle cellule je suis en train d'afficher. Je veux mettre le texte de la cellule en utilisant cette propriété Textlabel aller à l'intérieur mon tableau de fruits et obtenir l'objet correspondant à chaque rangée. Si c'est une chaîne, je suis en train de mettre la propriété text d'une chaîne. Je peux faire autre chose. Je peux aussi enregistrer un gestionnaire d'événements sur chacune des cellules, alors quand je tape chacune de ces cellules ce didSelectRowAtIndexPath, cela va être appelé pour moi, si simplement en définissant ce que je peux maintenant gérer ce qui se passe lorsque vous appuyez sur une cellule, et encore une fois, nous passons dans la cellule qui a été exploité afin que nous puissions utiliser ce gestionnaire d'événements de même pour l'ensemble de nos cellules. Encore une fois, c'est quelque chose que iOS est fait pour moi. Nous allons afficher un autre popup ennuyant qui dit simplement que vous avez choisi quelque chose où que quelque chose va être l'objet de ligne. Quand je lance ce, je vais avoir cette vue belle table avec une ligne pour chacun de ces fruits, et si je appuyez sur l'une il me dit ce qui s'est passé. Donner un sens? Bâtissons un peu plus complexe d'une application, autant que vous avez choisi en cliquant sur la tomate est. La belle partie de la scénarisation est que ce n'est pas seulement aller à des écrans d'aide de conception nous individuellement, il va aussi nous aider à relier notre application entière, si l'application finale, nous serons bâtiment est cette belle sportive lecteur de nouvelles, et il va avoir plusieurs écrans, et pour que je puisse représenter chacun de ces écrans multiples sur le story-board, et je peux effectuer un zoom arrière et de voir mon application à partir d'un niveau élevé. Pour créer un nouvel élément à l'intérieur de mon storyboard il est vraiment simple à l'intérieur d'Interface Builder. Si je veux ajouter un autre écran pour cela, par exemple, Je peux d'abord effectuer un zoom arrière avec le zoom par pincement que Apple aime tellement, et ici-bas avant de chercher un bouton et je fais glisser un bouton si je veux créer un nouvel écran je peux vraiment simple glisser-déposer un contrôleur de vue entière, donc si je prends cela, tirez ici, bon, il ya un autre écran, et donc maintenant utiliser ce fichier storyboard même Je peux avoir tous les écrans à l'intérieur de mon application et je peux effectuer un zoom arrière et de voir comment ils interagissent. Ceux-ci ne pourront pas interagir encore. La façon dont ces 2 écrans interagissent est de définir les relations. Vous pouvez en principe dire cet écran, lorsque vous appuyez sur ce bouton, Je veux que vous faites glisser vers ce nouvel écran. Cela signifie qu'il ya ce genre de relation entre  le premier écran et le second écran. Vous aurez essentiellement une flèche de ce bouton sur le second écran dire que lorsque vous appuyez sur ce bouton c'est là où je veux aller. Tout comme nous contrôlons cliqué et traîné à définir les points de vente nous allons faire la même chose pour définir ces enchaînements. Nous allons voir un exemple de cela, et avant que nous ne la transition d'un écran à un autre iOS est assez gentil pour appeler cette méthode appelé prepareForSegue, et c'est là que nous pouvons commencer à l'envoi de données d'une application à l'autre. Dans l'exemple que nous sommes sur le point de regarder il sera simplement nous permettre pour filtrer les équipes de baseball par les ligues et les divisions. Lorsque je sélectionne une ligue, par exemple, je veux faire la transition à mon prochain écran où je peux afficher toutes les divisions dans cette ligue ou toutes les différentes équipes. J'ai besoin d'envoyer à cet écran ce que vous devez afficher équipes. Pour ce faire, je vais prendre avantage de cette méthode ici. Enfin, juste un point au hasard sur iOS. Si vous souhaitez stocker les données, il ya cette chose appelée base de données, qui est en fait assez compliqué de travailler avec. Vous pouvez également utiliser SQL pour stocker des données, qui, encore une fois, est agréable mais un peu sur le côté le plus compliqué de travailler avec, mais iOS prend également en charge ces choses vraiment cool appelé listes de propriétés, et une liste de propriétés est juste un fichier qui représente paires clé-valeur. Vous pouvez définir une liste de clés, et vous dites: cette touche va être un tableau. Cette clé va être une chaîne, et plus généralement tout ce que vous pouvez faire en JSON, vous pouvez le faire à l'intérieur d'une liste de propriétés, et si cela vraiment bien nous permet de travailler avec des données. Par exemple, j'ai ce Teams.plist que j'ai créé. J'ai créé un nouveau fichier plist, et je peux naviguer. Il s'agit d'un dictionnaire, il s'agit d'un dictionnaire, ce sont des chaînes de caractères, et donc c'est une jolie représentation graphique d'un document JSON ou tout simplement un ensemble de paires clé-valeur, et si ce sont les données que je vais travailler avec l'intérieur de mon application. Voyons d'abord venir ici. Nous avons des dossiers beaucoup plus maintenant. Mais nous allons d'abord venir ici pour le storyboard. Le storyboard ici-si je peux effectuer un zoom arrière- nous pouvons maintenant voir que c'est le flux de mon application. Je vais d'abord commencer sur cet écran. Je vais creuser à cet écran, et je vais creuser à cet écran, et nous pouvons voir ici que si je sorte de déplacer un de ces autour de nous ces flèches aller d'ici à là, et la façon dont je définis cette flèche était si je zoomer un peu, et si je viens sur ce contrôleur de vue, et voici une cellule, et je tiens à dire que lorsque vous appuyez sur une cellule Je veux que vous faites glisser sur un autre écran. Je ne peux tout simplement maintenez le contrôle, faire défiler un peu, maintenez la touche de commande, faites glisser cette cellule plus et de laisser aller. Et ici nous dire ce qui est de la transition que vous souhaitez utiliser? Voulez-vous utiliser ce truc diapositive qui s'appelle push? Voulez-vous glisser vers le haut à partir du bas? C'est ce qu'on appelle modale. Et une fois que je clique sur l'un de ceux-ci, il va tirer cette flèche pour moi, et cela veut dire que j'ai effectivement manipulé ce qui se passe lorsque j'appuie sur ce bouton graphique. Je n'ai pas écrit de code à fait glisser d'un écran à la suivante. J'ai défini ce visuellement l'intérieur d'Interface Builder. Si je clique sur cette flèche, on peut voir que j'ai donné à cette chose un nom. Je l'ai appelé showDivisions, et c'est pour que je puisse savoir ce passage est sur le point de se produire, et nous verrons pourquoi dans une seconde. C'est comme ça que j'ai câblé les différents écrans dans mon application. S'il s'agissait d'un bouton, par exemple, plutôt que d'une vue de tableau, Je pouvais contrôler cliquez sur le bouton, faites-la glisser à l'écran suivant, et c'est comme ça que je peux faire la navigation de cette façon. Très rapidement, si nous entrons dans la MasterViewController, encore une fois, nous allons simplement de définir une liste de choses qui sera affiché dans le tableau. Ici, je dis que je veux que vous preniez ce fichier plist, et je veux que vous le charger dans un dictionnaire, et une fois que vous avez ce dictionnaire, je vais répondre à ces mêmes questions. Voici le nombre de sections. Un, il ya une ligne pour chaque ligue, et le texte de chaque cellule devrait être soit la première, la première ligue, la deuxième ligue, et ainsi de suite. Enfin, je vais utiliser cette méthode que nous venons de le voir appelé prepareForSegue, et c'est la méthode qui va être déclenché lorsque je clique sur sur l'une de ces rangées et par conséquent l'activation de la transition que j'ai mis en place avec les flèches. Cela revient à dire que je peux avoir plusieurs relations d'un écran à l'autre. Si j'ai 2 boutons et chaque bouton vous amène à un autre écran Je vais avoir 2 enchaînements, 1 pour chaque bouton. Mais cette prepareForSegue est, encore une fois, va être réutilisés pour chacune des différentes relations, ce qui signifie que j'ai besoin d'une manière d'identifier si vous appuyez sur le premier bouton ou que vous appuyez sur la deuxième touche. Rappelez-vous quand j'ai donné cette segue un nom, ce showDivisions, c'est comme ça que je sais maintenant que c'est le segue qui a été activée. Tout ce que je veux faire, c'est que je veux dire Je veux comprendre ce que je viens de frapper, et ainsi d'obtenir cela, je peux dire que je veux le indexPath pour la ligne sélectionnée, rappeler le indexPath dit exactement où je viens cliqué, et puis je tiens à dire que je veux savoir où je vais. Cette destinationViewController, c'est une propriété de l'enchaînement. C'est l'écran que je vais, je sais que l'écran, je vais s'appelle DivisionsViewController parce que j'ai créé cette classe, et maintenant si je dis d.divisions Je suis en train de mettre une propriété du contrôleur de vue que je m'apprête à aller. C'est ainsi que je suis l'envoi de données d'un écran à un autre écran. Il suffit de regarder ce DivisionsViewController vous pouvez voir ici que dans le fichier. h il ya que les divisions de propriété, et c'est ce que je suis fondamentalement peuplement, c'est comme ça que je sais que je suis l'affichage des divisions correspondant aux la ligue que je clique dessus, et encore une fois, l'affichage du tableau réelle se présente pratiquement la même chose, juste répondre à ceux 3 questions simples ainsi que l'identification ce qui se passe lorsque vous passez à l'écran suivant. Juste une couple d'autres choses ici. Vous remarquerez en haut ici que plutôt que de dire # include Je suis en train de dire # import. Ceci est juste une chose Objective-C. L'importation est essentiellement une version plus sympathique de include, et, par exemple, nous avons besoin de savoir ce que cette classe est, je ne peux pas vous dire DivisionsViewController. Si nous n'avions pas hashtag l'intérieur standardio.c de notre fichier. C le compilateur n'avais aucune idée de ce qui était printf. De même, si je n'ai pas importer le DivisionsViewController le compilateur n'a vraiment aucune idée de ce qu'est un DivisionsViewController est. Assurez-vous que l'intérieur de vos fichiers différents m. Vous veillez à importer les fichiers correspondants. h afin que le compilateur sait ce qui se passe. Enfin, ce que Apple ne permet finalement est d'afficher des données en utilisant un affichage Web, et ainsi un affichage Web est un objet dans lequel vous pouvez intégrer un navigateur peu à l'intérieur de votre application. Tout ce que vous devez faire est de fournir une URL de votre navigateur, donc je veux aller à mlb.mlb.com, et voilà comment je peux accéder à la page d'accueil de chaque équipe, et si en passant dans cette URL l'affichage Web peut afficher ceci pour moi, et je peux naviguer autour, et le simulateur est en cours d'utilisation par celui-ci. Maintenant, cela venait de mon plist. Si je clique sur ce cela aussi vient de mon plist, et ce glissement a été traitée en définissant ces enchaînements. Je clique sur cela et plus d'un, et maintenant voici ma UIWebView, alors juste comme ça voici le site de l'URL que je viens intégré, et je n'ai pas eu à gérer quoi que ce soit fou. Voici comment afficher une page Web. Des choses comme ce bouton de retour ici sont également donnés pour moi tout à fait gratuitement, parce que j'ai défini ces relations en utilisant des enchaînements. Des questions? Ouais. [Étudiants] Ainsi, lorsque vous utilisez alloc, vous n'aurez jamais à quoi que ce soit gratuit? Justement, lorsque vous appelez alloc et init, vous n'avez pas à le libérer. IOS va gérer tout cela pour vous. C'est merveilleux, et vous n'êtes pas enfreindre les règles. Ouais. [Étudiants] Si vous étiez à inclure plus d'équipes qui pourraient s'intégrer à l'écran, ne serait-il automatiquement une option de défilement, ou est-ce quelque chose que vous devez ajouter? Justement, si je n'avais plus d'équipes, par exemple, il gère automatiquement le défilement pour moi, et tous les problèmes de performance avec la grande table sont également traitées totalement pour moi. D'autres questions? Tout ce code va être affichée. Nous avons un peu passé sous silence un peu des détails les plus petits, mais des choses comme fixer quelques propriétés de l'affichage Web sont juste des choses que vous pouvez obtenir en naviguant sur la documentation d'Apple, ce qui est vraiment, vraiment bien aménagé. Ils ont beaucoup d'exemples d'applications et usages par exemple d'API, il faut absolument parcourir les si vous le pouvez. Juste quelques liens utiles vous voudrez peut-être jeter un coup d'oeil. Voici quelques guides de la documentation à portée de main. Les URL sont massifs, ils sont donc raccourcie. Cette première est toute la bibliothèque de documentation. Il ya des barres de recherche petits, donc si vous commencez à taper le bouton il va commencer en vous donnant toutes les informations sur toutes les choses que vous pouvez faire avec un bouton. J'ai également inclus le Guide de programmation Table View. Il gère les vues de table beaucoup plus en détail, comment faire les choses comme ajouter dynamiquement des cellules ou des cellules les modifier ou les supprimer. Il ya beaucoup d'exemples d'applications d'Apple qui va vous montrer comment faire, et enfin, ce dernier est l'Interface Guidelines de l'homme, et il s'agit essentiellement d'une discussion de composants d'interface utilisateur, des choses comme ne pas faire un bouton qui est de 4 pixels par 4 pixels. C'est une mauvaise idée, et d'autres choses que Apple veut que vous fassiez d'encourager une bonne conception. Toutes les dernières questions avant de conclure? Très bien, certainement, n'hésitez pas à-nous allons avoir des étiquettes spéciales sur Discuter. Nous aurons un iOS un, donc certainement n'hésitez pas à utiliser cela. Si vous souhaitez travailler avec vos camarades de classe sur des projets ou aider à comprendre certaines choses au hasard iOS n'hésitez pas à m'envoyer un mail, et certainement parcourir toute la ligne de code, car seulement dans l'intérêt du temps nous avons un peu passé sous silence le plus détails les plus fins grains de choses. Mais si non, alors bonne chance pour vos projets iOS, et j'espère que nous aurons un afflux important d'applications dans l'App Store. [CS50.TV]