[Powered by Google Translate] [Seminario] [IOS: Escribindo Aplicacións Like a Boss] [Tommy MacWilliam] [Harvard University] [Esta é CS50.] [CS50.TV] Todo ben, todos, benvidos para IOS: Escribindo Aplicacións como un xefe. Este seminario vai concentrarse en escribir aplicacións para o iPhone e á súa vez a escribir aplicacións para o iPad, e por iso estamos basicamente vai percorrer algúns exemplos diferentes de como facer unha aplicación, un xogo simple como Tic Tac Toe, ou se está máis interesado en facer un programa como unha especie de lector de noticias ou algo que interactúa con Internet vou falar sobre iso tamén. Aquí está a nosa axenda breve. Aplicacións do IOS son escritos nunha linguaxe chamada Objective-C, e por iso este é un pouco semellante a C, pero non realmente en todo, por iso imos estar falando un pouco sobre a propia linguaxe e como construír aplicacións para o iPhone usando este programa aplicación chamado Xcode, que se non ten baixo aínda Sinto-se libre para iniciar a descarga agora. É varios gigabytes. Debe ser libre na App Store, polo que ten que ter un Mac idealmente rodando a última versión do OS X. Se vostede non é, non hai problema. Temos Macs no Centro de Ciencias dispoñibles para o seu uso co Xcode instalado, e tan a gusto para usar os para o desenvolvemento. Se queres facer un app, pero non ten un Mac, non se preocupe. Hai unha abundancia de recursos do campus para iso. E entón nós estamos indo para cubrir 2 exemplos maiores de aplicacións diferentes que podes facer. Objective-C é técnicamente o que se chama un super set de C. Isto significa que calquera código C é tamén o código Objective-C válido. Isto significa que tipo de conducto gravadas algunhas características adicionais C. Algunhas destas características inclúen non ter que escribir sempre malloc novo, grazas a Deus, sen ter que se preocupar cos punteiros estúpidas e liberando-os e todas as cousas que vostede odiaba sobre C, e é unha especie de desaparecido en Objective-C. Agora, Objective-C tamén ten unha biblioteca estándar moito maior, por iso hai unha función moito máis comeza dentro libre de Objective-C. Lembre-se de cando estabamos escribindo PHP notamos que pasou de este pequeno linguaxe para a biblioteca xigante de todas estas cousas malucas que podes facer. A mesma cousa sucede no IOS. Hai obxectos para cousas como o calendario budista, e realmente nada pode pensar de, probablemente, xa está na implementación Objective-C. A parte obxectiva da Objective-C é referencia algo chamado Programación Orientada a Obxectos. Este é o tipo de un concepto novo, pero temos, en realidade a maioría aprendeu moitos deses conceptos xa. A idea detrás Programación Orientada a Obxectos que está indo a estruturar unha morea de código en torno destas cousas chamadas de clases, e esas clases son realmente glorificado estruturas. Dentro dunha estrutura que basicamente dixo aquí é unha cousa, e esta cousa pode ter membros. Por exemplo, un nó de lista ligada pode ter outras cousas como un valor, un punteiro para o próximo nó na lista, e, xuntos, ese punteiro e ese valor compuxo esta instancia dunha struct. As clases son moi semellantes, excepto clases tamén poden ter funcións dentro deles. Cando declaramos unha estrutura, podemos só dicir n int ou * vindeiro nodo. Agora, co Objective-C, podemos realmente poñer funcións dentro desas cousas. Outra cousa que as clases poden facer é que poden herdar datos de outras clases. Por exemplo, imos estar a ollar a unha morea de built-in clases Objective-C. Un deles podería ser a clase que representa o punto de vista dunha pantalla, e así por dicir quero aplicar meu propio punto de vista Nós basicamente dicir alguén na Apple, a xente probablemente moi legais, escribiu esta clase para min, e trata sobre as cousas como mostrar botóns ou facendo a pantalla, e sería moi triste para aplicar todas as funcións que nós mesmos, e así, simplemente herdar datos, podemos dicir que todo o que fixo na clase Eu tamén quero dentro da miña clase, e entón eu vou facer algunhas outras cousas, ou sexa, aplicar un programa. Isto é o que a herdanza palabra significa. Imos ver un exemplo máis concreto. E, finalmente, a clave con programación orientada a obxectos é que ela conduce a encapsulação de datos. En algúns dos noso problema define poderiamos ter estes grandes, variables globais e globais en todas partes, e é así que nós manter o control de estado. Con clases podemos comezar encapsulado información dentro dun obxecto. Se temos unha pantalla no noso app, nós realmente non precisa ter todos os datos de outra pantalla no noso interior app que, e así por encapsulado as cousas dentro de clases que realmente leva ao proxecto de código moito mellor, e iso é posible con algúns dos recursos adicionais de Objective-C. Aviso previo, a sintaxe para Objective-C e bananas. É como nada que xa vimos antes, por iso é un pouco de unha curva de aprendizaxe para acostumar o que diaños significa isto? Pero unha vez que pasar por esa curva de aprendizaxe inicial é realmente, realmente bo para comezar a escribir aplicacións. Para declarar unha clase, a dicir aquí é a miña clase, existe, e, quizais, aquí están algunhas cousas que eu estou indo a definir posteriormente, Eu vou dicir @ interface. Eu vou dicir @ interface. Vou dar a miña aula dun nome. E, máis tarde, en outro lugar que eu vou dicir @ final, e todo entre a interfaz eo @ @ end vai ser a miña clase. Isto vai ser o que está dentro dos nosos arquivos. H. Así como en C nosos arquivos. H basicamente dixo, aquí están algunhas cousas que existen. Eu non estou necesariamente dicindo o que eles fan, con todo, pero o compilador precisa saber que existen. Máis tarde, dentro da nosa m. Arquivos, porque m para Objective-C é onde estamos indo realmente para definir o que esas clases forman. Moi parecido cos nosos arquivos. C, fornecen unha implementación para funcións. Dentro do noso arquivo. M imos dicir aquí é que todas as funcións dentro da miña clase que todos fan. E, finalmente, dentro dunha estrutura poderiamos dicir dentro desas claves int, ou no n * próxima e en Objective-C, imos utilizar a palabra chave @ Property e isto é o que vai definir as propiedades, ou as funcións non que son unha parte das miñas clases. Chamando funcións en Objective-C é tamén bananas. Cando declarou funcións en C que dixo algo así como int foo e aberto paréntese e despois deulle unha lista de argumentos. Isto é o que declarar métodos ou funcións parece en Objective-C. Se eu queira declarar unha función ou un método onde eu estou dicindo método é realmente só unha función que é membro dunha clase, tan tipo de intercambiables, pero non realmente, tan dentro do meu método quero crear un novo método. Vai voltar nada, polo que vai ser do tipo void. Este é o tipo de retorno da miña función. Agora temos parénteses aquí porque eu non sei. A continuación será o nome da miña función, e, finalmente, temos un punto e coma como tivemos en C. O que é novo aquí é este cara aquí. Este trazo é realmente necesario, eo que iso di é que este método aquí debe ser chamado unha instancia dunha clase. Despois que declarou nosas estruturas que probablemente dixo algo así como n nodo struct, e que creou ou instanciado unha desas estruturas para que eu puidese realmente comezar a traballar co que está dentro del, de xeito que este trazo significa que temos que instanciar a clase así como nós instanciado que struct antes de nós pode chamar ese método nel. Se eu queira comezar a engadir argumentos para os meus métodos tórnase aínda máis bananas. Aquí está o meu nome do método. Entón eu vou ter dous puntos, e logo este colonos di aquí vén algúns argumentos. Este método ten un argumento. O tipo do argumento é un int, eo nome que o argumento ou a variable que eu vou comezar a usar dentro do método é chamado de i. De novo, este é o método. Ela ten un argumento. Se queres comezar a engadir máis argumentos queda máis bananas en que temos esta colonos que di aquí vén a miña lista de argumentos. Este primeiro argumento é un enteiro. Agora, este segundo argumento é interesante. A variable que eu vou estar usando dentro da miña función chámase f, na miña función eu podería dicir f + = 1 ou algo así. Iso aquí é basicamente unha chave para que o argumento ou parámetro. Así como tivemos pares de valores clave e algo JSON ou arrays asociativos Objective-C tomou a decisión de dicir, ben, só para que quede ben claro cando chamar un método que todos estes parámetros son Eu estou indo realmente para nomea-los todos. Cando chama un método, vai realmente dicir andFloat, e entón vai pasalo dentro Curiosamente, este non é nomeado, pero todos os outros parámetros, por iso, se tivésemos un argumento 3 que eu podería dicir andFloat e outra boia e así por diante. Cando chamar estes métodos é de bananas do curso, Entón, se eu teño un obxecto, e definido un método chamado foo, e quero chamalo, en vez de dicir foo aberto / parens próximos Vou abrir un paréntesis. Aquí está o nome do meu método. Vou pechar o soporte, e ese é o obxecto que eu estou chamando-o. Lembre, todos estes métodos existen dentro de clases porque as clases poden ter métodos definidos dentro deles. Aquí arbitrariamente creado un obxecto dalgunha clase, e esta é a sintaxe para facelo. Hai dous pasos para a creación dun obxecto. O primeiro paso é dicir que quero reservar espazo. Isto é o equivalente de un malloc. Non temos que dicir malloc máis. Nós derrubamos o m, fixo alloc, e substituíu o c. Com M. Despois de que algo alloc que necesita entón a arrincar. Basicamente, cando se crea obxectos que pode querer ter algunha lóxica que é executado cando son creados, así pode pasar algúns valores por defecto ou algo así, e por iso este método init é o que realmente crea o obxecto. Nós primeiro reservar espazo, así como fixemos en C, e, entón, iniciar, o que pode ou non pode facer moita cousa. Entón, nós estamos volvendo esa cousa nun obxecto. Hai unha estrela aquí porque este é, tecnicamente, un punteiro, pero non se preocupe, os punteiros non son gran cousa en Objective-C máis. Agora instanciado esta clase chamada NSObject, e esta é só unha clase aleatoria que Apple ten. Nós instanciado iso, e agora eu teño unha instancia da clase neste obxecto, o que significa que se eu definir estes métodos que eu podería chamalos así. Do mesmo xeito, se eu quixese chamar un método con un argumento, por iso este é o método de bar, que ten un argumento, e aquí é o Baz: método qux, entón iso leva 2 argumentos. Iso está chamando dunha función nesta obxecto. Ten sentido? A sintaxe debe ter sentido, pero medio que se acostumar con iso. Ok, imos falar sobre algunhas cousas que son construídos en Objective-C que non foron necesariamente construído en C. En que tipo de C tivo que xestione as secuencias como estas matrices de carácter estúpidas, e el quedou realmente irritante. Objective-C ten todos aqueles construído en para nós, e está construído en usando esta clase chamada NSString. Cando quero crear un NSString temos sintaxe máis misterioso. En vez de dicir "CS50", dicimos @ "CS50" e esta é só a sintaxe para declarar strings en Objective-C. Isto é moi doado de esquecer, por iso non. Agora, unha vez que teño iso, iso é unha secuencia, pero teña en conta é realmente só un obxecto. Eu dixen NSString, o que significa que a clase instanciada chamada NSString, que alguén escribiu para min, e eles foron moi agradable sobre el, e por iso agora Eu podo comezar a chamar métodos nel. Se eu chamar a lonxitude método nesta s obxecto vai volver para min a lonxitude da corda. Este é só como strlen en C. Este volvería 4. Do mesmo xeito, outro método que eu podería querer se preocupar con iso é characterAtIndex. Este é un método que di sobre este string s Eu quero vostede para obter o carácter 0, e así que este volvería para min o carácter C, e hai unha morea máis destes métodos que pode Google realmente fácil. Documentación de Apple é grande, e nós imos dar un ollo ao que a pouco. Esas son cordas. Temos tamén matrices de tamaño variable construído dentro Teña en conta que o C cando declaramos unha matriz tivemos que dicir que ten 5 elementos, fin da historia. Cando chegamos ao JavaScript e PHP poderiamos comezar facer as cousas como a adición de elementos ou movendo elementos. Podemos facer o mesmo en Objective-C. En vez de crear unha matriz no camiño C normal temos novo outra clase chamada NSMutableArray. Hai tamén NSArray, e iso vai basicamente encapsulado algúns matriz. Este di que o primeiro que quero facer é que quero para reservar espazo para unha nova matriz, e despois de que eu atribuílo lo Eu, entón, que inicia-lo. De novo, pode chamar estes dous métodos. Agora, isto significa que dentro deste obxecto dun Eu teño unha matriz baleira sentado alí. Se eu queira engadir algo a esa matriz, podo chamar o método addObject. Eu quero engadir un obxecto a matriz, e quero engadir a cadea CS50. Se eu quixese borrar inversamente que podo dicir que quero eliminar o obxecto en primeiro lugar na matriz ou un obxecto. Ten sentido? Ok, vostede medio que se acostumar con esa cousa colchete. A propósito, dentro de unha chea de librerías de Apple podes ver este NS. O NS está realmente a próxima etapa, que foi unha das empresas de Steve Jobs primeira, e é aí onde realmente comezou a escribir unha morea de código como unha especie de base para o Mac OS X e todas as outras cousas, e por iso este tipo de NS é ese legado bo berrar para unha das empresas máis antigas volta, cando a Apple foi a primeira partida. Está en todas partes. Imos dar un ollo a un exemplo máis holística Objective-C. Aquí estou dentro Xcode. Para chegar ata aquí, eu primeiro baixo Xcode da App Store, abriuse, e entón eu fun ata aquí para arquivo, acá para novo proxecto, e entón. Despois de facer isto eu teño todas esas opcións do que quero para crear, e así imos dar un ollo nesas opcións máis tarde, pero só para este exemplo, porque non estamos realmente vai ter unha aplicación, con todo, Eu vin aquí, e eu dixen ferramenta de liña de comandos, e este é unha aplicación que eu podería executar na liña de comandos como vimos execución de C. É así que eu creei este proxecto, e agora eu estou aquí, entón imos primeiro ollar para este ficheiro, e iso debe ollar moi familiar. Eu teño un nome int. Non é o meu argc amigo, meu outro amigo argv. E así podemos ver que este é o punto de entrada para a miña candidatura Objective-C primeiro. Aquí podemos ignorar isto por agora. Este é basicamente algunhas cousas manexo de memoria que non vai realmente sempre ten que se preocupar. Imos ollar para este primeiro bloque aquí. Esta primeira liña, se eu dixer Estudante * Alice = [[alloc Estudante] init] que é o que está facendo? Este primeiro alumno aquí, esta é probablemente unha clase. Esta non é unha clase que Apple escribiu, pero é unha clase que eu escribín. A primeira cousa que quero facer é que quero reservar espacio para un novo alumno, e entón eu quero para iniciar, entón iso me dá de volta este obxecto novo alumno, e eu son almacenar tanto nunha variable chamada Alicia. Onde foi que a clase vén? Ben, aquí ao lado esquerdo son todos os ficheiros distintos dentro do meu proxecto. Podemos ver aquí eu teño un Student.h e un Student.m. O. Arquivo h, lembre, é onde eu declaro todas as cousas que existirá dentro da clase. Imos dar un ollo niso. Todo ben, aquí temos esta interface @, e este di que aquí vén as declaracións de todo o que vai existir dentro da miña clase. Entón eu teño dous puntos. Entón eu teño esa cousa NSObject. Isto significa que pouco colonos herdanza estabamos discutindo un pouco máis cedo. Isto di todo o que un pode facer NSObject onde NSObject é esta clase escrito por outra persoa, todo o que pode facer NSObject Eu quero ser capaz de facer iso. Ao dicir: NSObject que significa que, basicamente, herdado toda a funcionalidade de outra clase. Isto realmente me deu unha morea de diferentes métodos e propiedades que eu poida usar. Aquí debaixo eu estou creando dúas propiedades. Isto significa que o meu alumno, se este fose unha estrutura, estes serían os 2 cousas dentro da miña estrutura, de xeito que cada alumno ten un nome que é unha cadea, e un estudante tamén ten un grao, que é un int. Finalmente, aquí eu vou crear un método para o meu alumno. Liguei para o meu método, initWithName, e leva un argumento, e ese argumento é unha cadea, e eu chamei el nomear. Agora imos ollar como nós realmente aplicado nesta clase. Aquí, agora eu estou dentro do meu arquivo m., m para a implantación, eu creo. Eu teño a miña aplicación, o meu fin, e aquí é onde eu estou, en realidade, a definición de o que fai initWithName. Teño initWithName, o nome do meu parámetro, e entón esta é onde eu estou, en realidade, a creación dun estudante, e por iso este é un pouco enigmático, pero este é o tipo de clichê que quere incluir nos seus construtores. Esta función de arranque aquí, initWithName, é un tipo de constructor. Vostede está basicamente a construción dun obxecto novo alumno e quizais o envío de algúns datos dentro dela. A primeira cousa que quero facer é que quero chamar o init nesta cousa super. Lembre que cando eu dixen aquí no arquivo h. que todo un NSObject ten un estudante tamén ten. Isto significa que cando creo un estudante que eu tamén teño que facer é asegúrese de que o NSObject que estou herdando todos os datos a partir de É tamén inicializar correctamente. O que eu teño que dicir é o super é realmente indo para referirse a clase pai que eu estou herdando así que quero asegurarme de que arrincar todo o que eu estou dependendo antes de comezar a tentar usalo. Entón, se isto inicializar correctamente este é só como dicir se malloc non voltar nulo, entón eu podo comezar a definir algunhas propiedades. En JavaScript e PHP tiñamos esta palabra clave chamada iso, e iso se refire á instancia actual dunha clase. En Objective-C chamamos iso de si mesmo. Cando digo self.name, o que significa que o obxecto Acaba de crear cando dixo alloc estudante init, que me vai dar de volta un obxecto. Isto significa que eu quero para definir o nome do obxecto para o que eu só pasou dentro Así como en C, temos acceso a membros con este punto, así self.name di o nome do obxecto de estudante agora vai ser o que acaba de pasar dentro E así, finalmente, podo devolve-lo así que eu realmente volver algo. Preguntas? Ok, entón esa auto = super-init, se non comprender totalmente o material herdanza non se preocupe. Só sei que se quere facer o seu propio método de arranque só facelo, e vai ser bo para ir. Si >> [Estudante] O que se auto media? Isto significa que cando nós malloc algo que sempre verificado se era igual a nulo, e era nulo, entón saímos. Esta é a mesma cousa, porque se este regresa nulo, entón probablemente imos culpa seg se comezar a tentar manipulala lo. Esa é a nosa clase estudantil. Isto significa que podemos iniciar nosos alumnos nunha de dous xeitos. Se eu dixer que o init alloc estudante eu non estou usando este método que eu escribín, e en canto podo simplemente dicir alice.name, e agora eu estou indo a definir o nome da propiedade. Do mesmo xeito, se eu queira utilizar este método initWithName Podo simplemente dicir alloc, e despois en vez de dicir o init Vou chamar ese método que acaba de crear, e eu vou pasar Bob. Neste punto, o Bob obxecto ten un nome igual ao Bob. Ok, aquí estou usando o que NSMutableArray que vimos anteriormente. Estou alocando space.Then estou inicializando unha nova matriz. Eu estou indo para engadir 2 cousas a el. Esta matriz agora ten obxectos estudantes. Repare que en ningún lugar que eu teño que dicir que este é un conxunto de alumnos. Eu dixen que é unha matriz, período. Entón eu podo poñer o que dentro del que quero. Aquí eu teño dous obxectos. Finalmente, teño un outro obxecto aquí, este TF. Aquí en TF.h basicamente a mesma cousa. Estou herdando de NSObject, e, a propósito, cando crear clases de todo isto está feito para ti, este tipo de clichê interface. El ten unha propiedade de estudantes. Eu teño un par de métodos aquí que realmente non facer moito, e entón isto significa que despois de eu crear este obxecto TF Podo chamar ese método en serie así. Calquera dúbida sobre Objective-C sintaxe antes de comezar a moverse un pouco máis de cousas desenvolvemento interesante aplicacións? Ok, entón imos realmente facer unha aplicación para iPhone. As clases do núcleo que vai empregar dentro do seu programa para iPhone son chamados controladores de vista, e un controlador de vista representa basicamente unha única pantalla dentro do seu programa, entón eu estou na aplicación de música, por exemplo, un controlador de vista pode representar o punto de vista en que podo ver todas as cancións no meu iPhone. Outro controlador de vista podería ser cando clic nunha música e comezar a xogar ou como eu estou perforación para abaixo en artistas. Cada unha desas pantallas diferentes poden ser representadas como un controlador de punto de vista, e un controlador de vista é realmente só unha clase que di como esta pantalla funciona. Cousas dentro dun controlador de vista, nós imos ter propiedades, para cousas como un botón que vai ser unha propiedade do noso controlador de vista. Tamén imos ter métodos, e estas son, basicamente, manipuladores de eventos. Este método di cando prema este botón Eu quero facer algo, e, finalmente, de novo, imos estar usando esta palabra clave auto para acceder a instancia actual. Para construír interfaces no IOS é realmente moi, moi fácil. Eles teñen esa resistencia agradable e interface caída chamada Interface Builder, e os dous conceptos fundamentais que o fío do seu Objective-C para Interface Builder son IBOutlet e IBAction. Un IBOutlet simplemente di que se declara unha propiedade que é un botón, e quere conectarse a algo na súa interfaz real, vai dicir que é unha saída. Do mesmo xeito, se quere representar un manipulador de eventos entón vai dicir que é unha acción. Para realmente conectar esta representación gráfica eo seu código é realmente, realmente sinxelo. Se desexa engadir un IBOutlet, todo o que tes que facer é controlar clic, e imos ver un exemplo diso realmente rápido. Vostede controla clic onde di View Controller. Vai arrastrar a interfaz, ou, inversamente, se quere conectar un manipulador de eventos que vai arrastrar a partir da interface na outra dirección. Imos dar un ollo a un exemplo IOS realmente sinxelo. Imos crear un novo proxecto. Vou vir aquí para aplicación, e eu vou prema en aplicación de visualización simple. Vou prema Seguinte. Eu vou dar o meu proxecto dun nome. Vou chamalo Olá Curiosamente, Apple asume que está creando un produto de modo que pode vendelo e poden facer diñeiro. Aquí debaixo vou dicir que este é un programa para iPhone. Pode crear unha aplicación para iPad, ou se quere crear un destes programas que soporta dous dispositivos que pode facelo tamén. Estes son o que quere que os seus checkmarks a aparencia. Quere usar storyboards, que imos ver máis adiante, e sempre quere usar o contador de referencia automática, o que é un bo recurso que impide que teña que dicir malloc e free. A menos que quere chamar malloc e free, eu deixaría o marcado. Vou prema Seguinte e, finalmente, que me vai preguntar onde eu quero salvalo. Vou bater crear, e aquí imos nós. Eu creei un novo proxecto. Aquí do lado esquerdo son todos os arquivos que están dentro do meu proxecto, e entender que eu teño unha morea, e eu non fixen nada. IOS é grande. Por exemplo, aquí ViewController.h iso, iso vai representar o meu controlador de primeira vista, para a primeira pantalla dentro do meu programa. Agora sabemos que isto está dicindo. Estamos dicindo que eu estou chamando este ViewController clase, e un ViewController fai todo o que un UIViewController fai, e iso, de novo, é unha clase que Apple escribiu que fai unha morea de cousas útiles para nós Como amosar a pantalla. Aquí é onde podo realmente comezar a definir o que o meu controlador de vista fai, e resulta que realmente non precisa de nada diso. Este é o código cliché de que Apple me dá de balde. Eu fixen precisa que a primeira liña, ou eu non teño unha clase, así podemos librar diso e se librar desa. Ok, entón esta é a miña pantalla baleira. Agora imos premer neste MainStoryboard.storyboard, e é aí onde comeza a estar interesante. Isto representa a primeira pantalla do meu programa. Se eu queira engadir un botón, HTML, eu tiven que crear unha marca de botón. En Android ten que crear unha etiqueta botón, pero no IOS se eu vir aquí para a parte inferior dereita e se eu facer clic nun presente 3 aquí onde di Obxectos, e podo desprazar para abaixo, ou podo comezar a buscar botón. E mira, un botón, entón eu realmente arrastrar e soltar ese dereito alí, Eu só engadiu un botón para esta pantalla no meu app. Se eu queira cambiar o texto, podo facer dobre clic nel, dicir algo atractivo como "Prema me." Ok, agora eu executar esta aplicación, de modo que recompila-lo, para executa-lo eu premer no botón play na esquina superior esquerda, e hai o meu programa. Eu non fixen nada, e eu teño unha aplicación para iPhone doce ollar. Se eu queira parar, pode facer clic no botón de parada porque é máis divertido. Imos dicir que eu realmente quere que algo aconteza cando premer este botón. Para facer que o que eu teño que facer é que eu teño para crear un manipulador novo evento ou unha acción. Isto significa que eu preciso crear un método que quero ser chamado cando presione o botón, entón imos crear un novo método. Eu estou dentro ViewController.h. Eu teño que dicir que un método existe. Eu teño un primeiro guión, porque eu vou estar chamando iso no controlador de vista. Eu teño dar un regalo tipo. O tipo de iso vai ser aquela cousa IBAction que vimos anteriormente. Este é un manipulador de eventos, así que vai voltar un IBAction, e esta é unha información para o Xcode para dicir que iso é algo que quero conectar algo. Podo dar-lle un nome, como comas, buttonPressed. Agora eu teño declarado un novo método dentro da miña clase. Eu xa dixen, este método ten que existir. Agora imos entrar en ViewController.m, e imos dicir o que este método pode facer. Se eu comezar a escribir, por exemplo, (void) buttonPressed aviso Xcode é moi bo e autocompletes para min. Isto é realmente marabilloso. Observe-se aquí que dentro do arquivo. M Eu tamén podo dicir nula, e iso é porque que IBAction non é realmente un tipo. É realmente hashtag definido en algún lugar para un baleiro, e, de novo, esta é só unha información para Xcode que di Eu quero que este sexa un manipulador de eventos, e imos ver por que, en só un segundo. Cando este botón é presionado eu vou facer algo aburrido gusto poñer unha emerxente. Para que podo crear unha nova instancia desta clase chamada UIAlertView, e esta é unha clase que Apple escribiu que vai mostrar ventás emerxentes irritantes. Imos chamar este aviso emerxente, e eu teño dous pasos, lembre, para crear este obxecto. A primeira cousa que cómpre facer é reservar espazo. Eu quero un UIAlertView. Quero reservar espazo. Ese é o meu primeiro método. O meu próximo método é que quero iniciar el, e por iso teño este método, grande e longo chamado initWithTitle. Iso é basicamente o que vai controlar ese pop-up di. O título do meu emerxente pode ser Olá A mensaxe deste emerxente pode ser "Este é o IOS." Delegado cousa, eu non sei o que é. Imos dicir que non é nada. Agora, o botón que aparecerá pode dicir algo como "Con certeza é", e eu realmente non quero outros botóns, entón imos eliminar ese e pechar o soporte. Ok, eu creei un extra. Alí imos nós. Isto é como podo crear un pop-up nova. Se quere realmente mostrar o pop-up que quero chamar o método show. Para facer o que podo dicir alerta e concerto, e, de novo, autocomplete foi super agradable. Se eu esquezo o que era, se eu escriba en s, Eu podo rolar por aquí para descubrir o que era, e filtra ben. Agora eu creei este pop-up nova. Nós imos volver ao que significa delegado despois, e agora quero dicir que quero que este método a ser despedido cando presione o botón, entón eu vou volver para o meu storyboard, e quero agora engadir este IBAction. A primeira cousa que quere facer é premer no botón. Ao premer este botón quero que algo aconteza. Eu non vou soster para baixo control. Eu estou indo para premer e arrastrar a partir do botón para aquí onde di View Controller. Podemos ver que ben se acende. Se eu deixar de ir co meu rato agora teño ese pop-up aquí onde eu teño algunhas opcións. Unha delas son os eventos que eu poida rexistrar. Estes son todos os métodos eu declarados no meu arquivo h como IBActions. Isto é debido a Xcode sabe o que debe aparecer nesta lista pequena, de xeito que é só unha suxestión. Se eu premer no botón premido, eu agora rexistrou o manipulador de eventos. En JavaScript que tiñamos que dicir que eu teño un código que rexistrou o manipulador de eventos. En Objective-C foi realmente así tan fácil. Se eu executar este novo agora cando presione o botón meu manipulador evento vai ó lume, e eu vou incorporarse este pop-up. Super, super sinxelo alí. Se queres ver todos os eventos que acontecen a ser rexistrado nun compoñente si premer neste botón e eu vin aquí para o lado dereito primeiro pode ver aquí o que podo facer cousas como o tipo de botón, entón se quere un deses, eu ou o botón Engadir contacto ou o que quere. Se queres ver todos os eventos que están neste botón se eu vir ata aquí para o lado dereito podemos ver aquí os eventos que teño todos eses eventos diferentes. Eu podo premer o botón, cando deixar de ir ao botón, cando dobre da billa ou o que sexa, e aquel que eu só rexistrado é este evento chamado Touch Up Inside, e este di que, así como o meu dedo sae o botón que o evento vai para o lume, e é exactamente iso o que aconteceu. Este é o tipo de evento de botón estándar presionado. Todas as preguntas ata agora? Ok, é así que podemos comezar a conectar as cousas no noso código en cousas dentro da nosa interface. Lembre, o primeiro que tiñamos que facer era atopar o código, e, entón, con fío a interface co código, e non é o noso primeiro programa. Ok, iso foi moi legal, e creamos este botón. O que non se quere ter para crear un grupo de propiedades representando estes botóns? Por exemplo, no Tic Tac Toe teño 9 botóns, e que sería super, super aburrido ter que arrastrar e soltar 9 veces ou se eu tivese que facer Tic Tac Toe con 81 en vez de 9 e eu tiven que arrastrar e soltar 81 veces, e iso é ridículo. O que podemos facer é no canto moi como un HTML cando tivemos cousas como IDs e nomes e podemos buscar cousas pola súa identificación, hai unha noción similar no IOS chamados etiquetas. Unha cita é simplemente un identificador numérico único para un compoñente. Se eu dixer que este ten unha marca de 0, por exemplo, se eu crear un botón e darlle unha marca de 0, e imos ver como facelo en só un segundo, se eu queira obter ese botón podo simplemente dicir que eu quero chamar o, viewWithTag método no obxecto aquí o self.view, que representa a pantalla actual, por exemplo. Se eu chamar ese método viewWithTag, eu vou tirar o botón coa etiqueta 0. Imos dar un ollo neste edificio por Tic Tac Toe. En primeiro lugar, este é o meu storyboard. Eu creei estes 10 botóns da interface de usuario. Teña en conta que son todos do mesmo tamaño. Se eu premer nun deses e eu volvo aquí deste lado dereito vai ver que eu axustada a fonte aquí, entón eu fixen a fonte un pouco maior, pero o que eu tamén fixen foi axustar esa etiqueta. Eu dixen que iso ten unha marca de 1, e esa é a parte superior esquerda. Agora, se eu premer en outro botón, como este segundo aquí, agora vai ver que a miña marca é 2. Cada unha destas teclas só ten unha marca única, e por iso este é máis tarde como eu vou comezar a interactuar co meu programa. Isto todo é dentro dun controlador de vista, pero aquí é o que temos. Temos tres propiedades aquí. O primeiro e último van representar o estado do meu consello. Basicamente, este primeiro é unha matriz que representa, onde os Xs e Os son. Este outro aquí dinos quen é a quenda. Vostede vai entender que eu tamén teño estas cousas aquí. Antes, cando declarou propiedades que lles deu un nome e un tipo. Podemos tamén dar-lles unha información adicional aquí. Este primeiro di non atómica, eo que iso di é basicamente o único que nunca vai ser tentando acceder a este variable de cada vez. Vostede podería facer aplicacións máis complexas que son multi-Threaded, e así volta Scratch tivemos temas diferentes, e sprites diferentes podería facer cousas distintas ao mesmo tempo. Se ese non é o caso, que non é en calquera cousa que nós imos estar mirando, se dicimos que non atómica que realmente vai facer as cousas un pouco máis rápido. Tamén temos esa cousa chamada assign, forte ou débil. Esta asignar só di que este é un tipo de patrón. Este non é un obxecto ou un punteiro porque este é só un bool, para bool está construído en Objective-C. Este di que non tentar facer algo extravagante co punteiro aquí. É un Scale idade regular. Fortes e débiles, este feble di que, en realidade, Eu quero que isto sexa a apuntar cara algo no controlador de vista. Eu non estou indo para realmente reservar ou init iso mesmo. O constructor de interface, cando executar a aplicación, vai tratar con toda a inicialización iso. Se eu digo feble, que di que alguén vai estar creando iso. Se eu dixer forte, este di que eu vou ser o único que está creando ese obxecto bordo, e por iso aquí eu teño métodos máis algúns aquí, por exemplo, unha acción para que o botón é presionado novo xogo, unha acción para cando calquera dos outros botóns son presionados, e et cetera. Non imos entrar moito da lóxica de Tic Tac Toe, aínda que sexa moi emocionante, pero imos dar un ollo algunhas das cousas que podemos facer dentro do IOS. Este método novo xogo vai ser despedido cada vez que preme o botón novo xogo. Para conectar-se de que eu simplemente vir ao meu storyboard. Prema no novo xogo. Se eu vir aquí para a dereita podo ver que Preme Up Inside está conectado ao método NewGame. É por iso que este vai ser despedido. O método NewGame vai facer algunha configuración. Vai dicir que quero que limpar o estado da tarxeta. Este é un método agradable en mutables matrices. Isto vai dicir que é agora a quenda de X, e agora eu vou aproveitar esa cousa viewWithTag. Sei que os meus botóns teñen as marcas 1-9, e iso é algo que eu arbitrariamente escollido. Se eu queira facer que o texto de cada botón para estar baleiro porque eu comecei un novo xogo e eu non quero ningún XS ou os para sobrar podo facer iso. Eu podo dicir que quero a vista coa tag, 1, 2, 3, 4 etcétera. Isto vai tirar un botón diferente cada vez. Aquí eu vou lanzalo aos UIButton. Así como nós poderíamos lanzar ints para coches alegóricos e viceversa este di que quero lanzar a un UIButton. Isto significa que o tipo de esta será a * UIButton porque punteiros, pero non se preocupe, non son asustado máis. Unha vez que eu teño ese botón que eu vou chamar un método nel. Este método chámase setTitle forState, e por iso este di Eu quero configurar o texto do botón para ser a cadea baleira, e quero que sexa a cadea baleira cando non está presionado. Se eu estou usando este método, podo cambiar o texto do botón así que alguén chega, pero queremos dicir cando o botón é só sentado alí Eu quero que o texto en branco. Finalmente, imos iniciar o meu consello, e vou dicir que todo está actualmente a 0, de xeito que este membros do consello inmutable é unha matriz mutável, o que significa que podo chamar o método addObject e só dentro dun 0 del. Isto é o que acontece cando crear un novo xogo. Imos dar un ollo a outro. Este método aquí é o IBAction que vai ser presionado cada vez que un dos cadrados é presionado. Agora temos unha lóxica Tic Tac Toe aquí. Nós descubrir quen é a vez, e en base a que sexa definido un X ou un O, pero entendemos que estamos reutilizar este mesmo manipulador de eventos para cada un destes botóns. Isto significa que eu non teño un método para o botón superior esquerdo, un método diferente para o botón inferior dereito, a pesar de que eu podería ter feito isto. Isto non sería realmente un bo deseño. O que eu estou facendo aquí é que eu estou indo realmente para determinar o que a etiqueta do botón que foi presionado é. Vostede entende que este método de reprodución ten un argumento. É chamado de remitente, eo que é remitente é remitente vai representan exactamente o que foi tomado medidas enriba. Se eu premer un botón, este remitente será que UIButton I, en realidade, que preme, o que significa que esta UIButton ten unha marca porque eu creei unha etiqueta. Se eu queira chegar á marca que podo simplemente dicir Eu quero a etiqueta do remitente, e de novo, eu só fundido a un UIButton. Acontece que sei que o remitente será un UIButton. Non sempre ten que ser un UIButton. Eu podería, por exemplo, rexistrar o mesmo manipulador de eventos  para un a un botón, unha por unha barra. Neste caso, eu sei que eles están todos os botóns, entón eu vou dicir Eu quero que este sexa un botón, e entón eu podo obter a marca, e da marca agora sei onde estou dentro do consello. Entón eu podo simplemente definir X ou O, pode virar a quenda, comprobar quen gañou, etcétera. Calquera dúbida sobre iso ata agora? Ok, todo o código que publicou online-non quero entrar moi da lóxica de Tic Tac Toe, pero agora podes ver que realmente todo o que estamos facendo é que estamos looping sobre esta matriz, por iso temos un par de loops aquí, e nós estamos só comparando a ver temos un partido en todas as liñas, un xogo nunha columna ou algo así. Para realmente executar este programa, se eu tocar nun dos botóns que o método de xogo foi despedido, o que significa que só definir o botón para ser un X, entón agora este botón será un O, e así por diante, e é así que estamos empezando a interactuar con esta aplicación única páxina. Imos publicar o código, entón Sinto-se libre para examinar que, pero imos agora falar sobre algunhas aplicacións que son máis que unha páxina. Tan emocionante como Tic Tac Toe foi, unha morea de aplicacións dentro do IOS son estes tipo de detalle cousas con múltiples pantallas. O primeiro concepto que imos ter que falar son protocolos, é un protocolo é simplemente un conxunto de métodos que pode prometer para definir. Se eu crear este novo protocolo con dous métodos, este primeiro, o tipo de retorno é void, eu chamei foo. El non ten argumentos. Eu teño un outro método. El retorna un int. Chamei-bar e ten un argumento. Todos protocolo é dicir que se chama SomeProtocol-se aquí, este é un xogo de cousas que alguén pode aplicar. Eu non dentro deste protocolo, dixo que foo fai. En vez diso, eu só estou dicindo que podería definir foo se queres. Se eu estou creando un controlador de vista ou a creación dunha clase Podo dentro desa promesa clase para aplicar algúns destes métodos, así, por exemplo, dicir iso agora di que eu estou facendo unha promesa a vostede que dentro desta clase controlador de vista eu vou ter definicións para ambos foo e bar. Por que iso é útil? Unha morea de compoñentes dentro do IOS aproveitar esta nivel de proxecto chamado delegación, e que di delegación é que, por exemplo, eu teño unha caixa de texto e existen algúns eventos que poderían ser rexistrados na miña caixa de texto, en vez de crear eventos separados que podo facer é o que podo dicir o delegado da caixa de texto será un obxecto. Cando digo que este é un delegado agora que significa que sempre que algún evento sería destituído no cadro de texto en vez de ter que rexistro-lo ou algo así el só vai chamar a un método no delegado. Por exemplo, dentro da miña caixa de texto Eu teño un método para cando prema que fixo botón no ángulo inferior dereito, e así, en vez de rexistrar manipulador de eventos o que podo dicir é cadro de texto, aquí é un obxecto que quero que chamar un método en Cada vez que alguén presione o botón Done, e iso significa que ese obxecto ten que aplicar algún protocolo que di que eu prometer para definir que acción do botón feito, porque se non define este método e que prima Completar a continuación, que vai ser confuso. Imos dar un ollo a un exemplo. Aquí eu simplemente ten unha caixa de texto, e unha das propiedades desta caixa de texto por aquí deste lado dereito é o delegado. Esta é unha propiedade da clase. O que eu fixen aquí é que eu controlar premendo, e eu arrastrei a partir deste punto aquí ao controlador do punto de vista, e que agora di o delegado da caixa de texto vai ser o controlador de vista. Isto significa que, cando algunhas accións acontecer, en vez de rexistrar manipuladores de eventos separados que quero que envíe ao delegado. Agora imos dar un ollo no meu controlador de vista. Dentro do arquivo h. Fixen unha promesa. Eu prometín para aplicar algúns métodos dentro deste protocolo chamado UITextFieldDelegate, e de novo, esta é só unha lista de algunhas cousas que podo escoller para aplicar. Se eu vir aquí no meu arquivo. M, eu apliquei un tal método. Eu chamei el textFieldShouldReturn porque iso é que el foi chamado dentro do protocolo. E agora cada vez que preme o botón feito dentro do campo de texto iso é o que vai pagar, entón eu non rexistrar un manipulador de eventos. Liguei o delegado e sempre que este evento é disparado Este é o método que será chamado, entón eu vir aquí ao meu storyboard e executa-o- mentres que a está cargando podemos ver que iso fai. Na miña pantalla eu teño 2 cousas. Eu teño ese campo de texto, e eu teño este rótulo. Estou simplemente dicindo que quere que o texto deste rótulo ser igual a calquera que sexa o usuario escriba no interior do campo de texto. Esta liña aquí é simplemente un método que eu estou chamando no campo de texto que di que quero que ocultar o teclado. Este é só o método arbitrario que Apple escolleu. Unha vez máis, antes de facer calquera cousa que eu tiña que conectar todo, entón eu cheguei aquí. Do controlador de vista eu arrastrar ata a caixa de texto. Eu deixar de ir, e eu podo ver aquí que podo facer iso a propiedade de campo de texto dende aquí no controlador de vista eu define unha propiedade que é un IBOutlet dun campo de texto. Este di que podo conectar esta propiedade se a un campo de texto no meu UI. Agora, cando clic iso podo comezar a escribir. Agora, se eu premer no botón feito isto vai disparar un evento que agora podo responder. Non manipuladores de eventos. É así que eu só respondeu a ese botón feito. Ten sentido? Este non é un patrón de deseño que-non pode nunca atopar-se crear o seu propio protocolo, pero só sei que algúns distintos compoñentes IOS rexistrar eventos de diferentes xeitos. Botóns, por exemplo, usar esas IBActions. Campos de texto, por outra banda, van usar delegados. Podemos ver e pode ollar todo isto dentro da documentación. A propósito, hai realmente unha tonelada de cousas UI construído no IOS para ti, así, por exemplo, a forma que eu fixen que din feito na parte inferior dereita é Selecionei este campo de texto. Eu vin para aquí. Eu rolada para abaixo un pouco para voltar clave, e podo realmente facer iso unha morea de cousas, como se eu quero que dicir chamada de emerxencia cando podo facer iso, que é totalmente aleatoria, e eu non sei por que non hai un built-in botón de chamada de emerxencia, pero alí, el di que chamada de emerxencia en letras moi pequenas. Alí vai. Definitivamente explotar todos eses diferentes opcións no IOS. Calquera dúbida sobre os delegados? Unha vez máis, só un patrón de deseño interesante que ten que ser consciente. Ok, imos dar un ollo xunto coa vista da táboa. A vista de táboa é basicamente que a lista de elementos que está en todo o lugar no IOS. Cando está follas todos os seus contactos, está mirando a páxina de configuración, e este tipo de lista de cousas é chamado de visualización de táboa. Implantación dunha exhibición de táboa no IOS é ben sinxelo. En vez de facer unha clase que descende do que UIViewController como xa fixemos antes, nós simplemente necesitamos dicir, en vez de todo o que un UIViewController non quero facer, Digo todo o que un UITableViewController non quero facer, de xeito que simplemente engade algunhas cousas adicional que son totalmente feito por nós. Necesitamos facer moi pouco para, basicamente, encher os espazos en branco dentro da táboa. Co fin de presentar unha táboa que eu teño responder algunhas preguntas. A primeira pregunta que eu teño responder é cantos puntos están sobre a mesa? Cando está follas o seu programa de contactos notarás que é unha especie de organizado polo Como, entón tes o BS, e ten que cabeceira pouco sub. Cada un destes é chamado dunha sección. Pode ou non ter destes. A primeira cousa que cómpre facer é aplicar un método chamado tableView: numberOfSectionsInTableView. Que simplemente amosa cantas seccións que ten, de xeito que este puidese dicir voltar un, se ten unha vista de táboa grande. A seguinte pregunta que o IOS precisa saber é cantas liñas ten? Por exemplo, se está follas unha exhibición de táboa. Vostede ten un número fixo de música que está mirando ou un número fixo de contactos. Se vostede é eu, por suposto, non é moito, e é así que o IOS sabe cantas células que amosar. Unha vez máis, isto podería dicir algo así como retorno 3. A miña visión táboa ten tres liñas. Finalmente, o IOS precisa saber o que cada célula parece, Entón, o que realmente vai facer é chamar ese método aquí, este tableView: cellForRowAtIndexPath. Vai chamar ese método en cada célula dentro da súa táboa. Como el sabe cantas veces a chamalo? Ben, dixo que dentro do número de liñas en sección. Imos chamar iso en cada unha das nosas células, e dentro deste é onde pode realmente facer cousas como definir o texto ou dicir-lle o que iso pequeno botón azul no lado dereito fai. O estándar para a obtención destas células, imos usar este método chamado dequeueReusableCellWithIdentifier. Objective-C é realmente moi coñecido para a duración ridícula dos seus nomes de método, e este é realmente un caso agradable no exemplo punto. O que este método fai é este só di que quero que me dea unha célula. Só unha cousa IOS. Se tes algo como 100 mil cancións no seu iPod o IOS non quere facer é reservar 100.000 células, porque se está na parte superior da súa lista, realmente precisa para reservar memoria para a célula que é 99.000 liñas para abaixo? Non, porque como está rolando pode tipo de reservar como vaia xunto. Isto é feito para ti. Non ten que preocuparse con todo o material de rendemento que estúpido. Todo o que di é que chamar este método dequeueReusableCellWithIdentifier, e este di, todo ben, se precisa eu vou crear unha nova célula para ti. Pero se está no fondo da táboa e xa alocados algunhas células na parte superior da táboa que realmente non vai ter tan cedo Vou dar-lle un destes de volta en vez de reservar un novo, e por iso esta é unha preocupación rendemento agradable. Non ten que reservar as células-se. Isto vai dar de volta dunha célula. El vai voltar a vostede un obxecto de célula. Despois de ter o obxecto de célula que podes facer cousas para el. Pode configurar o texto de cela con esa propiedade chamada etiqueta de texto. Podes engadir a frecha á dereita ou algunhas outras cousas aleatorias con esta outra propiedade chamada accessoryType, e así por diante e así por diante. Imos dar un ollo a realidade implementar unha exhibición de táboa agora. Cando creei este proxecto en vez de dicir aplicación única visión que realmente vin aquí a mestra-detalle de aplicación, e por iso, basicamente o que corresponde ao programa de correo electrónico no iPad coa exhibición de táboa á esquerda e, a continuación, o contido da dereita. No iPod ou iPhone que vai corresponder a unha visión única táboa. É onde eu teño o meu código de inicio. Imos primeiro un ollo no storyboard. Todo iso foi feito por min, basicamente creado. Esta barra de navegación me mostrou o que unha célula exemplo pode parecer, e eu facer clic dúas veces tanto, cambiar o título. Os problemas UI outros podo tratar alí. O ficheiro de cabeceira parece moi sinxelo. En vez de dicir isto é UIViewController agora estamos dicindo que este é un TableViewController, polo que sabemos que queremos chamar todos os métodos da táboa. Seguinte Quero crear unha propiedade que vai representar as cousas dentro da miña mesa. Esta táboa será amosar arbitrariamente unha lista de froitas, e entón eu preciso crear algunha matriz en que eu poida engadir froitas. Dentro do meu arquivo de aplicación, a primeira cousa que quero facer é que quero que seguro que eu arrincar esta matriz. Eu dixen alloc init, creei a miña matriz de froitas, e eu estou engadindo 4 cousas para el, un dos cales é moito máis controvertido do que os outros 3. E agora eu teño unha matriz de tamaño 4. Estamos axitando-se no CS50. Agora teño unha matriz de tamaño 4. Agora eu vou comezar a responder a estas cuestións, e en realidade, cando eu creei esta aplicación todo isto xa foi feito por min. Eu non teño que escribir o número de seccións en vista de táboa. El xa estaba alí, e eu estou cubrindo os espazos en branco. Cantas seccións que eu teño? Un Todo feito. Cantas liñas que eu teño? Ben, eu teño unha liña para cada froita para esta conta é unha propiedade de calquera matriz que di o quão grande é isto? Ese é o número de liñas que eu teño. Finalmente, eu teño que dicir que é o que cada célula se parece? Eu vou dicir dequeueReusableCellWithIdentifier. De novo, iso xa estaba escrito para min. Eu non teño que facer iso mesmo, e quero volver Esta célula neste lugar. Lembre que estamos chamando este mesmo método en todas as células, e este argumento aquí, ese argumento indexPath, di o que eu estou dentro da liña Se eu dixer indexPath.row aquí Isto pode 0, entón el ha ser 1, entón el ha ser 2, e este é entón sei o que eu estou célula que está mostrando. Eu quero configurar o texto de cela usando esta propiedade TextLabel para ir dentro da miña matriz froitas e obter o obxecto correspondente a cada liña. Se esta é unha secuencia, agora estou definindo a propiedade de texto para unha cadea. Eu podo facer outra cousa. I tamén pode rexistrar-se un procesador de eventos en cada unha das células, entón cando tocar cada unha desas células este didSelectRowAtIndexPath, iso vai ser chamado para min, tan simplemente definindo iso eu agora pode manexar o que acontece cando toca unha célula, e, de novo, estamos pasando cal célula foi aproveitado para que poidamos reutilizar ese mesmo manipulador de eventos para todas as nosas células. Unha vez máis, iso é algo que o IOS está facendo por min. Imos mostrar un outro pop-up irritantes que simplemente di que colleu algo en algo que vai ser o obxecto de liña. Cando executo iso, eu vou ter esa visión boa mesa cunha liña para cada un deses froitos, e eu tocar un dime o que pasou. Ten sentido? Imos construír un pouco máis complexa dunha aplicación, tanto como escolleu premendo tomate é. A parte agradable sobre o storyboard é que non só vai axudar-nos a proxectar pantallas individualmente, Tamén vai axudarnos a unir a nosa aplicación enteira de xeito que a aplicación final que vai ser este edificio é agradable deportes lector de noticias, e así vai ter varias pantallas, e para que eu poida realmente representar cada unha desas pantallas múltiples no storyboard, e podo diminuír o zoom e ver o meu programa a partir dun nivel elevado. Co fin de crear un novo elemento dentro do meu storyboard é realmente sinxelo dentro Interface Builder. Se eu queira engadir outra pantalla para iso, por exemplo, Podo primeiro zoom co zoom pitada de que Apple tanto ama, e aquí antes de buscar un botón e eu arrastrar e soltar un botón se eu queira crear unha nova pantalla que eu poida realmente pode arrastrar e soltar un controlador de vista enteira, entón se eu incorporarse iso, puxe-aquí, hey, hai outra pantalla, e agora usando este ficheiro storyboard mesmo Eu podo ter todas as pantallas dentro do meu programa, e podo reducir e ver como interactúan. Estes non van interactuar aínda. A forma en que estas dúas pantallas interactúan é definir relacións. Basicamente pode dicir que esta pantalla, ao premer este botón, Eu quero que deslice cara esta nova pantalla. Isto significa que non hai este tipo de relación entre  a primeira pantalla e na segunda pantalla. Ten basicamente unha frecha que o botón para a segunda pantalla dicindo que cando prema este botón que é onde quero ir. Así coma nós controlamos premendo e arrastrado para definir eses establecementos imos facer o mesmo para definir eses segues. Imos ver un exemplo para que, e antes de que a transición de feito a partir dunha pantalla a outra IOS é bo o suficiente para chamar ese método prepareForSegue chamado, e é aí onde podemos empezar o envío de datos a partir dun programa a outro. No exemplo que estamos a piques de ollar para el, basicamente, permitir-nos para filtrar equipos de béisbol polas ligas e divisións. Cando selecciona unha liga, por exemplo, quero facer a transición a miña seguinte pantalla onde eu poida amosar todas as divisións nesa liga ou todos os equipos diferentes. Eu teño enviar á pantalla o que os equipos que debe amosar. Para iso vou aproveitar este método aquí. Por fin, só un punto ao chou no IOS. Se desexa almacenar datos hai esa cousa chamada de datos básicos, que en realidade é medio complicado de traballar. Tamén pode usar SQL para almacenar datos, que, de novo, é bo, pero o tipo de no lado máis complicado de traballar, pero IOS tamén soporta estas cousas moi legal chamado listas de propiedades, e unha lista de propiedades é só un ficheiro que representa pares de valores clave. Vostede define unha lista de chaves, e di esta chave vai ser un array. Esta chave vai ser unha cadea, e basicamente calquera cousa que podes facer en JSON que podes facer dentro dunha lista de propiedades, e por iso está realmente moi ben nos permite traballar con algúns datos. Por exemplo, eu teño esa Teams.plist que eu creei. Eu creei un arquivo plist novo, e podo detallar. Trátase de un dicionario, este é un dicionario, son cadeas de caracteres, e por iso esta é unha boa representación gráfica dun documento JSON ou só un conxunto de pares de valores clave, e por iso este é o dato que eu vou estar traballando co interior do meu programa. Imos primeiro en chegar aquí. Temos arquivos moito máis agora. Pero primeiro imos vir aquí para o storyboard. O storyboard aquí, se podo afastarme agora podemos ver que este é o fluxo do meu programa. Estou indo primeiro para comezar nesta pantalla. Vou detallar a este pantalla, e eu estou indo a detallar a esta pantalla, e podemos ver aquí que eu tipo de mover un deles en torno a nós esas frechas vai aquí ata aquí, e do xeito que eu definir a frecha era eu ampliar un pouco, e se eu vir a este controlador de vista, e aquí está unha célula, e quero dicir que cando toque dunha célula Eu quero que desprazar sobre a outra pantalla. Podo simplemente Manteña o control, rolar un pouco, manteña o control, arrastrar esta célula máis e deixar ir. E aquí podemos dicir que é a transición que quere usar? Quere usar esa cousa diapositiva que se chama impulso? Queres desprazar cara arriba a partir do fondo? Iso é chamado de modalidade. E unha vez que eu premer nun deles, que vai sacar esa frecha para min, e iso significa que eu realmente tratado o que ocorre cando premer este botón graficamente. Eu non escribir calquera código para realmente desprazar unha pantalla para a próxima. Eu define iso visualmente dentro Interface Builder. Se eu premer nesta frecha, podemos ver que eu dei esa cousa dun nome. Chameino showDivisions, e iso é para que eu poida saber que a transición está a piques de ocorrer, e imos ver por que, en só un segundo. É así que eu teño con fío ata as distintas pantallas no meu programa. Se este fose un botón, por exemplo, en vez de unha vista de táboa, Eu podería controlar prema no botón, arrastra ata a seguinte pantalla, e é así que eu poida facer camiño de navegación que. Moi rapidamente, se nós entrarmos na MasterViewController, de novo, nós estamos indo simplemente para definir unha lista de cousas que será amosado na pantalla de táboa. Aquí estou dicindo que eu quero que tome este ficheiro plist, e quero que poña o nun dicionario, e unha vez que ten que dicionario, eu vou responder a esas mesmas preguntas novo. Aquí está o número de seccións. Un, hai unha liña para cada liga, eo texto de cada célula ou debería ser a primeira, a primeira liga, a segunda liga, e así por diante. Finalmente, eu vou usar este método que acabamos de ver chamado prepareForSegue, e este é o método que vai ser accionado cando clic nunha desas liñas e, polo tanto, activando esta transición que eu crear as frechas. Isto está dicindo que eu podo ter varios relacións de unha pantalla a outra. Se eu tivera dous botóns e cada botón leva a unha pantalla diferente Vou ter dous segues, un para cada botón. Pero esta prepareForSegue é, de novo, vai ser reutilizada para cada unha das diferentes relacións, o que significa que precisan dunha maneira de identificar se prema o botón primeiro ou prema o segundo botón. Lembre-se de que cando eu dei Segue un nome, este showDivisions, é así que eu agora sei que este é o Séguese que foi activado. Todo o que quero facer é que quero dicir Eu quero descubrir o que eu bater, e así conseguir isto, podo dicir que quero o indexPath para a liña seleccionada, lembrar o indexPath só di onde prema, e entón eu quero dicir que quero descubrir onde estou indo. Este destinationViewController, que é unha propiedade do xeito. Esta é a pantalla que eu vou, entón eu sei que a pantalla vou chámase DivisionsViewController porque eu creei esta clase, e agora eu dixer d.divisions Estou agora a definición dunha propiedade do controlador de vista que estou a piques de ir. Isto é como eu estou enviando datos dunha pantalla a outra pantalla. Basta ollar para esta DivisionsViewController podes ver aquí que no arquivo h. hai que as divisións de propiedade, e é iso que eu estou basicamente cubrir, entón é así que eu sei que eu estou mostrando as divisións que corresponden a a liga que prema, e de novo, o punto de vista da táboa actual parece practicamente o mesmo, só respondendo 3 preguntas sinxelas, así como a identificación o que ocorre cando se move á seguinte pantalla. Só un par de outras cousas aquí. Vostede entende arriba aquí que en vez de dicir # include Estou dicindo agora # importar. Esta é só unha cousa Objective-C. A importación é basicamente unha versión máis agradable de inclusión, e, por exemplo, necesitamos saber o que esta clase é, por iso non podo só dicir DivisionsViewController. Se non hashtag dentro standardio.c do noso arquivo c. o compilador non tiña idea do que era printf. Do mesmo xeito, se non me importar o DivisionsViewController o compilador realmente non ten idea do que é un DivisionsViewController. Só asegúrese de que dentro dos seus arquivos diferentes. M que garantir a importación os arquivos correspondentes. h para que o compilador sabe o que está a suceder. Finalmente, o que Apple finalmente fai é presentar algúns datos usando unha visión web e así unha visión da web é un obxecto no que pode introducir un navegador pouco dentro da súa aplicación. Todo o que cómpre facer é fornecer un URL para o seu navegador, entón eu quero ir a mlb.mlb.com, e é así que eu podo acceder á páxina de inicio de cada equipo, e entón polo paso neste URL a exhibición da web pode amosar isto para min, e podo navegar ao redor, e simulador está en uso por aquel. Agora, iso veu da miña plist. Se eu premer nese presente tamén veu do meu plist, e este deslizamento foi tratado definindo os segues. Clic iso e máis, e agora aquí está a miña UIWebView, así como que aquí está o sitio para a URL que eu só incorporado, e eu non ter que tratar con calquera cousa tola. Esta é a forma de mostrar unha páxina web. Cousas como este botón volta aquí tamén se dan a min totalmente de balde, porque eu xa definiu estas relacións mediante segues. Algunha pregunta? Si [Estudante] Entón, cando usa alloc, vostede non ten a nada libre? Exactamente, cando chamar alloc e init non ten para liberalo la. IOS vai tratar con todo isto para ti. É marabilloso, e non está batendo ningunha regra. Si [Estudante] Se fose para incluír máis equipos que poderían caber na pantalla, sería automaticamente ten unha opción de desprazamento, ou é algo que precisa engadir? Exactamente, se eu tivese máis equipos, por exemplo, sería tratar automaticamente a rolagem para min, e todos os problemas de rendemento coa enorme mesa tamén están feitos totalmente por min. Outras preguntas? Todo este código vai ser posta. Nós medio que encuberto un pouco dos detalles máis pequenos, pero cousas como establecer algunhas propiedades para a exhibición da web son só cousas que podes obter a través do seu navegador de documentación de Apple, o que é realmente, realmente moi ben definidos. Teñen unha chea de aplicacións de mostra e exemplo usos de APIs diferente, entón definitivamente ler os se poida. Só algúns enlaces útiles que pode querer dar un ollo. Estas son algunhas guías de documentación á man. As URLs son enormes, polo que son acurtados. Este primeiro é toda a biblioteca de documentación. Hai barras de investigación pequenos, entón comezar a escribir o botón vai comezar a dar-lle toda a información sobre todas as cousas que podes facer con un botón. Eu tamén incluíu a Táboa de guía de programación View. El trata sobre vistas de táboa moito máis detalle, como facer as cousas como engadir dinámicamente ou células editar ou borrar. Hai moitos programas de mostra de Apple que vai amosar como facelo, e, finalmente, este último é o Human Interface Guidelines, e iso é basicamente unha discusión de compoñentes de interface de usuario, cousas como non facer un botón que é 4 píxeles por 4 píxeles. Iso é unha mala idea, e outras cousas que Apple quere que faga fomentar a boa concepción. Calquera dúbida últimas antes de rematar? Todo ben, Sinto-se a liberdade definitiva para-nós estamos indo ter etiquetas especiais para discutir. Nós imos ter un IOS un, para sempre sentirse libre para usar isto. Se queres traballar cos seus compañeiros de clase en proxectos ou axudar a descubrir algunhas cousas IOS aleatoria Sinto-se libre para me e-mail, e, en definitiva, ler todo en liña o código porque só no interese de tempo que tipo de encuberto máis detalles máis finos grans de cousas. Pero se non, entón boa sorte nos seus proxectos de IOS, e espero que teñamos un gran fluxo de aplicacións na App Store. [CS50.TV]