[Powered by Google Translate] [Семинар] [IOS: Написание приложений, таких как Boss] [Tommy MacWilliam] [Гарвардский университет] [Это CS50.] [CS50.TV] Ладно, все, добро пожаловать в IOS: Написание приложений, таких как Boss. Этот семинар будет сосредоточиться на написании приложений для iPhone и в свою очередь написания приложений для iPad, и поэтому мы в основном будем ходить через несколько различных примеров того, как сделать приложение, простой игре, как Tic Tac Toe, или если вы больше заинтересованы в создании приложений, как своего рода чтения новостей или что-то, что взаимодействует с интернетом я буду говорить о том, что, как хорошо. Вот наш краткий повестки дня. IOS приложений написаны на языке, называемом Objective-C, и таким образом, это немного похож на C, но на самом деле не на всех, таким образом, мы будем говорить немного о самом языке , а затем, как построить iPhone приложения с помощью этого приложения программа под названием XCode, которая, если вы еще не загрузили его еще, не стесняйтесь, чтобы начать загрузку сейчас. Это несколько гигабайт. Она должна быть свободна от App Store, так что вам необходимо иметь Mac идеально работает под управлением последней версии OS X. Если вы не, не проблема. У нас есть компьютеры Mac в научном центре в вашем распоряжении с XCode установлен, и поэтому не стесняйтесь использовать их для развития. Если вы хотите, чтобы приложение, но не имеют Mac, не волнуйтесь. Там есть много кампуса ресурсов для этого. И тогда мы собираемся охватить 2 больших примеры различных приложений, которые вы можете сделать. Objective-C является технически то, что называется супер набор C. Это означает, что любой код C справедливо и Objective-C код. Это означает, что мы как бы изолирующую пленку на некоторые дополнительные функции C. Некоторые из этих функций включают в себя не того, чтобы когда-нибудь написать таНос раз, слава Богу, не беспокоясь о тех глупых указатели и освобождая их и все такое Вы ненавидел C, и это отчасти пошли в Objective-C. Теперь, Objective-C также имеет гораздо больше стандартной библиотеки, так что есть намного больше функциональных возможностей вы получаете бесплатно внутри Objective-C. Помните, когда мы писали PHP мы заметили, что мы перешли от это наименьший язык гигантские библиотеки все эти сумасшедшие вещи, которые вы можете сделать. То же самое происходит в IOS. Там в объекты для таких вещей как календарь буддист, и действительно ничего возможно, вы можете думать, вероятно, уже существует в реализации Objective-C. Объективная сторона Objective-C ссылается что-то называется объектно-ориентированное программирование. Это своего рода новая концепция, но мы на самом деле главным образом узнал, Многие из этих концепций уже. Идея объектно-ориентированного программирования является то, что вы будете структурировать Много кода вокруг этих вещей, называемых классами, и эти классы действительно прославил структур. Внутри структуры, мы в основном здесь сказать, это вещь, и эта вещь может иметь членов. Например, узел связанного списка может есть другие вещи, как значение, указатель на следующий узел в списке, и вместе, что указатель, и это значение состоит этот экземпляр структуры. Классы очень похожи, за исключением Классы также могут иметь функции внутри них. Когда мы объявили структуру, мы можем только сказать, Int N или узла * следующий. Теперь с Objective-C мы действительно можем положить функции Внутри этих вещей. Другое дело, что классы могут сделать это они могут наследовать данные из других классов. Например, мы будем смотреть на кучу встроенных в Objective-C классы. Один из них может быть класс, который представляет вид на экране, и это, говоря, что я хочу, чтобы реализовать мою собственную точку зрения мы в основном говорят, что кто-то более на Apple, вероятно, действительно хорошие люди, написал этот класс для меня, и он обрабатывает такие вещи, как отображение кнопок или оказание экране, и мы бы очень больно реализовать все, что функциональность самих себя, и так просто наследование данных, мы можем сказать, что все, что вы сделали в этом классе Я также хочу внутри моего класса, а затем я собираюсь сделать некоторые другие вещи, а именно осуществление приложение. Это то, что это слово означает наследство. Мы увидим более конкретный пример. И, наконец, ключ с объектно-ориентированного программирования является то, что это приводит к инкапсуляции данных. В некоторых из наших проблемой задает мы могли бы иметь эти большие, глобальные переменные и глобальные везде, и это, как мы бы отслеживать состояние. С классами мы можем начать инкапсуляции информации внутри объекта. Если у нас есть один экран на наше приложение, мы действительно не нужно иметь каких-либо данных из другой экран в наше приложение внутри, что, и так путем инкапсуляции вещи в классах это на самом деле приводит чтобы лучше норм проектирования, а это возможно с некоторыми дополнительными функциями из Objective-C. Предупреждением, синтаксис Objective-C является бананов. Это все равно мы ничего не видели раньше, так что это немного кривой обучения привыкают к Какого черта это значит? Но как только Вы заканчиваете, что начальная кривая обучения, это очень, очень гладкая , чтобы начать писать программы. Чтобы объявить класс, если не сказать вот мой класс, он существует, и, возможно, здесь некоторые вещи, которые я собираюсь определим позднее, Я собираюсь сказать @ интерфейс. Я собираюсь сказать @ интерфейс. Я собираюсь дать моему классу имя. А потом где-то в другом месте я собираюсь сказать @ концу, и все между ними @ интерфейсом и @ концу будет мой класс. Это будет то, что внутри нашего. Файлов час. Так же, как в С нашим. Ч файлы в основном сказали, вот некоторые вещи, которые будут существовать. Я не обязательно говорю вам, что они делают, тем не менее, но компилятор должен знать, что они существуют. Позже внутри нашего. М. файлы, потому что м для Objective-C то, где мы на самом деле собираемся определить, что эти классы. Многое, как наша. Файлов с, при условии, реализация функций. Внутри нашей. М. файл, который мы собираемся сказать вот то, что все функции внутри моего класса, что они все делают. И, наконец, внутренней структуры, можно сказать, в тех фигурные скобки Int N или узла * следующий, и в Objective-C мы собираемся использовать ключевое слово @ собственности, и это то, что происходит, чтобы определить свойства, или не-функций, которые являются частью моего класса. Вызов функции в Objective-C также бананы. Когда мы объявили функций в C мы сказали что-то вроде Int Foo и открытой парень, а затем дал ему список аргументов. Это то, что объявив методы или функции выглядит в Objective-C. Если я хочу объявить функцию или метод где я говорю, что метод действительно просто функция, которая является членом класса, так вроде взаимозаменяемы, но не очень, так что внутри моего метода, я хочу создать новый метод. Он собирается вернуться ничего, так что это будет типа недействительными. Это возвращение типа моя функция. Теперь у нас есть скобки здесь, потому что, я не знаю. Далее будет имя моей функции, и, наконец, у нас есть точка с запятой, как мы имели в C. Что нового здесь этот парень здесь. Это дефис действительно необходимо, и что это говорит о том, что Здесь этот метод должен быть вызван на экземпляр класса. После того как мы заявили нашим структурам мы, вероятно, сказал что-то вроде: п структуры узла, и что на самом деле созданы или экземпляр одного из этих структур так, чтобы я мог фактически начать работу с тем, что внутри него, так что это Прочерк означает, что мы должны экземпляр класса, как мы экземпляров, что структура прежде, чем мы можем назвать этот метод. Если я хочу, чтобы начать добавлять аргументы мои методы это становится еще больше бананов. Вот мое имя метода. Тогда я буду иметь двоеточие, а после этого толстой кишки здесь говорится, приходит несколько аргументов. Этот метод принимает один аргумент. Типа его аргумента Int, и имя этого аргумента или переменная, которую я собираюсь начать использовать внутри метод называется я. Опять же, это метод. Она принимает один аргумент. Если вы хотите, чтобы начать добавлять больше аргументов он получает больше бананов В том, что мы эту толстой кишки, что говорит здесь приходит мой список аргументов. Это первый аргумент является целым числом. Теперь это второй аргумент интересно. Переменных, что я собираюсь использовать внутри моего функции называется F, так что внутри моего функции я могу сказать, F + = 1 или что-то. Эта вещь здесь в основном ключ для этого аргумента или параметра. Так же, как у нас было пар ключ-значение, а что-то вроде JSON или ассоциативные массивы Objective-C приняли решение сказать, ладно, просто так, что это действительно ясно При вызове метода то, что все эти параметры На самом деле я собирался назвать их всех. Когда вы вызываете метод, вы фактически говорите andFloat, и тогда вы будете проходить его дюйма Интересно, что этот человек не назвал, но все остальные параметры, так что если у нас был третий аргумент, который я мог сказать andFloat и еще плавать и так далее. Когда я называю эти методы это, конечно, бананы, так что если у меня есть объект, и я определил метод Foo, и я хочу его называть, а не говорить Foo открыть / закрыть скобки Я собираюсь открыть скобки. Вот имя моего метода. Я собираюсь закрыть скобку, и это является предметом Я звоню его. Помните, что все эти методы существуют внутри классов потому что классы могут иметь методы, определенные внутри них. Здесь я произвольно созданный объект некоторого класса, и это синтаксис для этого. Есть 2 шагов для создания объекта. В первую очередь сказать, что я хочу выделить пространство. Это эквивалентно таНос. Мы не должны говорить таНос больше. Мы бросили м, сделали его идентификатор, и заменил. С с. Метров. После того как мы Alloc то, что мы тогда должны инициализировать его. В основном, когда вы создаете объекты, которые вы, возможно, захотите иметь некоторую логику , который выполняется, когда они созданы, так что вы можете передать некоторые значения по умолчанию или что-то вроде этого, и поэтому этот метод инициализации является то, что на самом деле создает объект. Мы сначала выделить место, так же, как мы делали это в C, а потом мы его инициализации, которая может или не может сделать очень много. Затем мы возвращаем эту вещь в объект, о. Там есть звезда здесь, потому что это технически указатель, Но не волнуйтесь, указателей не то, что большая сделка в Objective-C больше. Теперь мы экземпляр этого класса называют NSObject, и это только случайное класса, Яблоко. Мы экземпляр этого, и теперь у меня есть экземпляр этого класса В этом объект О, так это значит, что, если я определил эти методы я мог бы назвать их, как это. Точно так же, если бы я хотел вызвать метод с одним аргументом, таким образом, это бар метод, который принимает один аргумент, и вот Баз: qux метод, так что это занимает от 2 аргументов. Это вызов одной функции на этом объекте °. Смысл? Синтаксис должно иметь смысл, но вы вроде привыкнуть к нему. Хорошо, давайте поговорим о нескольких вещах, которые встроены в Objective-C , которые не обязательно встроены в C. В C мы как-то имел дело со строками, как эти глупые массивы символов, и это стало действительно раздражает. Objective-C имеет те все построено в нас, и она построена в с помощью этого класса называют NSString. Когда я хочу создать NSString у нас есть более тайный синтаксис. Вместо того, чтобы говорить "CS50», мы говорим @ "CS50" и это только синтаксис для объявления строки в Objective-C. Это очень легко забыть, так не делают. Теперь, когда у меня есть, это строка, но заметил это действительно только объект. Я сказал NSString, который означает, что я экземпляр класса называется NSString, который написал кто-то другой для меня, и они были очень хороши об этом, и поэтому сейчас Я могу начать называть его методы. Если я называю методом Длина этого объекта с он собирается вернуться ко мне длину строки. Это так же, как в StrLen C. Это будет означать, 4. Точно так же, другого способа я бы хотел, чтобы заботиться о это characterAtIndex. Это метод, который говорит на эту строку с Я хочу, чтобы вы нулевом характер, и так это было бы вернуться ко мне с характером, и есть целая куча более из этих методов, которые вы можете Google очень легко. Документации Apple, является большим, и мы взглянем на этом немного позже. Те строки. Мы также массивы переменной размер встроенного Помните, как в C, когда мы объявили массив Мы были у вас есть 5 элементов, конец истории. Когда мы добрались до JavaScript и PHP мы могли бы начать делать вещи, как добавление элементов или перемещении элементов. Мы можем сделать то же самое в Objective-C. Вместо того, чтобы создать массив в обычном режиме C мы опять другой класс NSMutableArray. Там также NSArray, и это будет в основном инкапсуляции некоторых массивов. Это говорит первое, что я хочу сделать, это я хочу выделить место для нового массива, и после того как я передать его Я тогда нужно инициализировать его. Опять же, просто называя эти 2 способа. Теперь это означает, что внутри этого объекта Я пустой массив сидит. Если я хочу что-то добавить к этому массиву, я могу назвать AddObject метод. Я хочу добавить объект в массив, и я хочу, чтобы добавить строку CS50. Если бы я хотел, наоборот, удалить, что я могу сказать, что я хочу удалить объект на первом месте на массив или объект. Смысл? Хорошо, вы вроде привыкнуть к этой площади вещь кронштейн. Кстати, внутри много библиотек Apple, вы увидите, что это NS. NS на самом деле обозначает следующий шаг, который был одним из Стива Джобса компаний во-первых, а вот где он действительно начал писать много кода как своего рода основу для Mac OS X и все другие вещи, и поэтому эта NS является своеобразной это хорошее наследие кричать на одной из ранних компании назад, когда Apple, впервые начинающих. Это во всем мире. Давайте взглянем на более целостный Objective-C примеру. Вот я внутри XCode. Чтобы попасть сюда, я сначала скачал XCode из App Store, открыл его, а затем я пошел сюда, чтобы файл, здесь новые, а затем проект. После я делаю, что я все эти варианты того, что я хочу создать, и поэтому мы взглянем на эти параметры позже, но только на этом примере, потому что мы на самом деле не будет иметь приложение тем не менее, Я пришел сюда, и я сказал: инструмент командной строки, и это приложение, которое я мог бы запустить в командной строке так же, как мы уже работает с C. Вот как я создал этот проект, и поэтому сейчас я здесь, так что давайте сначала посмотрим на этот файл, и это должно выглядеть довольно знакомой. У меня есть имя Int. Там мой друг агдс, мой другой приятель ARGV. И таким образом мы видим, что это является отправной точкой для моего первого Objective-C приложений. Здесь мы можем игнорировать это сейчас. Это, в основном некоторые вещи управление памятью, что вы не очень никогда не придется беспокоиться. Давайте посмотрим на эту Первый блок здесь. Это первая линия, если я скажу, студенческая * Алиса = [[Студенческие идентификатор] Init] Что это делаешь? Это первый студент здесь, это, вероятно, класса. Это не класс, Apple, пишет, но это класс, который я написал. Первое, что я хочу сделать, это я хочу выделить место для новых студентов, и тогда я хочу, чтобы подготовить его, так что это дает мне обратно этот новый объект студент, и я храню это в переменную с именем Алиса. Откуда это класс пришел? Ну, здесь на левой стороне все эти различные файлы внутри моего проекта. Мы видим здесь у меня есть Student.h и Student.m. . Ч файла, помню, где я заявляю, все вещи, , которые будут существовать в пределах класса. Давайте посмотрим на это. Ладно, здесь мы имеем эту @ интерфейс, и это говорит о том, что здесь происходит декларациях все, что будет существовать в моем классе. Тогда у меня толстой кишки. Тогда у меня есть эта вещь NSObject. Это двоеточие означает, что наследство немного мы обсуждали чуть раньше. Это говорит, что все NSObject может сделать где NSObject это класс, написанный кем-то другим, все это можно сделать NSObject Я хочу быть в состоянии сделать это. По сказав: NSObject, что означает, что я в принципе унаследовала все функции другого класса. Это действительно дал мне целую кучу различных методов и свойств, которые я могу использовать. Здесь, внизу я создаю 2 свойства. Это означает, что мой студент, если бы это была структура, это будут 2 вещи Внутри моей структуре, так что каждый студент имеет имя , что является строка, и студент также имеет класс, которая Int. Наконец, здесь я собираюсь создать метод для моих студентов. Я позвонил своему методу, initWithName, и она принимает один аргумент, и этот аргумент является строкой, и я назвал его имя. Теперь давайте посмотрим на то, как мы на самом деле реализован этого класса. Вот, теперь я внутри моего. Файл м, м для реализации, я думаю. У меня есть реализация, мой конец, и вот где я на самом деле определении initWithName, что делает. У меня есть initWithName, имя мое параметра, а затем это где я на самом деле создание студентом, и таким образом, это немного загадочно, но это вроде шаблонный , которые вы хотите включить в вашу конструкторов. Эта функция инициализации здесь, initWithName, является одним из видов конструктора. Вы в основном строительство нового объекта студента и, возможно, отправка некоторых данных внутри него. Первое, что я хочу сделать, это я хочу обратить инициализации на это супер вещь. Помните, что, когда я сказал назад здесь, в. Файл ч что все NSObject имеет студент имеет. Это означает, что когда я создаю то, что я студент Также нужно сделать, это Убедитесь, что NSObject, что я наследующий все, что данные Также инициализирован правильно. Что я должен сказать, это супер на самом деле происходит сослаться на родительский класс что я наследования, поэтому я хочу, чтобы убедиться, что я инициализации все, что я в зависимости от прежде чем начать пытаться его использовать. Тогда, если это правильно инициализирован это, как говорят, если таНос не вернуть нулевой, то я могу начать установку некоторых свойств. В JavaScript и PHP мы это ключевое слово называют это, и это относится к текущему экземпляру класса. В Objective-C мы называем это самостоятельно. Когда я говорю self.name, что означает, что объект Я только что создал, когда я сказал студент Alloc Init, что собирается дать мне обратно объектов. Это означает, что я хочу задать имя этого объекта к тому, что я только что прошло дюйма Как и в C, мы получаем доступ к членам с этой точки, так self.name говорит, что имя студента объекта Теперь будет все, что вы только что прошли дюйма И вот, наконец, я могу вернуть это так, я на самом деле получить что-то взамен. Вопросы? Ладно, так это само = супер INIT, если вы не совсем понимаете наследства вещи не волнуйтесь. Просто знайте, что если вы хотите сделать свой собственный метод инициализации просто сделать это, и вы будете хорошо идти. Да. >> [Студент] Что, если само значит? Это означает, что, когда мы таНос то, что мы всегда проверяется, если она была равна нулю, и если она была нулевой, то мы вышли. Это то же самое, потому что, если это возвращает нуль, то мы, вероятно, будет сегменте вина если мы начнем пытаться манипулировать им. Это наш студент класса. Это означает, что мы можем инициализировать наши студенты в одном из двух способов. Если я скажу, студент идентификатор инициализации я не использую этот способ, что я только что написал, и вместо этого я могу просто сказать, alice.name, и теперь я собираюсь установить, что имя свойства. Точно так же, если я хочу использовать этот метод initWithName Я могу просто сказать, идентификатор, а затем вместо того, чтобы говорить инициализации Я буду называть это метод, который я только что создали, и я собираюсь пройти в Боб. На данный момент, этот объект Боб имеет имя, совпадающее с Бобом. Ладно, здесь я использую, что NSMutableArray, что мы смотрели на ранее. Я выделении space.Then я инициализации нового массива. Я собираюсь добавить 2 вещи к нему. Этот массив в настоящее время проводит студент объектов. Обратите внимание, что нигде не я должен сказать, что это массив студентов. Я сказал, что это массив, период. Тогда я могу положить все, что внутри него, что я хочу. Вот у меня есть 2 объекта. Наконец, у меня есть другой объект здесь, это TF. А здесь в TF.h принципе то же самое. Я наследования от NSObject, и, кстати, При создании классов все это делается для вас, такой шаблонный интерфейс. Она имеет свойство студентов. У меня есть несколько методов, что здесь действительно не много, и так это означает, что после создания этого объекта TF Я могу назвать этот метод класса на это так. Любые вопросы по Objective-C синтаксис, прежде чем мы начинаем двигаться в несколько интересные разработки приложений вещи? Итак, давайте на самом деле сделать iPhone приложения. Основные классы, которые вы будете использовать в Вашем iPhone приложение называется вид контроллеров, и вид контроллера в основном представляет собой единый экран Внутри вашего приложения, так что если я на музыку приложение, например, один вид контроллера может представлять представление, в котором я рассматриваю все песни на моем iPhone. Еще один вид контроллера может быть, когда я нажимаю песню и начать играть или как я бурении вниз, в художники. Каждый из этих различных экранах может быть представлено как другой контроллер зрения, и вид контроллера на самом деле просто класс, который говорит, как этот экран работает. Вещи внутри контроллера представления, мы будем иметь свойства, так что такие вещи, как кнопка будет собственностью нашей точки зрения контроллера. Мы также собираемся иметь методы, и в основном это обработчики событий. Этот метод говорит, что когда вы нажмете на эту кнопку Я хочу сделать что-то, и, наконец, опять же, Мы будем использовать это само ключевое слово, чтобы получить доступ к текущим экземпляром. Для построения интерфейсов в IOS на самом деле очень, очень легко. У них это хорошо перетаскивания интерфейс под названием Interface Builder, и 2 базовые концепции, что провод вашего Objective-C в Interface Builder являются IBOutlet и IBAction. IBOutlet просто говорит, что если вы объявляете свойство, что это кнопка, и вы хотите подключить его к чему-то в Вашем UI, Вы собираетесь сказать, что это выход. Аналогично, если вы хотите, чтобы представлять обработчик события Затем вы собираетесь сказать, что это действие. Чтобы на самом деле проволоки до этого графического представления и ваш код, это очень, очень простое. Если вы хотите прикрепить IBOutlet, все что вам нужно сделать, это вы управляете мыши, и мы увидим пример этого очень быстро. Вы управляете щелкните там, где он говорит View Controller. Вы собираетесь перетащить в интерфейсе, или, наоборот, если вы хотите подключить обработчик события вы собираетесь перетащить из интерфейса в другом направлении. Давайте взглянем на очень простой пример IOS. Давайте создадим новый проект. Я собираюсь приехать сюда, чтобы приложения, и я собираюсь нажать Одна заявка View. Я собираюсь нажмите кнопку Далее. Я дам моему проекту имя. Я буду называть его Hello. Интересно, Apple предполагает, что вы создаете продукт так что вы можете продать его, и они могут делать деньги. Здесь, внизу я собираюсь сказать, что это iPhone приложение. Вы можете создать IPad приложение, или если вы хотите создать одно из тех приложений , которая поддерживает как устройства, которые вы можете сделать это. Это то, что вы хотите, чтобы ваши галочки выглядеть. Вы хотите использовать раскадровку, которую мы увидим позже, и вы определенно хотите использовать автоматический подсчет ссылок, , который является приятной особенностью, которая предотвращает Вас от необходимости говорить таНос и бесплатно. Если вы хотите позвонить таНос и свободно, я хотел бы оставить это проверено. Я буду нажмите кнопку Далее, и, наконец, это будет спрашивают меня, где я хочу сохранить его. Я ударю создать, и здесь мы идем. Я создал новый проект. А здесь слева все файлы, которые находятся внутри моего проекта, и заметил, что я получил целую кучу, и я даже не делать ничего. IOS является большим. Например, вот эта ViewController.h, это будет представлять мой первый контроллер зрения, поэтому на первом экране внутри моего приложения. Теперь мы знаем, что это говорил. Мы говорим, я звоню этому классу ViewController, и ViewController делает все, что делает UIViewController, и это, опять же, некоторым классом, который писал, что Apple, делает много полезных вещей для нас хотел отобразить экран. Вот где я могу фактически начать определение того, что мой взгляд контроллер делает, и оказывается, что я действительно не нужно это. Это шаблонный код, который Apple, дает мне бесплатно. Я сделал это нужно первая линия, или у меня нет класса, так что мы можем избавиться от этого и избавиться от этого. Итак, это мой пустой экран. Теперь нажмите на эту MainStoryboard.storyboard, и это где она начинается самое интересное. Это представляет собой первый экран на мое приложение. Если я хочу, чтобы добавить кнопку в HTML я должен был создать кнопку тега. В Android вы должны создать кнопку тега, но в IOS, если я только приехал сюда в правом нижнем углу и если я нажимаю на это 3-ий здесь, где он говорит объектов, и я могу прокрутить вниз, или я могу начать поиски кнопки. И посмотрите, кнопки, так что если я на самом деле перетащить прямо там, Я только что добавили кнопку, чтобы этот экран на мое приложение. Если я хочу изменить текст, я могу дважды щелкните по нему, сказать что-то заманчиво, как "Press Me". Хорошо, теперь, если я запускаю это приложение, таким образом, мы скомпилировать его, так, чтобы запустить его я нажимаю кнопку воспроизведения в левом верхнем углу, и есть мое приложение. Я ничего не делал, и я получил сладкий глядя iPhone приложение. Если я хочу, чтобы остановить его, вы можете нажать кнопку остановки потому что это более весело. Давайте предположим, что я на самом деле хотите, чтобы что-то случилось, когда я нажимаю эту кнопку. Чтобы сделать то, что мне нужно сделать, это мне нужно создать Новый обработчик событий или действий. Это означает, что мне нужно создать некоторый метод, который я хочу назвать когда я нажимаю на кнопку, так давайте создадим новый метод. Я внутри ViewController.h. Я должен сказать, что метод существует. Мне нужно дефис сначала, потому что я собираюсь быть вызовом этого на вид контроллера. Мне нужно, чтобы дать этому типу. Тип этого будет IBAction, что то, что мы видели ранее. Это обработчик события, так что он собирается вернуться IBAction, и это намек на XCode сказать, что это то, что я хочу, чтобы телеграфировать что-нибудь. Я могу дать ему имя, как buttonPressed, точка с запятой. Теперь я объявил новый метод внутри моего класса. Я уже говорил этот метод имеет свое существование. Теперь давайте вступать в ViewController.m, и скажем, что этот метод может сделать. Если я начинаю набирать, например, (недействительными) buttonPressed уведомление XCode действительно хорош и autocompletes для меня. Это действительно замечательно. Заметьте, что внутри. М. файла я могу также сказать, пустота, и это потому, что IBAction на самом деле не тип. Это на самом деле хэштэг определена где-то быть пустота, и опять же, это всего лишь намек на XCode, что говорит Я хочу, чтобы это обработчик события, и мы увидим, почему всего за секунду. При нажатии этой кнопки я собираюсь сделать что-то раздражает хотелось отображения всплывающего окна. Чтобы сделать это, я могу создать новый экземпляр этого класса называют UIAlertView, и это класс, который Apple, писал, что собирается показывать назойливые всплывающие окна. Мы называем это всплывающее предупреждение, а у меня 2 шага, помните, для создания этого объекта. Первое, что мне нужно сделать, это выделить пространство. Я хочу UIAlertView. Я хочу, чтобы выделить пространство. Это мой первый метод. Мой следующий метод я хочу, чтобы инициализировать его, и поэтому у меня это большой, длинный метод initWithTitle. Это в основном собирается контролировать то, что это всплывающее окно говорит. Название моей всплывающее окно может быть привет. Послание это всплывающее окно может быть "Это IOS". Делегат вещь, я не знаю, что это такое. Скажем, это ничего. Теперь кнопка, которая собирается появиться можете сказать что-то вроде "Это точно", и я действительно не хочу никаких других кнопок, так что давайте удалить, что и закройте скобку. Ладно, я создал дополнительное один. Там мы идем. Это, как я могу создать новое всплывающее окно. Если я хочу на самом деле показать всплывающее окно я хочу назвать шоу методом. Чтобы сделать это, я могу сказать, оповещения и шоу, и снова, автозаполнение был супер хорош. Если я забыл, что это такое, если я только что ввели в с, Я могу прокрутить здесь, чтобы выяснить, что это было, и он фильтрует красиво. Теперь я создал это новое всплывающее окно. Мы вернемся к тому, что делегат означает, позже, и теперь я хочу сказать, что я хочу этот метод, чтобы быть уволены когда я нажимаю на кнопку, так что я собираюсь вернуться к моей раскадровки, и я хочу сейчас придаем этому IBAction. Первое, что нужно сделать, это нажать на кнопку. При нажатии на эту кнопку, я хочу что-то случится. Я не собираюсь удерживать контроль. Я хочу, чтобы перетащить с помощью кнопки более здесь, где он говорит View Controller. Мы видим, что это красиво светится. Если я отпущу с моей мыши теперь у меня есть эта всплывающее окно здесь, где у меня есть несколько вариантов. Одним из них является событий, что я могу зарегистрироваться. Это все те методы, которые я объявил в моем ч файла IBActions. Это, как XCode знает, что должен появиться в этом списке мало, так что это всего лишь намек. Если я нажимаю на кнопку нажатой, я сейчас зарегистрирован обработчик событий. В JavaScript мы должны были сказать у меня есть некоторый код, который зарегистрирован обработчик событий. В Objective-C это было действительно так просто. Если я запускаю этот раз Теперь, когда я нажимаю на кнопку мой обработчик события будет стрелять, и я собираюсь получить это всплывающее окно. Супер, супер просто нет. Если вы всегда хотите, чтобы увидеть все события, которые происходят на регистрацию на компоненте, если я нажимаю на эту кнопку и Я пришел сюда, чтобы правая сторона Сначала вы можете видеть здесь я могу делать вещи, как тип кнопки, так что если вы хотите один из тех, кого я или кнопку Добавить контакт или любой другой. Если я хочу, чтобы увидеть все события, которые на этой кнопке если я проделал весь этот путь сюда, на правой стороне мы видим здесь на события У меня есть все эти различные события. Я могу нажать на кнопку, когда я отпустил кнопку, когда я дважды нажмите или любой другой, и тот, который я только что зарегистрировался это событие называется Touch Up Inside, и это говорит о том, что как только палец отрывается от кнопки это событие будет огнем, и это именно то, что только что произошло. Это своего рода умолчанию кнопка нажата события. Любые вопросы до сих пор? Ладно, вот как мы можем начать соединять вещи в нашем коде в вещи внутри нашего интерфейса. Помните, первое, что мы должны были сделать, это найти код, и тогда мы подключена интерфейс к коду, и есть наше первое приложение. Ладно, это было действительно здорово, и мы создали эту кнопку. Что делать, если мы не хотим иметь, чтобы создать кучу свойств представляющими эти кнопки? Например, в Tic Tac Toe у меня есть 9 кнопок, и было бы супер, супер раздражает нужно перетащить 9 раз или если я должен был сделать Tic Tac Toe с 81, а не 9 и мне пришлось перетаскивать 81 раз, и это хромой. Что мы можем сделать, а очень похоже на HTML когда у нас были такие вещи, как идентификаторы и имена, и мы можем искать вещи по их ID, есть аналогичные понятия в IOS называется тегами. Тег это просто уникальный числовой идентификатор для компонента. Если я говорю, это не имеет тега 0, например, если я создаю кнопку и дать ему тег 0, и мы увидим, как это сделать всего за секунду, если я хочу получить эту кнопку Я могу просто сказать, что я хочу, чтобы вызвать viewWithTag метод объекта здесь, self.view, который представляет текущий экран, например. Если я называю это viewWithTag метод, я собираюсь отойти на кнопку с тегом 0. Давайте взглянем на это, здание Tic Tac Toe. Во-первых, это мои раскадровки. Я создал эти 10 кнопок интерфейса. Обратите внимание, что все они одинакового размера. Если я нажимаю одну из них и я вернусь сюда на этой правой стороне Вы увидите, я поправил шрифт прямо здесь, поэтому я сделал шрифтом немного большего размера, но то, что я сделал, я поставил этот тег. Я сказал, что это не имеет тег 1, и это верхнем левом углу. Теперь, если я нажимаю другую кнопку, как эта вторая здесь, Сейчас вы увидите, что мой тег 2. Каждая из этих кнопок просто имеет уникальный тег и так это позже, как я собираюсь начать взаимодействие с моим приложением. Это все внутри одного контроллера представления, но вот то, что у нас есть. У нас есть 3 свойства здесь. Первый и последний собираемся представить состояние моего совета. В основном это Первый массив, представляющий где Xs и ОС. Это другая говорит нам, чья очередь. Вы заметите, что у меня тоже есть эти вещи. Раньше, когда мы объявили свойства, которые мы дали им названия и типу. Мы также можем дать им некоторую дополнительную информацию здесь. Это первый говорит неатомической, и что это говорит в основном только одна вещь никогда не будет пытаться получить доступ к этой переменной за один раз. Вы можете сделать более сложные приложения, которые являются многопоточными, и так еще в Царапины у нас были разные темы, и различные спрайты могут делать разные вещи в то же время. Если это не так, что она не все, что мы будем смотреть на, если мы говорим неатомической это на самом деле собираются сделать вещи немного быстрее. У нас также есть то, что называется назначают, сильные или слабые. Это назначить просто говорит, что это стандартный тип. Это не объект или указатель, потому что это всего лишь логический, так BOOL встроен в Objective-C. Это говорит не пытайтесь ничего делать фантазии с указателями здесь. Это обычный старый масштабирования. Сильные и слабые, это слабое говорит, что на самом деле Я хочу, чтобы это указывает на то, с точки зрения управления. Я не собираюсь на самом деле выделить или инициализации этого сам. Interface Builder, когда я запускаю приложение, будет обрабатывать все, что инициализация. Если я говорю, слабые, говорит, что кто-то будет создание этого. Если я скажу, сильный, это говорит о том, что я собираюсь быть один которая создает эту доску объекта, и вот у меня есть еще несколько методов здесь, Например, действия, когда новая кнопка нажата игры, действие, когда любой другой нажатии кнопок и так далее. Мы не будем вдаваться слишком много логики Tic Tac Toe, хотя это очень интересно, но давайте взглянем на некоторые из вещей, которые мы можем сделать, внутри IOS. Этот новый метод игры будет уволен всякий раз, когда я нажимаю кнопку создания новой игры. Для подключения, что до меня просто приходят ко мне раскадровки. Я нажал на новую игру. Если бы я пришел сюда, чтобы право Я вижу, что Touch Up Inside подключен к NewGame метод. Вот почему это уволят. Метод NewGame собирается сделать некоторые настройки. Это будет сказать, что я хочу, чтобы вы ясно государственного правления. Это хороший метод изменяемые массивы. Это будет сказать, что это теперь очередь X, и теперь я собираюсь воспользоваться этим viewWithTag вещь. Я знаю, что мои кнопки имеют теги 1-9, и это то, что я произвольно выбрал. Если я хочу, чтобы установить текст каждой кнопки, чтобы быть пустым потому что я просто начал новую игру, и я не хочу Xs или выходы, чтобы их оставили более я могу это сделать. Я могу сказать, что я хочу представление с тегом, 1, 2, 3, 4 и так далее. Это будет тянуть другую кнопку каждый раз. Здесь я собираюсь привести его к UIButton. Так же, как мы могли бы бросить на целые поплавки и наоборот это говорит о том, что я хочу бросить это UIButton. Это означает, что типа это будет * UIButton потому что указателей, но не волнуйтесь, они не страшные больше. Как только у меня эта кнопка я буду называть его метод. Этот метод называется SetTitle forState, и поэтому это говорит Я хочу, чтобы установить текст кнопки, чтобы быть пустой строкой, и я хочу, чтобы это было пустой строкой, когда она не нажата. Если я использую этот метод, я могу изменить текст кнопки как только кто-то бьет его, но мы хотим сказать, когда кнопка просто сидел там Я хочу, чтобы текст был пустым. Наконец, мы собираемся для инициализации моего совета, и я хочу сказать, что все в настоящее время на 0, так что это члены совета директоров неизменные является изменяемый массив, что означает, я могу назвать AddObject методом и только 0 внутри его. Вот что происходит, когда я создаю новую игру. Давайте взглянем на другую. Этот метод здесь IBAction, что собирается быть нажата каждый раз, когда одна из этих квадратов нажата. Теперь у нас есть Tic Tac Toe логика. Мы выяснить, чья очередь, и на основе этого мы либо установить X или O, но мы заметили, что мы повторно эту же обработчик события для каждого из этих кнопок. Это означает, что у меня нет метода для верхней левой кнопки, другой метод для кнопки внизу справа, хотя я мог бы сделать это. Что бы не быть действительно хорошим дизайном. Что я делаю здесь, я на самом деле происходит, чтобы определить что тег кнопки, которая была нажата есть. Вы заметите, что эта пьеса метод принимает один аргумент. Это называется отправителем, и то, что отправитель находится отправитель будет представляют собой именно то, что было принято воздействия на. Если я нажму кнопку, этого отправителя будет, что UIButton что я на самом деле нажата, так что означает, что UIButton имеет тег, потому что я создал тегов. Если я хочу получить в теге Я могу просто сказать: Я хочу, чтобы теги отправителя, и снова, я только литых его UIButton. Я знаю, что отправитель будет UIButton. Это не всегда должны быть UIButton. Я мог бы, например, зарегистрировать тот же обработчик события  один для кнопки, одна для слайдера. В этом случае, я знаю, что они все кнопки, так что я собираюсь сказать Я хочу, чтобы это кнопка, и тогда я смогу получить тег, и с тегом Теперь я знаю, где я нахожусь внутри платы. Тогда я могу просто установить либо X или O, может перевернуть свою очередь, проверить, кто выиграл, и так далее. Любые вопросы по этому до сих пор? Итак, весь код, мы разместили онлайн-мы не хотим, чтобы попасть в слишком много из логики Toe Tic Tac, но теперь вы можете видеть, что на самом деле все, что мы делаем, мы цикл по этому массиву, поэтому мы имеем пару циклов здесь, и мы просто сравнение, чтобы увидеть у нас есть матч во всех строках, матч в столбце или что-нибудь подобное. Чтобы действительно запустить это приложение, если я нажимаю на одну из этих кнопок что игра метод был уволен, так, значит, я просто установите Кнопка быть X, так что теперь эта кнопка будет O, и так далее, и вот как мы начинаем взаимодействовать с одним приложением странице. Мы будем публиковать код, так что не стесняйтесь, чтобы просмотреть, что, Но давайте теперь поговорим о некоторых приложений, которые больше, чем просто одна страница. Столь же захватывающий, как Tic Tac Toe было, много приложений внутри IOS являются своего рода эти детализации вещей с несколькими экранами. Первая концепция, что мы должны говорить о протоколы, и протокола является просто набором методов что вы можете обещать определить. Если я создаю новый протокол с 2-мя методами, это первое, если возвращаемый тип является ничтожным, я назвал его Foo. Он не принимает аргументов. У меня есть другой метод. Она возвращает Int. Я назвал его баре, и она принимает один аргумент. Все это протокол является то, что называется SomeProtocol здесь, это набор вещей, которые кто-то может реализовать. Я не внутри этого протокола сказали, что Foo делает. Вместо этого, я просто говорю, вы могли бы определить Foo, если вы хотите. Если я создаю представление-контроллер или создание класса Я могу внутри этого класса обещание реализовать некоторые из этих методов, так, например, если говорить это сейчас говорит, что я делаю вам обещание, что внутри этого класса контроллера зрения мне придется определений для обоих Foo и бар. Почему это полезно? Многие компоненты внутри IOS воспользоваться этим шаблон проектирования называется делегацией, и то, что делегация говорит является то, что, например, если у меня есть текстовое поле и есть некоторые события, которые могут быть зарегистрированы в моей текстовое поле, вместо создания отдельного события, что я могу сделать, это я могу сказать, Делегат это текстовое поле будет некоторый объект. Когда я говорю, что это делегат теперь, что означает, что всякий раз, когда некоторые события были бы уволены в текстовое поле вместо того, чтобы зарегистрировать его или что-нибудь вроде этого он просто будет вызвать метод делегата. Например, в моей текстовое поле у ​​меня есть метод, когда я нажимаю что сделать кнопку в правом нижнем углу, и т.д., а не регистрацию обработчика события, что я могу сказать, текстовое поле, вот это объект, который я хочу, чтобы вызвать метод каждый раз, когда кто-то нажимает кнопку Готово, и это означает, что этот объект имеет для осуществления некоторых протоколов говорит, что я обещаю, чтобы определить, что делать кнопки действия, потому что, если он не определяет, что метод, и вы нажмите Готово, Затем она собирается вводить в заблуждение. Давайте посмотрим на примере. Здесь я просто одно текстовое поле, и одним из свойств этого текстового поля здесь на этом правая часть делегатов. Это свойство класса. Что я сделал здесь я могу контролировать нажата, и я потащил с этого места здесь на представление-контроллер, а теперь говорит делегат это поле будет представление-контроллер. Это означает, что, когда некоторые действия происходят, а не регистрации отдельные обработчики событий, я хочу, чтобы вы отправить их на делегат. Теперь давайте взглянем на мой взгляд контроллер. Внутри. Файл ч я дал обещание. Я обещал выполнить некоторые методы внутри этого протокола называется UITextFieldDelegate, и снова, это лишь некоторые список некоторых вещей, которые я могу выбрать для реализации. Если бы я приехал сюда в моей. М. файла, я реализовал один из таких методов. Я назвал его textFieldShouldReturn потому что это, как это называется внутри протокола. И теперь всякий раз, когда я нажимаю кнопку Готово внутри этого текстового поля Это то, что собираюсь называть, так что я не зарегистрировать обработчик событий. Я подключен делегата, и всякий раз, когда это событие это метод, который будет вызван, так что если я прихожу сюда, чтобы мои раскадровки и запустить его- Хотя это погрузке мы можем видеть, что она делает. На моем экране у меня есть 2 вещи. У меня есть текстовое поле, и у меня этот ярлык. Я просто говорю, я хочу, чтобы текст этой метки равным любой пользователь ввел внутри текстового поля. В следующей строке здесь просто метод, который я звоню на текстовое поле, которое говорит, что я хочу, чтобы вы скрыть клавиатуру. Это всего лишь произвольные метод, который Apple, выбрал. Опять же, прежде чем я ничего не делал, я должен был связать все, так что я впервые приехал сюда. С точки зрения контроллера я перетащить в текстовое поле. Я отпустил, и я вижу здесь, что я могу сделать это свойство текстового поля так как здесь, по мнению контроллера я определил собственности то есть IBOutlet текстового поля. Это говорит о том, что я могу подключить эту собственность до в текстовом поле в моей пользовательского интерфейса. Теперь, когда я нажимаю этого я могу начать печатать. Теперь, если я нажмите кнопку Готово, это будет стрелять событие, что я могу сейчас ответить. Нет обработчиков событий. Вот как я только что ответил на кнопку Готово. Смысл? Это не шаблон проектирования, что-Вы не могли бы когда-нибудь окажетесь создания собственного протокола, но точно знаю, что некоторые различных компонентов IOS регистрации событий по-разному. Кнопки, например, использовать эти IBActions. Текстовые поля, с другой стороны, будем использовать делегаты. Мы видим, и вы можете смотреть все, что внутри документации. Кстати, там на самом деле тонны материала пользовательский интерфейс встроен в IOS для вас, так, например, так, как я сделал, которые говорят, сделал в правом нижнем углу Я выбрал в этом текстовом поле. Я пришел сюда. Я прокручивается немного вниз, чтобы вернуть ключ, и я могу на самом деле сделать это целая куча вещей, например, если я хочу сказать, что экстренного вызова, а я могу это сделать, что совершенно случайно, и я не знаю, почему есть встроенный вызова службы экстренной помощи кнопки, но нет, он говорит, экстренный вызов в действительности маленькой буквы. Там вы идете. Определенно изучить все эти различные варианты в IOS. Любые вопросы по делегаты? Опять же, интересный шаблон дизайна, что вы должны быть в курсе. Ладно, давай следующий взглянем на таблицу вид. Таблицы в основном, что список предметов, которые на всем протяжении места в IOS. Когда вы просматриваете все ваши контакты, вы смотрите на настройка страницы, и такой список вещей, называется таблицы. Реализация таблицы в IOS довольно проста. Вместо того класса, который спускается от UIViewController как мы делали раньше мы просто должны сказать, а не все UIViewController же я хочу сделать, Я говорю все UITableViewController же я хочу сделать, так что просто добавляет некоторые дополнительные вещи, которые совершенно для нас сделал. Нам нужно сделать очень мало в основном заполнить пробелы внутри таблицы. Для того, чтобы отобразить таблицу мне нужно ответить на несколько вопросов. Первый вопрос, который мне нужно ответить, сколько секций в таблице? Когда вы просматриваете ваше приложение контакты вы заметите, что это своего рода организована как, то у вас есть завтрак, и у вас есть, что немного к югу заголовке. Каждый из них называется раздел. Вы можете или не нужно это. Первое, что вам нужно сделать, это реализовать метод называется TableView: numberOfSectionsInTableView. Это просто возвращает сколько секций у вас есть, так что можно сказать, возвращать одно если у вас есть одно большое представление таблицы. Следующий вопрос, который IOS должен знать, сколько строк у вас есть? Например, вы просматриваете таблицы. У вас есть фиксированное количество песен, вы смотрите на или фиксированное количество контактов. Если вы меня, конечно, не так много, и вот как IOS знает, сколько клеток на форуме. Опять же, это может сказать что-то вроде возвращения 3. Моя таблица имеет 3 ряда. Наконец, IOS должен знать, что каждая клетка выглядит, Так что это на самом деле собираюсь сделать, это вызвать этот метод здесь, это TableView: cellForRowAtIndexPath. Это будет вызывать этот метод на каждую ячейку внутри таблицы. Как это знаю, сколько раз это назвать? Ну, вы сказали, что внутри количество строк в разделе. Мы будем называть это на каждой из наших клеток, и внутри это где вы можете делать вещи, как набор текста или сказать вам, что это немного синей кнопки на правой стороне делает. Шаблон для получения этих клеток, мы собираемся использовать этот метод называется dequeueReusableCellWithIdentifier. Objective-C на самом деле очень хорошо известны за смешную длина их имена методов, и это действительно хорошая речь пример. Что этот метод делает это просто говорит, что я хочу, чтобы ты дал мне камеру. Просто вещь IOS. Если у вас есть что-то вроде 100000 композиций на ставку IOS, что не хотите сделать, это выделить 100000 клеток, потому что если вы в верхней части списка, вам действительно нужно выделить память на ячейку, 99000 строк вниз? Нет, потому что, как вы прокрутки можно выделить виды, как вы идете вперед. Это делается для вас. Вам не придется беспокоиться о том, что все глупые вещи производительности. Все вы говорите, вы вызываете этот метод dequeueReusableCellWithIdentifier, и это говорит, хорошо, если вам нужно, чтобы я собираюсь создать новую ячейку для вас. Но если вы в нижней части таблицы, и вы уже выделил некоторые клетки в верхней части таблицы, что вы действительно не понадобятся в ближайшее время Я собираюсь дать вам один из тех спине вместо выделения нового, , так что это хороший озабоченность производительности. Вы не должны выделять клетки самостоятельно. Это даст вам обратно в клетку. Это собирается вернуться к вам ячейке объекта. Если у вас есть клетка объекта, вы можете делать вещи к нему. Вы можете установить текст ячейки с этим свойством называется текстовая метка. Можно добавить, что стрелка на правом или другие случайные вещи С этим другим свойством accessoryType, и так далее и так далее. Давайте взглянем на самом деле реализации таблицы сейчас. Когда я создал этот проект а не говорить одно приложение зрения, я на самом деле пришли сюда на мастер-деталь приложений, а так в основном это соответствует почты приложение на IPad с таблицей, вид на левый, а затем содержимое справа. На ставку или iPhone это будет соответствовать одному представление таблицы. Вот где я получил свой стартовый код. Давайте сначала посмотрим на раскадровке. Все это было сделано для меня, в основном создана. Эта панель навигации показал мне, что например клетки могут выглядеть, и я могу дважды щелкните этим, изменить название. Любые другие проблемы пользовательского интерфейса я могу справиться там. В заголовке файла выглядит очень просто. Вместо того, говорят, что это UIViewController мы сейчас говорим, что это TableViewController, поэтому мы знаем, что мы хотим призвать всех этих методов таблицу. Далее я хочу создать свойство, которое собирается представлять вещи в моей таблице. Эта таблица будет произвольно отображать Список фруктов, и поэтому мне нужно создать несколько массивов , в которой я могу вставить свои плоды. Внутри моего файла реализации Первое, что я хочу сделать , я хочу убедиться, что я инициализировать этот массив. Я сказал идентификатор инициализации, создал свой плод массива, и я добавляю 4 вещи к нему, одним из которых является гораздо более спорным, чем другие 3. И теперь у меня есть массив размером 4. Мы встряхивая его в CS50. Теперь у меня есть массив размером 4. Теперь я собираюсь начать отвечать на эти вопросы, и на самом деле, Когда я создал это приложение все это уже было сделано для меня. У меня не было набирать из числа секций в виде таблицы. Он уже был там, и я заполняя пробелы. Сколько разделов у меня есть? One. Все сделано. Сколько строк у меня есть? Ну, у меня по одной строке для каждого плода, так это количество является свойством любой массив, который говорит, насколько он велик? Вот сколько строк у меня есть. Наконец, я должен сказать, что же каждая клетка выглядит? Я собираюсь сказать dequeueReusableCellWithIdentifier. Опять же, это была уже написана для меня. Я не должен был сделать это сам, и я хочу, чтобы вернуться эта клетка в этом месте. Помните, что мы называем этим же методом, на каждую клетку, и этот аргумент здесь, этот аргумент indexPath, говорит, что строки я дюйма Если я скажу, indexPath.row здесь это будет 0, то это будет 1, то это будет 2, и это так, я знаю, что клетка я в настоящее время отображения. Я хочу, чтобы установить текст ячейки с помощью этого свойства textLabel пойти в мою фрукты массив и получить объект, соответствующий каждой строке. Если это строка, я теперь установка Текст собственности в строку. Я могу сделать еще одну вещь. Я также могу зарегистрировать обработчик событий по каждому из клетки, поэтому, когда я нажимаю каждой из этих клеток это didSelectRowAtIndexPath, это будет называться для меня, так просто, определив это, я теперь может обрабатывать то, что происходит При нажатии на ячейку, и снова, мы передаем в которой клетки постучал так что мы можем использовать эту же обработчик события для всех наших клеток. Опять же, это то, что IOS делает для меня. Давайте отображения другой раздражающих всплывающих , который просто говорит, что вы выбрали то, где что-то будет строка объекта. Когда я запускаю это, я буду иметь это хороший вид таблицы по одной строке для каждого из этих плодов, и если я нажмите на одну он говорит мне, что произошло. Смысл? Давайте построим немного больше Комплекс приложений, столько, сколько вы выбрали нажав помидор. Хорошо в раскадровке оно не только поможет нам экранов дизайн индивидуально, это также поможет нам связать воедино все наше приложение, так что окончательное приложение мы будем Здание это хорошее спортивных новостей читатель, и поэтому он будет иметь несколько экранов, и поэтому я могу на самом деле представляют каждый из этих нескольких экранов на раскадровке и я могу уменьшить масштаб и увидеть мое приложение от высокого уровня. Для того, чтобы создать новый элемент в моей раскадровки это действительно просто внутри Interface Builder. Если я хочу добавить еще один экран для этого, например, Я сначала не уменьшить масштаб с щепоткой масштаба, что Яблоко любит так много, и здесь, прежде чем я искать кнопку и я перетащить кнопку если я хочу, чтобы создать новый экран я могу на самом деле просто перетащить Весь вид контроллера, так что если я беру это, вытащить его сюда, Эй, есть еще один экран, и теперь с помощью этого же файла раскадровки Я могу иметь все экраны внутри моего приложения, и я могу уменьшить масштаб и посмотреть, как они взаимодействуют. Они не будут взаимодействовать еще нет. То, каким образом эти 2 экрана взаимодействия является вы определяете отношения. Вы можете сказать, что это в основном экране, при нажатии на эту кнопку, Я хочу, чтобы скользить по этому новому экрану. Это означает, что существует такая связь между  На первом экране и на втором экране. Вам придется в основном стрелку от этой кнопки на второй экран говорит, что, когда вы нажимаете на эту кнопку, вот где я хочу пойти. Так же, как мы контролируем щелкнуло, и потащил для определения этих точек Мы собираемся сделать то же самое для определения этих segues. Мы увидим, например, для этого, и прежде, чем мы на самом деле переход с одного экрана на другой IOS достаточно хорош, чтобы вызвать этот метод называется prepareForSegue, и это то, где мы можем начать отправка данных из одного приложения в другое. В этом примере мы собираемся смотреть на это будут в основном позволяют нам для фильтрации бейсбольных команд на лиги и подразделений. Когда я выбираю лиги, например, я хочу переходе к моему следующему экрану, где я могу показать все подразделения В этой лиге или все разные команды. Мне нужно отправить на тот экране то, что команды вы должны просмотров. Для этого я собираюсь воспользоваться этим методом здесь. Наконец, просто случайная точка на IOS. Если вы хотите хранить данные есть то, что называется основными данными, который на самом деле вид сложно работать. Вы также можете использовать SQL для хранения данных, который, опять же, хорошо, но вид на более сложные стороны в работе, но IOS также поддерживает эти действительно интересные вещи называются списки свойств, и список свойств это просто файл, который представляет пар ключ-значение. Вы определяете список ключей, а вы говорите эта клавиша будет массивом. Этот ключ будет строка, и в основном все, что вы можете сделать В JSON вы можете сделать внутри списка свойств, и таким образом, это действительно приятно позволяет нам работать с некоторыми данными. Например, у меня есть эта Teams.plist, что я создал. Я создал новый файл PLIST, и я могу детализировать. Это словарь, это словарь, эти строки, , так что это хороший графического представления документов JSON или просто набор пар ключ-значение, и так это данные, которые я буду работать внутри моего приложения. Давайте сначала иди сюда. У нас есть много других файлов в настоящее время. Но давайте сначала приехать сюда на раскадровку. Раскадровка здесь, если я могу уменьшить масштаб- Теперь мы можем видеть, что это поток мое приложение. Я первый начну на этом экране. Я собираюсь перейти к этому экрану, и я собираюсь перейти к этому экрану, и мы видим здесь, что если я как бы переместить один из этих вокруг мы эти стрелки, идущие от сих до сих, и то, как я определяю, что стрелка была, если я увеличу немного, и если я приду к этой точке зрения контроллера, и вот клетка, и я хочу сказать, что, когда вы нажмете на ячейку Я хочу, чтобы скользить на другой экран. Я могу просто удерживать контроль, прокрутки по чуть-чуть, удерживайте контроль, перетащить эту ячейку снова и отпустить. И здесь мы говорим, что тот переход, который вы хотите использовать? Вы хотите использовать этот слайд вещь, которая называется толчок? Вы хотите, чтобы скользить снизу вверх? Это называется модальным. И как только я нажимаю одну из них, он собирается сделать эту стрелку для меня, и это означает, что я на самом деле обрабатываются, что происходит, когда я нажимаю эту кнопку в графическом виде. Я не писать никакого кода на самом деле скользить от одного экрана к следующему. Я определил это визуально внутри Interface Builder. Если я нажимаю на эту стрелку, мы видим, что Я дал эту вещь именем. Я назвал его showDivisions, и это так, что я могу знать что переход может произойти, и мы увидим, почему только в сек. Вот как я подключил разных экранах в мое приложение. Если бы это была кнопка, например, вместо таблицы, Я мог контролировать нажать на кнопку, перетащить на следующий экран, и вот как я могу сделать навигацию таким образом. Действительно быстро, если бы мы вступили в MasterViewController, опять же, мы просто собираемся определить список вещей, , который будет отображаться в виде таблицы. Здесь я говорю, что я хочу, чтобы вы, что PLIST файл, и я хочу, чтобы вы загрузите его в словарь, и как только вы этого словаря, я собираюсь ответить на эти же вопросы снова. Вот ряд разделов. Один из них, есть по одной строке для каждой лиге, и текст каждой ячейки должны быть либо первым, первая лига, вторая лига, и так далее. Наконец, я собираюсь использовать этот метод, который мы только что видели называется prepareForSegue, и это метод, который будет уволен, когда я нажимаю на одной из этих строк и, следовательно, активация, что переход что я создал с помощью стрелок. Это говорит, что у меня может быть несколько отношений с одного экрана на другой. Если у меня есть 2 кнопки и каждую кнопку, Вы попадете на другой экран Я собираюсь иметь 2 segues, 1 для каждой кнопки. Но это prepareForSegue, опять же, будет повторно для каждого из различных отношений, так это значит, что мне нужен способ выявления, если нажать первую кнопку или нажатии на вторую кнопку. Помните, когда я дал, что переход название, это showDivisions, Вот как я теперь знаю, что это переход, который был активирован. Все, что я хочу сделать, это я хочу сказать, Я хочу выяснить, что я только что ударил, и так, чтобы получить это, я могу сказать, что я хочу indexPath для выбранной строки, помню indexPath просто говорит, где я только что нажали, и тогда я хочу сказать, что я хочу, чтобы выяснить, куда я иду. Это destinationViewController, это свойство переходить. Вот на экране я собираюсь, так что я знаю, что на экране я собираюсь называется DivisionsViewController потому что я создал этот класс, И вот теперь, если я скажу d.divisions Я теперь установив свойство представление-контроллер я собираюсь пойти. Это, как я передача данных с одного экрана на другой экран. Просто глядя на эту DivisionsViewController Вы можете видеть здесь, что в файле. ч есть то, что имущество подразделения, и вот что я в основном заполнения, так вот как я знаю, что я отображении соответствующего подразделения лиги, что я нажал, и снова, фактический вид таблица выглядит почти так же, только отвечая на эти 3 простых вопроса, а также выявление что происходит, когда вы переходите к следующему экрану. Еще пару других вещей. Вы заметили, в верхней здесь, что вместо того, чтобы говорить # включить Я сейчас говорю # импортировать. Это только Objective-C вещь. Импорт в основном лучше версии включают в себя, и, например, мы должны знать, что этот класс, поэтому я не могу просто сказать DivisionsViewController. Если бы мы не хэштэг standardio.c внутри нашего. Файл с компилятор не знал, что Printf было. Точно так же, если я не импортировать DivisionsViewController компилятор на самом деле не знает, что DivisionsViewController есть. Просто убедитесь, что в Вашем разные. Файлов м вы убедитесь, что импорт соответствующая. ч. файлы, так что компилятор не знает, что происходит. Наконец, то, что Apple, в конечном счете, делает это показать некоторые данные с помощью веб-просмотра, и т.д. Ваш взгляд объекта, в котором Вы можете вставлять немного веб-браузер внутри вашего приложения. Все, что вам нужно сделать, это предоставить URL вашего веб-браузера, так что я хочу пойти в mlb.mlb.com, и это, как я могу получить доступ к домашней страницы для каждой команды, и так, передавая в этом URL Ваш может отображаться это для меня, и я могу просматривать вокруг, и тренажер используется тот. Теперь это пришло от моих PLIST. Если я нажимаю эту этого также пришли из моих PLIST, и это скольжение было перевалено путем определения тех segues. Я нажимаю эту и еще одну, и теперь вот моя UIWebView, поэтому просто так вот сайт для URL, которые я только встроенные, и у меня не было, чтобы справиться с чем угодно с ума. Это, как отображать веб-страницы. Такие вещи, как эта кнопку назад здесь также дано мне совершенно бесплатно, потому что я определил эти отношения использовании segues. Есть вопросы? Да. [Студент] Итак, когда вы используете идентификатор, вам никогда не придется ничего бесплатно? Именно, когда вы звоните идентификатор инициализации и вам не придется освободить его. IOS будет обрабатывать все это для вас. Это замечательно, и ты не нарушая никаких правил. Да. [Студент] Если бы вы были, чтобы включить больше команд, которые могут поместиться на экране, будет автоматически иметь опцию прокрутки, или это что-то нужно добавить? Именно так, если бы я имел больше команд, например, он бы автоматически обрабатывать прокрутки для меня, и все проблемы производительности с огромным столом также осуществляется совершенно для меня. Другие вопросы? Все это код будет размещен. Мы как бы затушевывается немного больше мелких деталей, но вещи, как установить некоторые свойства для веб-просмотра просто вещи, которые вы можете получить, перейдя по ссылке документации Apple, что действительно, очень красиво выложены. У них есть много образцов приложений и пример назначение различных API, так определенно просмотреть их, если можно. Просто некоторые полезные ссылки, которые вы, возможно, захотите взглянуть на. Вот некоторые полезные руководства документации. URL-адреса, массивные, так что они сокращены. Это первая является целой библиотеки документации. Там мало баров поиска, так что если вы начинаете набирать кнопки она начнет давать вам всю информацию обо всем, что можно сделать с кнопкой. Я также включил программирования Table View Guide. Он обрабатывает таблицы представления в гораздо более подробно, как делать такие вещи, как динамически добавлять или редактировать клеток клетки или удалить их. Там много образцов приложений от Apple, которая покажет вам, как это сделать, И, наконец, эта последняя является Основные принципы учета человеческого интерфейса, и это в основном некоторого обсуждения компонентов пользовательского интерфейса, такие вещи, как не сделать кнопку, что на 4 пикселя на 4 пикселя. Это плохая идея, и другие вещи, которые Яблоко хочет, чтобы вы поощрение хорошего дизайна. Любой последних вопросов, прежде чем мы закончим? Ладно, безусловно, не стесняйтесь-мы будем иметь специальные этикетки на обсуждения. Мы должны IOS один, так что определенно не стесняйтесь использовать это. Если вы хотите работать со своими одноклассниками по проектам или помочь выяснить некоторые случайные вещи IOS не стесняйтесь, напишите мне, и, безусловно, просматриваем весь код онлайн, потому что только в интересах экономии времени мы как-то умалчивается больше тонкозернистой детали вещи. Но если нет, то удачи в ваших проектах IOS, и я надеюсь, что у нас есть большой приток приложений в App Store. [CS50.TV]