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



Subtitles / Closed Captions - Russian

>> Стэнфордского университета.

>> Пол Хегарти: Хорошо. Что ж, добро пожаловать на лекции номер два из CS 193P для падения в 2013/2014 учебном году. И сегодня мы будем иметь некоторые слайды в начале, немного больше говорить, а потом я иду иметь довольно большую демонстрацию, которая собирается попробовать

и, надеюсь, синтезировать все, что я говорил о на слайдах в течение первых двух лекций, которая является то, что мы собираемся начать строить нашу карточную игру. Хорошо. Эта карта комбинационной игры будет наша подложка в течение первых двух недель обучения некоторые Objective-C, узнав о Xcode, узнав о том, как ОС IOS крючки

до контроллера, а также представления и модели, чтобы сделать пользовательский интерфейс. Так что, если вы помните, в прошлый раз, мы сделали эту вещь карты что - мы сделали всю карту. Это был очень простой класс. Есть несколько свойств - три свойства там, - и один метод.

И это в значительной степени это. И поэтому сегодня мы будем идти дальше и сделать еще один класс, который является колода, хорошо? Колода карт. И помните, что карты и палубы являются универсальными; они не специфичны для игры в карты, не так ли?

Игральные карты, как туз клубов или король червей - то, что есть все, что в нем - что это игральная карта вещь. Это общие карты и палубы. Так что это может быть колода карт памяти, колода слов языка иностранных вы пытаетесь

учиться или любой другой. Таким образом, мы пытаемся сохранить эти колоды и классы карт несколько общий характер. Так вот палуба. Он должен выглядеть знакомым с точки зрения ее основной структуры, не так ли? Мы импортирования нашу структуру Суперклассов там,

а затем, очевидно, импортировать наш собственный файл заголовка в нашей реализации. И интерфейс для палубы будет иметь эти два вида фундаментальных методов: Один добавляет карту на палубу и один рисует случайную карту из колоды. Хорошо? И добавить карту к палубе немного новым для вас

потому что вы можете видеть, что это имеет два аргумента. Хорошо? Это первый метод, который вы уже видели что имеет два аргумента. До сих пор вы видели только методы без аргументов или метода с одним аргументом, как этот - матч - Матч был один аргумент или сеттеры,

у них также есть один аргумент. Так обратите внимание, что, когда у вас есть несколько аргументов и цели, увидеть они вроде перемежаются с именами методов. Хорошо? Таким образом, название этого метода, этот длинный метод добавления карты двоеточие в верхней толстой кишки.

Это название этого метода. Хорошо? Таким образом, в верхней части фактически является частью названия этого метода. И аргументы, как карты, которые вы собираетесь добавить и на вершине, - который является Булева ли добавить его в верхней палубы или в нижней части палубы -

в порядке, эти аргументы перемежаются. И мы увидим, как вы называете такой метод в настоящее время здесь. А потом сделать случайную карту, как, знаете, похожий на добытчика в том, что она возвращает значение и это не имеет аргументов. Но это не геттер, потому что мы не делали это свойство.

И это отчасти важно чтобы понять, вы могли бы сделать это свойство как свойство только для чтения или что-то, что читает его, но так как сделать случайную карту вид делает что-то, она имеет вид алгоритма к нему - механизм - вы обычно не сделать это свойство.

Это своего рода злоупотребление добытчика, чтобы сделать это. Поглотитель на самом деле просто установки и получения значения. Это может иметь побочные эффекты, как и его установка может обновить пользовательский интерфейс или получить это может убедиться, что он инициализируется первым - те рода вещи. Вы не собираетесь - то, что делает что-то

как рисунок карта не будет собственностью. Теперь, если вы хотите иметь, как, что в верхней аргумент быть необязательным, хорошо, единственный способ сделать это в Objective-C - Очевидно, нам нужен наш файл заголовка там - единственный способ сделать это в Objective-C является

объявить новый метод, добавьте карту толстой кишки с не сверху на нем. Так что это совершенно другой метод, совершенно не связан к другому способу, что в его реализации, за исключением этого другого метода мы просто вызвать другую, хорошо? Таким образом, в надстройке карты мы будем говорить самостоятельно добавить карту в верхней толстой кишке,

все, что мы хотим, чтобы по умолчанию, чтобы быть, которые я не буду говорить нет. Хорошо? Так что просто понимаю, что, вы знаете, в некоторых языках, как, некоторые аргументы могут быть необязательными или вы можете вид перегрузки вещей, чтобы иметь такое же имя метода, различные аргументы.

Нет. В Objective-C каждый метод совершенно различны и имеет уникальное имя. И дополнительные аргументы перемежаются в этом роде. Хорошо? Так что это было бы два различных метода. Это имеет смысл? Отлично.

Итак, давайте поговорим о нашей реализации нашей палубе. Таким образом, наша палуба просто будет содержать кучу карт. Нам нужен какой-то внутренней структуры данных чтобы хранить все наши карты. И то, что мы собираемся сделать, мы собираемся, чтобы получить изменяемый массив. Таким образом, вы уже видели NS массив класса,

который является массив класса фундамент, который представляет собой массив объектов. Эти объекты, кстати, в массиве может быть любого класса. Там на самом деле никакого способа определить, какой тип класса объекта в массиве. Некоторые языки позволяют вам сделать это.

Вы можете указать "Это массив строк "и он знает, что. Но в Objective-C вы не можете сделать это. И мы будем говорить о том, как мы имеем дело с этим. Это немного дикий запад от Objective-C, но есть способы рода проверки

и посмотреть, что объекты, если вы хотите чтобы быть действительно безопасно об этом. Но в данном случае мы просто имеем этот изменчивый массив. И изменяемые означает, что мы можем добавить объекты в массив. Обычно массив NS неизменен. Хорошо? После того, как он создан, независимо от объектов, введите его,

это объекты, которые находятся в ней навсегда - вы не можете принимать какие-либо ауту, а вы не можете поместить любой ин. Так что, если мы хотим, чтобы массив, где мы можем добавить материал, мы должны использовать этот подкласс из массива NS NS называется изменяемый массив. Хорошо? Вы можете видеть, что это свойство.

Это сильный, потому что мы хотим, чтобы этот массив, чтобы остаться в куче до тех пор, как мы указываем на него. И, конечно же, мы всегда ставим неатомической там. Хорошо? Так что это будет массив карт. Теперь, когда у нас есть это, мы могли бы легко реализовать добавить карту, например, просто говоря: "Если в верхней части, а затем вставить объект,"

карта, которая является аргументом этого метода - Первый аргумент - "добавить нулевой индекс." Так вставить объект добавить индекс представляет собой метод в NS изменяемом массиве, не в NS массива - только в NS изменяемом массиве потому что будет мутировать его - который вставляет объект по этому индексу в массиве

и нулевой индекс будет верхняя что мы собираемся определить. И тогда в противном случае, если мы не будем ставить его на первое место, мы собираемся поставить его на дно, мы будем использовать различные NS метод изменяемый массив с именем добавить объект.

И что только добавляет что-то в конце массива. Так что все охлаждаться с этим? Так что я в основном просто поставить этот метод здесь просто чтобы показать вам, что есть несколько различных методов на изменяемом массиве и, вы знаете, как мы можем использовать аргументы. Это не большая вещь здесь; это просто своего рода, чтобы получить больше используется

к тому, что здесь происходит. Отлично. Так что это добавить карту. Очень, очень просто. И есть проблема, хотя. В этом добавлять карты, если мы только что создали палубу

а затем называется добавить карту, он не будет работать. Хорошо? Он бы ничего не делать. Почему бы это не делать? Так как свойство карты, все в порядке - self.cards как мы доступ к нашей собственной недвижимости - его геттер выглядит, что по умолчанию.

Если мы не даем поглотитель, это то, что геттерный выглядит. Это просто будет вернуть эти карты подчеркивание экземпляр переменной. Ну, что подчеркивание карты экземпляра переменной собирается чтобы начать с нуля, потому что все переменные экземпляра

в объекте Objective-C начинают нуля. Все они. Хорошо? Так что в том числе указатели. Так что указатель будет равен нулю, который мы называем NIL, что означает, что не указывает ни на что, что означает, что нет массива, хорошо?

Мы получили указатель на массив, который не указывает к чему-либо прямо сейчас. Хорошо? Так что это проблема. Поэтому, когда мы выполняем код в добавлять карты как self.cards добавить объект карты, который собирается не врезаться но ничего не делает, либо.

Хорошо? Потому что я сказал вам, что вы можете отправлять сообщения на ноль, отправлять сообщения указателей на объекты, где это не указывает к одному в то время, и это не приведет к краху. Если вы посылаете сообщение, которое возвращает значение, что сообщение не будет выполнять какой-либо код но он будет возвращать ноль.

Хорошо? Так много нулей летающих вокруг здесь. Хорошо? Итак, как мы будем это исправить? Как мы собираемся сделать это так, чтобы добавить карта работает? Ну, мы могли бы поставить что-то в начале добавления карты что говорит: "Если self.cards равна нулю, затем выделить массив в куче, и указывают на него, а затем мы будем использовать его ".

Хорошо? Но это означало бы каждый раз, когда мы имеем использовать self.cards мы должны были бы идти вокруг и проверить и убедитесь, что он не равен нулю. И это было бы очень раздражает. Хорошо? Это было бы очень подвержен ошибкам, ошибка подверженным, мы забываем сделать это где-нибудь.

Все эти вещи. Таким образом, большое место, чтобы сделать это немного если проверка в поглотителе, хорошо? Это геттер, что мы имеем право там для карт - это геттер для наших частных карт собственности - вместо того, чтобы просто возвращение карты, давайте поставить правильную линию

перед, который говорит: "Если карты равна нулю, то давайте выделить один в кучу и назначить его к переменной экземпляра ". Хорошо? Так как вы выделить массив в куче вы используете NS изменяемый массив Alloc Init. Так что это два вызова сообщения вложен в друг друга.

Alloc выделяет элемент в куче, и инициализации инициализирует эту память, так что это, Вы знаете, разумный массив. И мы собираемся, чтобы увидеть, как мы строим наши собственные инициализатору в паре скользит здесь. Так что этот путь каждый раз, когда вы звоните self.cards,

Вы можете быть уверены, что это не ноль; это по крайней мере, будет пустой массив. Все ли понимают этот код? Важно, чтобы это понять. Да. [Неразборчиво]

>> Пол Хегарти: Хорошо. Таким образом, вопрос: Вместо того, чтобы иметь этот код инициализации будет в этом добытчика, почему я не сделать инициализатор как INIT для палубы и поставить эту внутреннюю палубу? Хорошо? И это еще один вариант.

И опять же, мы будем видеть инициализатору для игральных карт колоды, мы собираемся сделать инициализатор. И мы могли бы сделать это. Но имея инициализация этой вещи быть ближе чтобы фактическое получение имущества больше - это делает ваш инициализационный менее полно кучу барахла, как это.

И это называется ленивым конкретизации, кстати, делать это таким образом. Мы лениво ждали до последней секунды, пока мы не инстанцирует. Эта модель является то, что каждый в Objective-C используется для,

и вы должны обязательно использовать его вместо чем делать вещи в вашем INIT. В INIT вы хотите, вы знаете, установить вещи, установленные значения, которые, Вы знаете, не может быть легко дефолте, как это. Хорошо? Но это очень хороший вопрос. И мы увидим, Init в пару слайдов.

Хорошо? Так что этот путь мы гарантированно self.cards является никогда не равна нулю. Да? >> [Неразборчиво] >> Пол Хегарти: Да. Таким образом, подчеркивание от последней лекции.

Помните, что, когда мы создаем свойство, Objective-C автоматически делает эту вещь, назначить синтезируют: Карты составляет подчеркивание карт. Итак, другими словами, он присваивает переменную экземпляра с именем подчеркивание наименование имущества быть место для хранения этого имущества.

Так вот почему подчеркивание карты автоматически создаются для нас там, за кулисами. То, что у знака синтезирует всплывающее в нашем коде, но это там за кулисами. Это очень хороший вопрос. Любые другие вопросы по этому поводу?

Хорошо. Так что давайте рухнуть вниз некоторые из этих вещей и смотреть при нарисовать случайную карту, все в порядке? Так сделать случайную карту, все это хочет сделать, это получить случайную карту из этого self.cards, хорошо? Так что код очень прост, как хорошо. Таким образом, мы просто получить случайное число.

Вот что дуга 4 случайным образом делает, если вы не знаете. Это просто библиотека функций C. Он получает случайное число. Тогда этот маленький процент после того, как это означает, что мод - в порядке, целое число по модулю - а затем self.cards.count это число карт в наших self.cards.

Хорошо? Таким образом, мы только собираемся, чтобы получить случайный индекс в self.cards, а затем назначить случайную карту чтобы быть self.cards квадратных скобках индекс, хорошо? Таким образом, в том, что одни и те же квадратные скобки для получения доступа к такой массив синтаксиса. И это интересно,

что self.cards квадратные скобки индекс, на самом деле, что это отправить сообщение верить этому или нет. Это так же, как self.cards объект по индексу индекса. Хорошо? Это просто какой-то особый синтаксис и синтаксический сахар чтобы сделать это так, чтобы у вас нет иметь индекс добавить длинный предмет.

Это на самом деле объект на индексируются индекс или что-то с реальным длинным именем метода. Так что это просто красивая, немного простой синтаксис. Но это сообщение, чтобы получить карту по этому индексу из массива. И тогда мы также собираемся, чтобы удалить эту карту

из массива, так как это сделать случайную карту, все в порядке? Это нарисовать карту из колоды. Так что это не в колоде больше, не так ли? Теперь, есть проблема с этим кодом, а также, что: Что делать, если колода пуста? Хорошо? Если дека пусто, то, что без знака индекса происходит

равным нулю, правильно, потому что это будет чтобы быть дуги 4 случайных мод равны нулю. Это будет равно нулю. И так что вы собираетесь сказать, "Случайная карта равна self.card ниже нуля." Ну, что собирается к краху программы

потому что если self.cards является пустой массив, то нет ни одного объекта с индексом ноль, и вы собираетесь чтобы получить индекс массива за пределы поля. Хорошо? Так что будьте осторожны в этом. Индекс - вы не можете получить индекс - если массив не имеет объект

этого показателя, вы не можете получить его. Так что это легко исправить, хотя. Мы просто будем говорить: "Если посчитать self.cards" другими словами, если есть вещи, в массиве ", то мы сделаем это. В противном случае мы только собираемся вернуть случайную карту "

который я с удовольствием инициализируется к нолю в начале моего метода. И именно поэтому я вроде как эта вещь из его инициализации значение по умолчанию вы хотите, а затем установить его, а затем вернуться. И таким образом, если установка не работает по какой причине как это - он терпит неудачу, потому что нет ни одной карты в колоде -

он возвращает то по умолчанию. Это просто своего рода стиль кодирования вещь. Хорошо? Мы сделали то же самое, что со счетом и матч. Хорошо? Есть вопросы по этому поводу? Да? [Неразборчиво]

>> Пол Хегарти: Хороший вопрос. Таким образом, вопрос: Когда я использую NS целое или целое число НГУ по сравнению с Int или даже NS число, которое является объектом который мы еще не говорили о том же? И ответ, это вопрос стиля. И мы будем говорить немного о том, что стиль

и когда использовать эти вещи. Здесь я не очень хочу использовать номер NS, который является объектом когда я просто использовать его, вы знаете, как небольшой местной вещи, как это. Вы бы никогда не сделал этого. Вы используете номера NS в основном

передать их методы. И даже тогда вы могли бы пройти Интс, вы знаете, и поплавки. Таким образом, он будет становится очевидным, как я говорю о количестве NS, который мы будем делать на следующей неделе. Хорошо. Так вот именно для палубы. Колода, очень простой класс, как хорошо.

Итак, давайте перейдем к другому классу, который играет карты. Хорошо? Причина, почему я показывать вам игральных карт, Я просто хочу, чтобы показать вам, что это выглядит как сделать подкласс другого класса, который вы написали. Так игральной карты является подклассом карты. И это специфическая карта, как король червей,

три из алмазов, что вид карты, хорошо? Теперь, он обладает свойствами, которые являются специфическими для игральной карты, который является костюм и ранг. Хорошо? Ранг быть как три, четыре, домкрат, король, не так ли? И костюм червы, бубны, трефы.

И я буду представлять костюм как один символ - сердца персонажей, характер клубов. Помните, я напечатал характер клубы я думаю в карточке мы могли бы показать, что. Я не знаю. Но вы можете ввести один символ.

Unicode имеет характер для каждой из четырех мастей. Так вот, что мой костюм будет. И тогда ранг будет ряд от нуля до тринадцати лет. Это король? Да. Представляя ранг.

Так вот, как я буду представлять в моей общественной API. И здесь я использую уведомление NSU целое число без знака вместо Int. Так NSU целое и беззнаковое INT почти точно то же самое. Единственное, о НГУ целого числа это ЬурейеЕ. Это может быть немного отличается на разных платформах.

Например, новые iPhone 5S являются 64-разрядные переработчиков. Так NSU целое число будет 64-битный INT, неподписанных INT на iPhone 5. И это могло бы только о 32-битной один назад на iPhone 4 и раньше. Хорошо? Так что это немного по-другому.

Таким образом, несовершеннолетний инт. Мы, вероятно, не представляющие целые числа. Конечно, здесь мы будем только от нуля до тринадцати лет. Вероятно, не имеет значения. Но, вы знаете, мы не представляющие целые числа, которые являются так велико, что мы будем использовать 33-й бит.

Так заметить, что в игральную карту мы переопределяя карту Содержание метода. Хорошо? Мы наследуем содержимое нашего суперкласса. И по содержанию по умолчанию просто возвращает значение всего, что свойство является содержание. Но здесь, в игральную карту мы собираемся переопределить содержимое

на самом деле рассчитать наши содержание, на основе этих двух других свойств. Хорошо? Таким образом, мы перекрывая поглотитель содержимого так, что она всегда возвращает строку - содержимое этой игры карты - который рассчитывается по масти и ранга.

Вы видите, что мы делаем здесь? Таким образом, мы в основном брать хранение содержимого - подчеркивание содержание - от нашего суперкласса и игнорируя его потому что мы перекрывая его поглотитель. Хорошо? Так что это вполне веская причина, почему мы делаем это свойства, а потому, что мы могли бы иметь лучший путь

чтобы делать вещи, чем хранение. Теперь, вот способ, которым мы могли бы реализовать: Мы можем просто вернуть строку, все в порядке? NS строка, строка с форматом так же, как Printf-джеями строку. Не беспокойтесь о том, что синтаксис слишком много. И я Printf-ную строку с процентами D и процентов по знаку.

Таким образом, процент D означает целое число; процентов в знак означает объект. Хорошо? Строковое представление объекта. А потом я просто используя ранг и костюм. Так что это будет одним из способов сделать мое содержание. Это не очень хороший способ, потому что, например, домкрат сердец сказал бы 11 сердца, хорошо?

Это не собирается говорить J по крайней мере; мы хотим сказать, J, а не 11. Так что это не очень хороший способ. Так что вместо этого я собираюсь сделать массив что есть все нужные вещи, как А для одного, и J на ​​11, и Q на 12, и K на 13, не так ли? Так что я просто сделать этот массив здесь.

В середине там мне пришлось вырезать, чтобы подогнать его, не так ли? И я даже сделал нулевой знак был вопрос. Так что, если ваш ранг равен нулю, то это будет, как, знак вопроса, как, снята с охраны. Вы знаете, ваш ранг в основном не установлено. А потом я возвращать строку, которая принимает ранг из

этот массив и добавляя на него маленький костюм строка, сердце, или клуб, или алмаз. Все это понимают? Я отчасти дает вам это, чтобы вы могли видеть, как мы смешивания в обозначениях массива, а также отправки сообщения, и все виды из легко смешивается там.

Хорошо? Так что теперь возвращает содержимое J сердца, или 5 бриллиантов, или любой другой. Обратите внимание на то, что наш ранг очень приятно потому что, если наш ранг равен нулю, что она начинает быть когда мы говорим, новый игральную карту - все переменные экземпляра равны нулю, так ранг будет равен нулю -

мы получаем это хороший знак вопроса. Но наш костюм начинается как ноль, и было бы неплохо если костюм также возвращается знак вопроса если он был недосказанным, если она была равна нулю. Так вот, я просто перекрывая добытчиком костюм сказать, "Если возвращение, если мой костюм равен нулю, то возвращает знак вопроса,

в противном случае, когда мой костюм не ноль, затем вернуть то, что костюм ". Хорошо? Так что я только отчасти защитить свой API чтобы убедиться, что я всегда возвращают знак вопроса когда ранг или костюм не установлен. Да.

>> [Неразборчиво] >> Пол Хегарти: К сожалению. Все немного по признакам - красный цвет на знаки, вы имеете в виду? Да. Думаю, мы не получили, что в карты. Но мы могли бы иметь. Но помните, что все строки, которые мы собираемся работать

с в этом классе являются строковые объекты, не константные звезды ухода, не так ли? Они строковые объекты. И компилятор, если вы кладете на знак перед строкой, это сделает объект строки для вас, хорошо? Так вот, что те, на знаки делать,

они делают все эти строки могли быть строковые объекты потому что мы не можем поставить константный звезду ухода в массиве NS. NS массив объектов, поэтому мы должны поставить объекты там, как струны NS. Те объекты. Хорошо? Хороший вопрос.

Да? [Неразборчиво] >> Пол Хегарти: Да. Хорошо. Это хороший вопрос. Если бы мы использовали, что геттерный равно обозначения, которые мы использовали для выбран и подобран, чтобы изменить имя,

Затем, когда мы переопределить мы должны использовать новое имя. Мы должны были бы это любой другой. Теперь, это не тот случай. Но я знаю, что вы говорите, и да, вам придется использовать новое имя. Большой вопрос.

Любые другие вопросы по этому поводу? Хорошо. Так что помогает костюм всегда возвращают знак вопроса если костюм равен нулю или не установлен. Давайте также защитить людей, задающие костюм к чему-то не так. Хорошо? Давайте только дать людям установить костюм с помощью этого свойства,

общественность сеттер собственности. Мы будем только позволить людям установить костюм чтобы быть одним из четырех мастей. Так что я просто на лету в середине есть создали массив из этих четырех мастей. И тогда я использую этот метод содержит объект;

какой класс вы думаете, содержит объект из этого бита на? Кто угодно? [Неразборчиво] >> [Неразборчиво] >> Пол Хегарти: Это метод массива NS, точно. Таким образом, содержит объект является метод массива NS. Я посылаю его в массив, который я создаю прямо на месте там.

Массив, который имеет червы, бубны, лопаты, и клубы в нем. И я просто спрашиваю: Содержат ли вы эту строку? И что содержит объект будет сравнить содержимое этой строки против всех этих с использованием метода равно. На самом деле, это будет говорить равно всех четырех из них

с иском в качестве аргумента; не равна нанизывать - равно. А в строке равно осуществляется вызовом равна в строку, если аргумент это строка. Во всяком случае, более подробно, чем вам нужно, вероятно, есть. Но это, очевидно, защищая его.

Так что нет никакого способа, мы можем установить нашу переменную для хранения внутренний костюм к чему-либо за эти четыре масти, кроме. Да? [Неразборчиво] >> Пол Хегарти: Хороший вопрос. Вы, ребята, прямо поверх него.

Таким образом, каждый раз, когда я использую в знак открытия квадратные скобки - синяя - для создания массива, что на самом деле создает новый массив каждый раз. Хорошо? Потому что я сказал вам, что в знак квадратной скобки и все это массив материал действительно просто вызов методов? Ну, это вызов метода, как Alloc инициализации с массивом

с объектами или что-то подобное. Правильно? Так он создает его. Так что было бы неплохо, чтобы переместить его, и мы собираемся сделать это. Хотя, опять же, будьте осторожны, чтобы не preoptimize. Это, вероятно, не сделали бы по-другому. Я только собираюсь, чтобы переместить его, чтобы сделать мой код чище;

Я не собираюсь, чтобы переместить его по какой-либо причине производительности. Да? >> [Неразборчиво] >> Пол Хегарти: Да. >> [Неразборчиво] >> Пол Хегарти: Вопрос: Будет ли LLVM просто заботиться

о том, что оптимизировать для вас? И это, вероятно, не потому, что это отправка сообщения; это не уверен, что там могут быть побочные эффекты этого. Но в любом случае, мы только собираемся сделать это только чтобы сделать наш код смотреть чище. И производительность будет незначительным здесь.

Мы говорим о пользовательском интерфейсе. Это даже не близко. Единственное, что следует отметить, однако, прежде чем мы сделаем это так как мы реализовали как сеттер и геттер костюма, мы теперь должны сделать в знак синтезировать. Хорошо? Другими словами, как правило, мы не имеем

чтобы сделать это в знак синтезировать. Это делается для нас. Но если мы реализуем как сеттер и геттер, теперь мы делаем. Это легко сделать, потому что это всегда этого точно такой же формы. Но мы должны сделать это.

Хорошо. Так вот - давайте делать то, что мы говорили. Давайте возьмем этот маленький массив костюмов у нас есть в наличии и поместить его в другой метод. Теперь, опять же, я не получаю производительности, делая это, хорошо? Я просто получаю чистоту кода, делая это потому что я до сих пор - каждый раз, когда я называю действительные костюмы,

он собирается создать его снова. Теперь, я мог бы использовать статическую переменную. Это C. Я мог бы хранить этот массив. Вылетев быть равна нулю. Если это ноль, установите его в этом массиве, и тогда было бы создать только один раз.

Но будь осторожен. Опять же, чистота кода и по понятным причинам в десять раз важнее чем производительность, как это. Так что если вы не собираетесь назвать действительные костюмы во внутреннем цикле тысячи раз,

это на самом деле не собирается иметь значение. Но как только я двигаюсь, что вверх в другой метод, такого рода метод, который я перенес ее немного отличается. Обратите внимание на то, что есть плюс. Вы видите, плюс там вместо минус его запуска? Плюс NS массив действительные костюмы?

Хорошо. Способ плюс является методом класса. Хорошо? Это означает, что вы посылаете его к классу, не к экземпляру объекта. Отлично? Так, так как вы не посылая его к экземпляру, Вы не можете использовать любые переменные экземпляра или что-нибудь подобное.

Вы можете только вид делают общий материал. Так что единственное, что мы на самом деле использовать плюс методы, методы класса, это две вещи, на самом деле: создание вещей как и в предыдущем слайде, когда мы имели строку с форматом - это метод класса, который создает строку для нас; а затем также методы полезности, как это,

как константы возврата и вещи, которые, вы знаете, наш класс хочет и коммунальные методы. Но вот пример. И то, как мы называем метод класса - вы уже видели меня назвать несколько из них - но вот называть его здесь мы ставим открыть квадратные скобки,

имя класса, имя метода. И опять же, это может иметь аргументы. Это так же, как и любой другой метод. Но все это понимают? Хорошо. А если вернуться назад и посмотреть пару слайдов и вы видите, открытая квадратная скобка NS строка, строка с форматом,

точно такой же тип синтаксиса. Хорошо? Так вот что метод класса выглядит следующим образом. Опять же, для создания вещей в основном а также для вспомогательных методов. И мы будем говорить о разнице: Когда мы создаем что-то

с помощью метода класса по сравнению с Alloc INIT? Мы будем говорить о том, что в ближайшее время. Я также собираюсь сделать действительные костюмы общественности. И таким образом люди, которые используют свою игральную карту знаю, что действительные костюмы. И все, что мне нужно сделать, это положить его в файле заголовка.

Бум, теперь публичный. Хорошо? Так что давайте делать подобную вещь здесь с этими строками ранга. Хорошо? Так что я собираюсь взять эти ранги строки - что массив ранга строк прямо там - и я собираюсь поставить, что в методе класса.

Хорошо? И опять же, это для удобства чтения, а не для повышения производительности. Потому что каждый раз, когда я называю ранг строки, он по-прежнему будет чтобы создать эту вещь снова. А потом я называю это вместо того, чтобы там. И я не собираюсь сделать себя ранг строки общественности,

но я собираюсь сделать еще один метод класса, называемый максимальный ранг, который просто смотрит на сколько строки в ранге строк. И я собираюсь вернуться, что в качестве общественного метода. Таким образом, есть три метода класса для вас, чтобы погрузить Ваши зубы в - два из них общественности, не. Отлично.

И поэтому они все методы полезности, не так ли? Мы не доступ к любым переменным, например, в любой из этих методов, хорошо? Это единственная причина, я показываю тех, просто так вы видите, что метод класса выглядит следующим образом. Мы также могли бы переопределить метод установки ранга просто

чтобы быть полным здесь, чтобы убедиться, что он не позволяет вам установить неправильный ранг как множества ранга 15 - там нет такой карты, как 15. Так давайте удостоверимся, что ранг меньше максимального ранга, который является метод полезности мы только что сделали. Хорошо? Значит ли это все собрались вместе для вас, имеет смысл?

Так что это своего рода справочный материал. У вас есть эти слайды, которые имеют все аннотации из всех вещей, которые я говорю. Так что не стесняйтесь, чтобы вернуться и посмотреть на него и напомнить себе обо всех этих NS массив, синтаксис, и все методы класса, все прочее.

Хорошо. Последнее, что мы будем смотреть на метод инициализации бизнес. Хорошо? Таким образом, мы будем иметь еще один класс здесь под названием игральной карты колоды. Отлично? И игральная карта палубы является подклассом палубы.

Отлично? И это не имеет никакого публичного API. Это просто будет переопределить метод что он наследует косвенно от объекта NS - хорошо, NS объект через палубу, не прикасайтесь к ним - все пути к игральной карты колоды.

И этот метод называется Init. Хорошо? Так что это одно и то же инициализации, такой же вид метода что, когда мы создали этот массив - что изменяемый массив мы сказали NS изменяемый массив Alloc Init. Так что кто-то собирается назвать этот метод игральной карты колода инициализации - именно вы в вашей домашней работы собираются назвать это

делая игровой карты палубы Alloc, а затем на внешней стороне, инициализации. Хорошо? И это, как вы собираетесь чтобы создать игральную карту колоды. И это, как мы создаем большинство экземпляров объектов - далеко не все. Иногда мы делаем такие вещи, как NS строка, строка с форматом.

Но большую часть времени - более чем в половине случаев - мы делаем Alloc, а затем на внешней инициализации. Хорошо. Слушайте внимательно: Никогда не называйте эту вещь Alloc без обертывания инициализации вокруг него. Хорошо? Никогда не делайте этого. Это не имеет никакого смысла иметь объект, выделенный

в куче, которая никогда не была инициализирована. Всегда есть, что вложенные. И наоборот: Никогда не называйте, что кроме инициализации когда вы обернуть его вокруг Alloc. И, безусловно, никогда не называют, что инициализировать несколько раз. Хорошо? И если вы будете слушаться гласа Мое правило только назвав его обернут

вокруг Alloc, вы не можете назвать его более чем один раз. Хорошо? Init это не то, как вы можете повторно инициализации. Init происходит один раз сразу после Alloc, и это все. Хорошо? То есть твердое и быстрое правило, которое мы никогда не ломаются. Хорошо? Таким образом, вы слышали его здесь. Не стоит забывать.

Отлично. Давайте посмотрим на эксцентричный тип возвращаемого к этому методу инициализации, хорошо? Можно подумать, этот метод инициализации должен вернуть игральную карту палуба звезда, потому что это своего рода инициализации и, возможно, он возвращает себя. И в самом деле, это всегда Init Самовозврат, хорошо?

Так инициализации всегда будет возвращать себя. Хорошо. Более whackiness там, что я собираюсь описать. Просто для удобства, он всегда возвращает себя так, что вы можете сделать, как, играя карточная колода Alloc Init, послал ему сообщение. Хорошо? Так что это просто удобство, что он возвращает себя. Но это не может действительно иметь тип возвращаемого будучи игральные карты

палуба звезда, потому что он унаследовал это от объекта NS. А объект NS уже определил его как NS объекта звезды. Ты видишь? Так что это немного странно что вы наследуя метод которого возвращаемое значение будет иметь менять каждый раз, когда вы, вы знаете, отменяют его. Таким образом, они придумали эту новую вещь - это новый для прошивкой 7,

кстати - называется типом экземпляра. А что экземпляр типа означает, что это происходит вернуть объект, который имеет тот же экземпляр - такой же тип, такой же тип класса - В качестве объекта вы послали это сообщение. Хорошо? Который имеет смысл для inits.

И в этом классе, что, вероятно, все, что вы собираетесь использовать это для прямо здесь. Так что если вы на самом деле не понимаю, что я только что сказал - это объясняется в слайдах - но если вы на самом деле не понимаю, просто знаю, что всякий раз, когда вы делаете инициализатор,

он собирается возвращать тип экземпляра, как тип возвращаемого значения и вы всегда будете возвращаться себя. Хорошо? Теперь же просто поверьте мне на слово. Мы будем делать эти следующие строки кодов, а также потому что они действительно странно. Это первая линия, само равно супер Init, что странно.

Это супер странно. Хорошо? Присвоение что-то себе в Objective-C - просто никогда не делать, за это время, кроме одного и это в вашем INIT. Хорошо? Вы принимаете себя и вы назначаете его называть вашу Суперклассов инициализатору

чтобы ваш суперкласс инициализируется. Почему мы присвоить результат к себе? Это своего рода древней истории относительно того, почему это было сделано в течение длительного времени. В основном мы проверки возвращения наших Суперклассов инициализации чтобы убедиться, что он правильно инициализирован.

Потому что в любое время, если ваш инициализатор не может инициализировать сама по себе, она должна возвращать ноль. Хорошо? И это позволяет всем знать, какие из ваших подклассов или кто-либо пытается Alloc и инициализировать вас, вы не смогли создать хорошо сформированный объект. Хорошо? Таким образом, вы можете видеть, как этот код, как ни странно это -

само равно супер инициализации, а затем, если я, Я собираюсь инициализировать себя, вернуть себя - что собирается гарантировать, что я даже не пытаюсь инициализировать себя, если мой суперкласс, когда я называю его инициализации, вы знаете, не может инициализировать себя. Хорошо? Так просто сделать это.

Если вы не понимаете это, не беспокойтесь об этом слишком много. Просто сделай это. Теперь, одна вещь, здесь мы говорим о инициализировать без аргументов. Можно иметь инициализаторы с аргументами потому что иногда вам нужно аргументы

правильно инициализировать класс. И мы будем говорить о том, что немного больше в понедельник. Хорошо? Итак, сегодня мы просто собираемся вид голые кости Init. Так что же это INIT нужно сделать? Что мне нужно сделать, чтобы иметь хорошо сформированную инициализированному игру Колода?

Ну, игральных карт колода из 52 карт в ней, один из каждого вида карты. Хорошо? Король клубов, три из бриллиантов - все 52 из них. Так что я просто нужно перебирать всех мастей, а затем итерацию через все ряды, и создать карту, и добавить его к себе.

Так вот мне переборе костюмы, переборе ряды. Все круто с этим? Тогда я собираюсь импортировать игральную карту, потому что я собираюсь создать игральную карту, игральных карт Alloc Init. Тогда я собираюсь установить

Оценка этой карты, установить, что масти карты. Ранг и костюм мои маленькие итерационные переменные там. А потом я собираюсь добавить его к себе. Я колода, так что это прекрасно. Все круто с этим кодом? Так что теперь я хорошо сформированным игральной карты палубы, и я могу использовать

нарисовать случайные карты и все, что материал, который вы будете нуждаться чтобы сделать для вашего домашнего задания. Хорошо? И в самом деле, для вашего домашнего задания вы будете иметь набрать все четыре из этих классов. Я хочу, чтобы получить опыт классы въезжающих, набрав вещь, наблюдая, как Xcode жалуется на вас

как вы ошибетесь вещи, и тому подобное. И тогда вы собираетесь чтобы использовать игральной карты колоды и игральные карты. Ну, играть в карты колоды и карты на самом деле являются двумя основными из которых вы собираетесь использовать, чтобы сделать свою домашнюю работу. Хорошо? Вопросы по этому поводу?

Хорошо. Так вот именно для слайдов. Так что теперь я собираюсь сделать большой старый демо. И это демо будет интегрировать все, что вы видели до сих пор, все в порядке? В частности, что MVC вещи, которые мы говорили о том, как целевой действия, вы знаете, сбросив цель

и стрельба действие или зеленый выход со стрелкой что указывает на другую сторону. Хорошо? Мы собираемся показать вам, что что на самом деле выглядит как в Xcode. Я думаю, что, когда я спросил, кто из вас сделали Xcode, почти каждый из вас поднял руки.

Так что я не собираюсь тратить слишком много времени на разговоры о все кнопки в Xcode. Я думаю, что я буду быстро переходить те. Но если вы не использовали Xcode, это очень много деталей в лекционных слайдов. Там вроде этого руководства.

Кстати, если вы следуете в лекционных слайдов, мой демо не будет точно как то, что в слайдах. Слайды покрывают чуть-чуть больше, чем я могу покрыть Через сорок минут здесь. И это также справочный материал.

Хорошо? Так что, если я делаю что-то сегодня в этой демо-версии, и вы, как, "О, как он сделал это?" если вы посмотрите на этих слайдах, он расскажет вам. Так что не чувствую себя, "Я должен написать яростно вниз каждую кнопку мыши, что он собирается делать в ближайшие сорок минут ".

Ни за что. Хорошо? Следуйте вперед в этих слайдах, если вы хотите, или просто закрыть свой ноутбук, и смотреть, и пусть он тонет в потому, что вы будете иметь, чтобы воспроизвести то, что я делаю в течение следующих сорока минут для домашней работы. И эти горки собираются ходить вас

через шаг за шагом, как это сделать. Так что не чувствую, что вам нужно сделать что-нибудь прямо сейчас но пусть это все тонут в. Получите чувство для того, что происходит. Хорошо? А потом, когда вы садитесь, чтобы сделать это, вы будете руководствоваться через него.

На следующей неделе мы будем говорить гораздо больше о Objective-C, ответить на некоторые из этих вопросов более подробные как номер NS и некоторые из этих других вещей люди просят. И мы будем говорить о некоторых конкретных вещах о Objective-C, как динамическое связывание, и протоколов к ней, и вещи, которые вы вообще не видите, как много

на других языках или не существуют на других языках. Таким образом, мы будем стараться и покрыть все это. Так что к концу следующей недели вы находитесь до скорости в Objective-C. Вы начинаете реально работать с Xcode. И вот через неделю после того, что мы действительно можем начать делать некоторые,

Вы знаете, высокая мощность Ios 7 вещей. Хорошо. Так что демо здесь. [Неразборчиво], что. Отлично. Так что демо я собираюсь работать в Xcode. Так что я просто хочу, чтобы запустить Xcode.

Так Xcode вы получаете, запустив - идти к вашему Mac App Store. Вот эта вещь здесь, не так ли? Получить магазин приложений на вашем Mac, и вы просто искать Xcode, найти его. Это бесплатно. Вы скачать его и запустить его.

Хорошо? Это так просто. Это то, что это будет выглядеть, когда вы сначала привести его, этот экран заставки здесь. По мере того как четверть идет, это будет наполнять со всеми проектами, которые вы делаете. Вы, вероятно, привыкли к тому, что если вы знаете Xcode.

И что мы будем делать сегодня создать новый проект. Вы можете проверить существующий проект из системы управления версиями или вы можете создать новый. И таким образом мы собираемся создать новый. Поэтому, когда мы создаем новый, он хочет дать нам немного помощь, предложив создать шаблон для различных видов

приложений, таких как OpenGL, игры. Хорошо. Это создаст некоторые рамки, которые для вас. Мастер подробно приложения, то, что мы собираемся сделать позже в этом квартале, хотя мы будем строить все самим себе код; мы не будем использовать этот шаблон.

И этот единственный вид приложения прямо здесь в основном сингл MVC, который, как мы будем это начать все наших приложений в этом классе - с одной MVC. Затем мы собираемся добавить больше MVCS и наращивать. Хорошо? Так что это ваш основной сингл приложение MVC. Так что я собираюсь нажать это.

И вот он собирается попросить какую-то информацию о нем как то, что вы хотите назвать это приложение? Это соответствие карточная игра, я решил вызвать мачизме, хорошо? Так что это будет название нашего приложения просто для удовольствия. И название организации может быть все, что вы хотите.

Это будет появляться в заголовках всех классов, которые вы создаете. Так что я сделать мое быть Стэнфордского университета. Вы можете сделать ваше быть Боба Игра дом или любой другой. Этот идентификатор должен быть уникальным для вас. Так что у меня edu.Stanford.cs193p.instructor.

Вы можете иметь edu.Stanford.cs193p точка вашего Sunet ID. Это будет совершенно уникальным. Эти обратные DNS это действительно хороший способ чтобы создать уникальное имя. И он собирается создать уникальное имя для этого приложения

комбинируя это с именами. Таким образом, вы можете видеть, что это сделано, что здесь, этот идентификатор пакета. И тогда этот префикс класса - этот шаблон собирается создать представление и контроллер для нас. И это говорит: "Что вы хотите имя вашего класса контроллера быть? "

По умолчанию он будет называться "вид контроллера" хорошо? Но если вы печатаете что-то здесь, как "карточные игры," теперь это происходит будет называться "карточная игра вид контроллера" который немного лучше для нас имя. Так что это просто приставка он собирается поставить на имя вашего контроллера, который он создает для вас.

И тогда, наконец, здесь мы можем создать приложение здесь просто для IPAD, или только для iPhone, или универсальное приложение который будет работать на обеих платформах. Теперь, когда вы создаете универсальное приложение, вы до сих пор создать свой пользовательский интерфейс по отдельности потому что если у вас есть несколько правил экрана, вы только собираетесь

спроектировать другой пользовательский интерфейс. Хорошо? IPad это не просто большой iPhone. Вы можете сделать гораздо больше вещей если у вас есть больше экрана недвижимости. Но вы все равно можете иметь много вашего MVC поделился, правильно, потому что IPad может иметь маленькие подобласти, которые в MVC

что точно так же, как и на iPhone или очень, очень похожи. Таким образом, полностью поддерживается в прошивкой 7 создавать приложения что цель обеих платформ и имеет большие инструменты для позволяя вам создать свой два интерфейса по отдельности и разделить все MVCS под ним. Хорошо? Мы собираемся сделать iPhone только здесь просто

потому что он держит экран маленький и у меня только так много недвижимости здесь. [Неразборчиво] >> Пол Хегарти: Да. Таким образом, вопрос: Если я на моем IPad и я запустить приложение, которое только iPhone, да,

есть режим эмуляции, по существу, который будет своего рода из сделать большой iPhone-образную вещь на экране IPad. Итак, мы собираемся сделать iPhone здесь. Итак, это все. Я собираюсь ударить дальше. Далее он хочет знать,

"Где вы собираетесь его поставить этот проект?" Я настоятельно рекомендую положить его в свой домашний каталог - в директории под названием "разработчик" в вашем домашнем каталоге. Хорошо? Разве что, может быть, мы работаем над другим классом. Может быть, у вас есть CS 193P

в вашем домашнем каталоге, а затем другой класс. Но нижняя линия: Положите его в свой домашний каталог; не ставьте его, как, в корне или где-нибудь в этом роде. То есть в прошлом вызвало проблемы. Но большое место, чтобы поместить его здесь. Это мой домашний каталог, CS 193P там.

Я вижу домашний каталог, разработчик. Это где я собираюсь поставить его. У меня нет никаких проектов пока нет. Эта маленькая вещь здесь, контроль источника, мы будем говорить об этом. Это действительно красиво интегрирована в Xcode, но мы не собираемся

говорить об этом сегодня. Так что оставьте unclicked. Так вот наш новый проект. Вы можете видеть, что это показывает нам этот экран, который вы получите чтобы, нажав на эту самую верхнюю вещь здесь. Так что это вроде как наши настройки проекта.

И есть целая куча настроек здесь. Мы будем говорить быть все эти вещи, как четверть идет дальше. Но сегодня мы не будем говорить о какой-либо из него потому что мы хотим сосредоточиться на нашей MVC. И наш MVC, это прямо здесь, main.storyboard, на наш взгляд. Хорошо? Это наш взгляд на нашу MVC.

А потом вы видите эту карточную игру вид контроллера M и H? Это наш контроллер. Там нет модели здесь. Ваша модель будет эти четыре класса - палуба, карты, игральные карты, игральных карт колоды - что это будет ваша модель.

Таким образом, вы должны будете указать, что в. Я покажу вам, в конце концов, как это сделать. Эта маленькая вещь здесь, карточная игра [неразборчиво] точка Н и М, мы будем говорить об этом кратко, особенно, когда мы начинаем говорить о таких вещах, как многозадачность. Но мне нравится просто переместить те из пути.

Поэтому я часто положил их здесь, в этой папке с поддержкой файлов. И вы можете просто подобрать любой файл, кстати, и переместить их в любом месте вы хотите здесь, чтобы вид из очистит ваш взгляд. Так вот у меня есть мое мнение и мой контроллер только показывать здесь. Хорошо? Итак, давайте идти прямо к просмотру

и посмотреть, как это выглядит. Так вот мое мнение. Это пустой iPhone 5 размера, не так ли? Высокий и тонкий вид. И это поле пустым. Ничего нового.

Это белый. Эта область на левой стороне, кстати, где мы щелкнули на этих файлах, что называется "Навигатор". И вы можете не только перемещаться все ваши файлы здесь, но вы можете перемещаться по брейк-поинта, и строить проблемы, и ваши иерархии классов.

Все, что материал здесь. Так опять же, большинство из вас знает Xcode, так что вы, вероятно, знаете, большинство из этого материала. Мы будем записывать демо все это, как четверть продолжается. И эта область здесь называется "области коммунальных услуг." И это, где вы в основном узнать подробности

о том, что происходит здесь. Так инспекторов атрибутов и размеров, а также соединений, и тому подобные вещи, которые идут сюда. И это также, где вы можете вытаскивать вещи что вы собираетесь использовать для создания пользовательского интерфейса потому что мы собираемся строить нашу точку зрения полностью графически.

Хорошо? Мы не собираемся писать код, по большей части, чтобы построить наш взгляд. По мере того как четверть идет дальше, мы узнаем немного больше о том, как строить наш взгляд в коде, но мы собираемся начать вне как раз чисто делает наш взгляд графически тащат вещи вне и подключение их.

И мы поместим наш код в нашем контроллере. Эти две стороны могут быть скрыты и показаны с этими двумя кнопками. Видеть? Вы можете скрыть их. [Неразборчиво] Это может показаться также, эта область прямо здесь, эта маленькая кнопка вниз здесь. Это называется "документ наброски."

Это действительно удобно денди. Но опять же, мы не будем это говорить об этом сегодня. Мы можем говорить только о так много сразу. Документ наброски. Это лишний раз показывает все экземпляры объектов на ваш взгляд, в общем виде набросков.

Таким образом, вы действительно можете легко найти их и их отношения друг к другу. Другая вещь, которую вы можете сделать, это я не хочу этого iPhone 5 размера вещь, потому что мой экран с низким разрешением здесь так что он работает на проекторе. Так что я собираюсь нажать эту маленькую кнопку здесь,

что снижает меня до iPhone 4 размера. Хорошо? Или iPhone 4S. Теперь я высокий и худой. Но вы можете нажать кнопку назад и вперед и переместить их обратно вперед. И я просто пытаюсь сделать все, что помещается на экране здесь. Хорошо. Так что давайте просто нырнуть прямо в здание наш взгляд здесь.

То, что наша точка зрения будет сегодня является одиночная карта с тузом треф, написанных на нем. Хорошо? Это собирается быть. И я собираюсь быть в состоянии нажать на карте и он будет перевернуть, показать заднюю часть карты, а затем нажмите кнопку на него снова, она будет перевернуть обратно, чтобы показать мне туз

клуба снова - вперед и назад, вперед и назад. Хорошо? И ваше домашнее задание будет сделать это поэтому, когда карта переворачивается вверх он не показывает туз клубов, она показывает случайную карту из колоды. Хорошо? Это будет вся ваша домашняя работа, это из-за в понедельник.

Хорошо. Так давайте сделаем это. На самом деле просто. Мы идем в эту область прямо здесь, эту библиотеку объектов. Хорошо? Это третья кнопка здесь, показывают библиотеку объектов. И это, где все наши объекты. Если вы посмотрите здесь, и вы не видите эти объекты,

это может быть стоит нажав на ваш взгляд. Иногда Xcode хочет знать, что адресат что вы собираетесь перетащить вещи в. Так что если вы нажмете на нее, то вы будете видеть эти вещи. И мы только собираемся, чтобы захватить одну из этих кнопок прямо здесь. Так что я собираюсь выбрать эту кнопку вверх и перетащите его.

И обратите внимание, как я перетащить его, эти маленькие голубые линии появляются - эти принципы. Хорошо. Эти рекомендации играют очень важную роль. Они, кажется, так же, как удобства для помогать вам положить его прямо в середине или вправо в правом углу.

И они есть, но они очень важны для убедившись, что что все вещи в вашей точки зрения являются своего рода, как, стандартное пространство друг от друга, не так ли? И выстроились к краям. Так что, как пользователи идут от одного приложения к другому, вещи все будут отделены друг от предсказуемых пространств

и все будет соответствовать. Это действительно важно. И есть механизм - вы можете увидеть этот переключатель прямо здесь, использовать Автокомпоновка, которая была введена в IOS 6 и значительно улучшилось в прошивкой 7, особенно в Xcode - что позволяет, когда ваш пользовательский интерфейс изменяет размер,

как она идет от быть iPhone 4 на iPhone 5, или она вращается от того, чтобы быть по вертикали по горизонтали, или это на IPad в большем пространстве. Для всех кнопок и все, чтобы вид переезда в новое положение, что имеет смысл или, по крайней мере, большинство из них, не так ли?

И тогда, возможно, вы, возможно, придется переместить некоторые из них вручную, в зависимости от того, что происходит. Но это в основном автоматически кладет ее. И это действительно важно потому что я уверен, что устройства будут по-прежнему разные размеры как новые, вы знаете, устройства выходят за эти годы.

Так делать авто макет имеет важное значение, и эти голубые руководящие принципы номер один наиболее важный вещь для автоматической компоновки. Мы собираемся, чтобы покрыть Автокомпоновка в деталях, и есть много к нему. Все эти кнопки здесь нужно делать с Автокомпоновка.

Но получить эти синие руководящие принципы, убедившись, что вы уронили вещи по меньшей мере, одного синего руководства где-то, что действительно важно к виду получить ты вниз правильный путь с должным автоматически выкладывается UI. Таким образом, мы имеем эту кнопку здесь.

Но прежде - и, конечно же, мы можем пойти здесь чтобы это инспектор атрибутов и нажмите на нее. И мы увидим, все виды атрибутов. На самом деле, если бы я это скрыть, тонны и тонны атрибутов для этой кнопки. Хорошо? Не только сама кнопка,

но на самом деле его суперкласс имеет атрибуты. Контроль является его суперкласс, а затем взгляд суперкласс элемента управления и он имеет атрибуты. Хорошо. Так что это объективно-ориентированный инспектор которая покажет все атрибуты всех вещей

через иерархии наследования. А что здесь происходит это мы на самом деле редактирования экземпляр кнопки здесь. Таким образом, мы не - и я знаю, в некоторых системах вы макете кнопку, вы установите размер, и вы установили атрибуты.

И потом, вы знаете, за кулисами кучу кода генерируется для создания кнопки. Это не то, что мы здесь делаем. Мы на самом деле редактирования живые объекты. Они по существу будет сублимационной сушке. И тогда, когда работает ваше приложение, добавить воду, они приходят к жизни, все в порядке,

с их атрибутами набора, и все их размеров и позиций, и все их автоматической компоновки информации в объекте. Хорошо? Так что это немного иначе, чем вы могли бы быть использованы в некоторых других системах. Так или иначе, прежде чем мы редактировать атрибуты этой кнопки, хотя, давайте изменим наш фон

потому что это карточная игра. И большинство карточных игр включены, как, зеленое сукно, не так ли? Так давайте сделаем наш фон быть больше похож на зеленое сукно. Так что я просто хочу, чтобы нажать на задний план, что эта точка зрения прямо здесь, и вы можете увидеть его свойства. Так что я собираюсь изменить пару -

или только один из его свойств - которая является фоном. Вы видите этот фон белый цвет прямо здесь? Так что, если я нажимаю на это, у меня есть некоторые недавно использовавшиеся цвета. У меня есть все эти виды черного и белого цветов. И у меня есть другая. И я воспитываю другой, воспитывает мелки, хорошо?

Он также вызывает другие способы выбора цвета, но мне нравятся цветные карандаши. Хорошо? И вот где мои мелки? Там они. Так что давайте выберем зеленый, как, мох является хорошим зеленым. Клевер. Я вроде как мох лучше.

Так что это своего рода карточная игра фона. Вот и все. Таким образом, мы установили цвет фона наших взглядов. Хорошо? И все настройки атрибута так же, как это: Вы просто установить его и забыть о нем. Так что давайте вернемся к кнопке и ее свойства.

Хорошо. Кнопка Я хочу, чтобы выглядеть как карты. Ну, кнопка в основном прошивкой 7 выглядит много как гиперссылка на веб-странице, так же, как эта кнопка делает прямо там. Хорошо? Это синяя кнопка. Это на самом деле не подходит для того, что мы хотим.

Мы хотим, чтобы это выглядело как карту с небольшим округлым прямоугольнику и белый фон, не так ли? И я хочу, задняя часть карты, чтобы выглядеть так же, но есть какой-то дизайн на него или что-то в этом роде. Так как я собираюсь сделать это, я собираюсь чтобы установить фоновое изображение для моей кнопки.

Хорошо? Фоновое изображение, как закругленным прямоугольнику. Итак, давайте немного в сторону здесь и говорить о том: Как мы получаем изображения в наше приложение? Хорошо. Мы хотим использовать изображения в нашем приложении; это очень распространенная хотеть использовать образы в графическом приложении, как на телефоне.

Итак, как вы это делаете? И ответ вы идете сюда на это место называется "Библиотека активов изображение" - images.xc активы или Xcode активы. И вы можете увидеть уже есть пара слотов для иконок здесь.

Они не установлены, но это значок приложения. А также вы можете иметь запуска изображение, которое будет отображаться мгновенно когда кто-то запускает приложение. А потом, как вы инициализации, имея за плечами стартового изображения, а потом он покажет вам фактический пользовательский интерфейс. Так что это своего рода быстрого запуска образа.

И мы будем говорить об этом в понедельник. Мы будем установить приложение фон для мачизме здесь. Но я собираюсь на самом деле перетащить каким-либо другим образом. Так что у меня есть некоторые изображения здесь. А к примеру, у меня есть этот логотип Stanford прямо здесь. Так что я собираюсь тащить, что Стэнфорд логотип

, потому что я хочу, чтобы использовать его. Вот и все; вы просто перетащить его сюда. Это говорит Стэнфорд. Но обратите внимание, что это своего рода от того, имеет эту странную вещь здесь, это 1X и 2X. Ты видишь это?

И это потому, что каждый образ, который вы собираетесь использовать в ИО хочет иметь нормальную версию разрешения, что происходит которые будут использоваться как на iPhone 4 - nonretina дисплеи в основном. А потом 2X, в два раза выше разрешение - тот, который будет использоваться на сетчатке. И он будет автоматически выбрать правильный,

в зависимости от того, что вы работаете на. Хорошо? Вам не нужно делать ничего об этом. Но вы хотите, чтобы обеспечить эти высокие Рез из них. И эти высшие разреш из них являются не только обязательно точно такой же образ, просто, вы знаете, сделали более высокое разрешение. Они могли бы позволить вам делать -

например, здесь у меня есть логотип Stanford с небольшим деревом. Видеть? Смотрите дерево там? Так что, может быть, это слишком низкое разрешение чтобы действительно получить хороший вид дерева. Но я могу получить дерево при более высоком разрешении,

так что я положил его туда. Так что это не так часто, что два из них будут на самом деле отличается вид, но они могли бы быть. Конечно разрешено они могли бы быть. Я также не хочу, чтобы на самом деле называют это "Стэнфорд". Я собираюсь использовать это в качестве моей резервной карты.

Вместо того, вы знаете, какой-то дизайн, Я буду иметь логотип Стэнфорд быть обратно моей карты. Когда мой карточный перевернуто вниз, и я вижу спину, Я собираюсь увидеть стандартный логотип. Так что я буду называть эту "карту обратно." Я могу назвать это все, что я хочу.

У меня также есть вещи для фронта здесь. Это прямо здесь. Это пустая карточка с закругленным углом. Там он. Вы не можете видеть это. Потому что это белая карточка, так что вы не можете видеть это.

Но я собираюсь использовать это. Я буду называть это "фронт-карты." И я также собираюсь иметь версии с высоким разрешением о том, как хорошо. Хорошо. Так что это хорошо. Так что, насколько мы можем видеть его.

Хорошо. Так что теперь я получил некоторые изображения. А теперь я хочу, чтобы использовать их на мой взгляд. Я вроде хочу, чтобы установить эту карту, чтобы использовать эту функцию. Так что я собираюсь начать с моей карты здесь быть лицом когда он работает. При запуске мое приложение, карта собирается начать лицевой стороной вверх.

В вашем приложении, когда вы получаете вашу домашнюю работу вы, вероятно, хотят, чтобы запустить его лицевой стороной вниз. Причиной этого является мое приложение показывает только одну карту: Ace клубов. Так что это нормально, если он приходит с тузом треф. Но вы не хотите, чтобы ваша карта придумать туз клубов наверняка.

И это могло бы быть немного больше работы для вас кодирования-накрест инициализировать его, чтобы придумать какой-то случайной карты. Так что я буду только это придумать ничком. Сделать это намного проще на вас. Хорошо? Так как же мы установили, что? На самом деле просто.

У меня есть кнопка, выбранный здесь. Вот его свойства. Одним из его свойств является его фоновое изображение. Хорошо? Так что я просто хочу, чтобы нажмите здесь, и вы можете увидеть что все изображения, которые находятся в моей библиотеке активов будет здесь. Хорошо? И если там было действительно много,

вы можете ввести и это будет соответствовать его. Так что я собираюсь сделать это будет передняя карта. Так что он сделал это карта фронт, но я не вижу - где закругленный прямоугольник? Хорошо? Я не могу видеть скругленный прямоугольник. И это потому, что он слишком мал

чтобы увидеть закругленные углы здесь очень хорошо. Таким образом, вы можете просто взять эту вещь и изменить его размер. Хорошо? И я собираюсь сделать это - Я хочу, чтобы это было около двух-трех [неразборчиво]. Так что я собираюсь сделать это 64 на 96. Я знаю, что это случается очень хороший размер, и я его изменении размера.

И теперь вы можете увидеть маленькие закругленные углы. Ты видишь? Так что это то, что образ, который я потащил с использованием кнопки написано на нем. И, конечно же, я переместил его немного, так что я могу поставить его обратно в середине, используя мои голубые принципы, не так ли? И, конечно же, я не хочу, чтобы моя карта, чтобы сказать "кнопка" это;

Я хочу, чтобы туз клубов здесь. Так что я собираюсь просто дважды щелкните на нем. Я также мог бы изменить, что здесь. Вы видите прямо здесь, где он говорит, что "кнопка"? Нажмите здесь. Я просто хочу, чтобы дважды щелкнуть непосредственно на нем.

Я собираюсь ввести "туз". И как я типа клубы, кто-нибудь знает? Alt-то или другое. Я хотел бы сделать этот путь. Я иду, чтобы изменить меню, специальные символы, получить эту волшебную вещь.

Вы когда-нибудь видели это, вроде круто? Просто дважды щелкните - найти клубы и двойной щелчок. Отлично. Так что мой туз треф. Теперь, но, вы знаете, что это не совсем правильно, либо. Я не очень нравится, что синий А. Я действительно хочу А быть черным.

И это может быть немного больше. Там больше места для него. Так что я могу пойти здесь, к примеру, и изменить шрифт. Я могу изменить его, нажав на эту маленькую вещь, чтобы сделать его больше, или я могу на самом деле нажмите на эту T и даже установить какой шрифт это. Одна вещь, которая действительно важно

в прошивкой 7 является типографика. Хорошо? Выбор правильных стилей текста действительно, очень важно в прошивкой 7. И мы не будем действительно говорить об этом здесь; мы просто будем использовать системный шрифт. Но это то, что мы будем говорить в лекции,

убедившись, что вы выбираете правильные шрифты в нужных местах чтобы сделать внешний вид пользовательского интерфейса очень приятно. Я могу изменить размер здесь, может быть, 24 пункт или что-то типа того. Это будет по-прежнему соответствовать. И тогда я не хочу этого синего, так что этот цвет текста.

Так что давайте идти вперед и сделать это черный. Отлично. Так я получил карточку, глядя, как я хочу. Это хорошо. Все эти свойства, которые мы устанавливаем, кстати, если вы посмотрите на кнопку, вы видите это состояние конфигурации прямо здесь?

По умолчанию? Мы можем на самом деле установить все эти вещи по-другому для выделенного состояния кнопки, или выбранное состояние или неактивное состояние. Но мы устанавливаем их по умолчанию. Так что все наши кнопки всегда будут чтобы отображать состояние по умолчанию.

Хорошо? Так что кнопки довольно мощный. Вы можете иметь их выглядеть по-разному, как они подчеркивают или независимо от того, но мы будем работать все в то, что называется "Нормальный" или "по умолчанию" состояние кнопки. Вы увидите, что когда мы перейдем к коду. Таким образом, мы действительно можем запустить это прямо сейчас.

Так работает. Вы все - больше всего, опять же, сделать Xcode. Вы знаете, как работать. Именно эта маленькая кнопка воспроизведения. Вы можете фактически держать его вниз, и есть другие вещи, которые вы можете сделать, как испытания и анализа.

Но мы только собираемся бежать. Так я нажимаю бежать, и он собирается запустить это в симуляторе. Хорошо? И вот оно. И вы можете увидеть, что имитатора настолько большой, он даже не помещается на экране. Так что я вроде должны прокручивать в нем.

И когда я нажимаю, он ничего не делает. Хорошо? Так что это не хорошо. Отлично. Потому что я не положил какой-либо код в мой контроллер, чтобы ответить к этой вещи трогают. Так вот что мы будем делать дальше.

Так что давайте вернемся сюда и остановиться. Хорошо. Так как же мы это делаем? Ну, это довольно интересно, как мы делаем это, на самом деле. Я собираюсь сделать несколько больше места здесь. И то, что нам нужно сделать, это подключить к нашему контроллеру. И мы делаем это, поместив код на стороне нашего контроллера

бок с нашей точки зрения. Отлично? Так что я собираюсь нажать эту маленькую кнопку здесь, этот значок кнопки, и это ставит бок о бок. И по умолчанию, если у вас есть вид здесь на левой стороне, он собирается поставить код, который контроллера справа.

И вы можете переместить это, чтобы получить больше места для кода, если вы хотите. Вы также можете переключаться между заголовком, если вы хотите сделать общественный материал или реализацию. Хорошо? Так что это хорошо. Теперь этот код прямо здесь является частью

жизненного цикла контроллера представления, который мы собираемся говорить в двух-трех недель. Но сегодня мы не будем говорить об этом. Таким образом, мы можем просто избавиться от него. И давайте просто начать, сказав: "Когда эта кнопка становится трогали, мы хотим, чтобы перевернуть ".

Так что нам нужно сделать соединение между нашим видом и контроллером. И мы собираемся сделать эту вещь, где мы вешаем цель вне и стрелять стрелку. Хорошо? Названный "целевого действия." И это будет своего рода юродивый.

Вы даже вероятно, не будет верить в это, когда вы видите его. Способ сделать это, удерживая нажатой клавишу управления. Так что я, удерживая нажатой клавишу управления, и я перетащив линию с точки зрения непосредственно в наш код. Отлично? Хорошо? И я отпустил.

И он говорит: «О, вы хотите связь между вашей точки зрения и контроллер, не так ли? Вот то, что мне нужно знать ". Так спрашивает нас: "Что вы хотите, вы назвать это соединение? " Так что это будет название метода.

Это на самом деле собирается создать метод, который здесь вызывается когда кнопка получает прикосновении. Я буду называть его "кнопку карты коснитесь." Это хорошее имя. Вот он говорит: "То, что вы хотите, тип аргумента быть? "

Мы поговорим об этом позже, но сейчас мы, несомненно, хотим аргумент быть кнопка что посылает нам это действие, хорошо? Который будет хорошо, потому что тогда мы будем говорить вернуться к нему и сказать ему, чтобы перевернуть себя снова. Там в другие вещи, которые мы можем установить здесь, как:

Какие события вы хотите отправить это действие? И вы можете установить его таким образом, нет никаких аргументов, он просто посылает кнопку сенсорной карты без каких-либо аргументов. Но здесь мы хотим, чтобы иметь аргумент отправителя, кнопка отправки этого сообщения. Вы даже можете отправить сенсорную событие вместе,

но мы почти никогда не будет, - на одну десятую процента от времени. Так что здесь я буду иметь отправителя. Поэтому, когда я нажимаю подключиться, он создает новый метод. И этот метод подключается к этой кнопке. На самом деле, вы видите этот маленький круглый круг? Если я мыши над ним, он покажет вам, что то, что это

подключен к. Хорошо? Так что это просто какой-то вполне нормально выглядящий метод Прямо здесь. Тип возвращаемого значения, действие IB, что на самом деле ЬурейеЕ пустота. Этот метод фактически возвращает недействительным. Причина, по которой Xcode ставит действие IB есть

и IB действие TYPEDEF к аннулированию, это просто так, что он может сказать какие методы являются мишенью действия так что он может делать такие вещи, как это. Хорошо? Мыши над. Но компилятор игнорирует. Компилятор видит его как пустоту, потому что это ЬурейеЕ к мочеиспусканию.

Это чисто Xcode вещь к этому IB действие вещь. И тогда вы можете увидеть этот метод имеет один аргумент, которая является отправителем. Это кнопка отправки нам это сообщение. И он собирается отправить это сообщение каждый раз, когда прикосновение идет вверх внутри кнопки.

Нажмите внутри, не так ли? Это было событие. Так что, когда он собирается отправить это сообщение. Так что это прекрасно. Это то, что мы хотим. Так что каждый раз, когда это происходит, то, что мы хотим сделать?

Ну, мы хотим, чтобы перевернуть карту более. Хорошо. Итак, давайте начнем с просто листать его на спину. И то, как мы собираемся сделать это, мы будем создать локальную переменную с именем "Изображение карты". Хорошо. И вы заметили, он пытался помочь мне типа там, и вы будете видеть много помогает здесь.

И UI изображение еще один класс в IOS, хорошо, так же, как кнопка UI является классом. UI изображение класс, как вы можете себе представить, хранит изображение. Может быть изображение JPEG, может быть анимированный GIF, это может быть TIFF изображения, что угодно. Хорошо? Так что это очень мощный класс изображений холдинг.

И у него есть метод класса под названием "изображение с именем" и вы даете ему строку типа передней карты или карты обратно, не так ли? И это будет выглядеть в библиотеке активов и дать изображение правильного разрешения, в зависимости от того, что происходит чтобы идти дальше - на самом деле, это даст вам изображение с обеих резолюций.

А потом в зависимости от того, где вы отобразить его, то это будет, вы знаете, выбрать правильное решение, будь то на сетчатке или нет. Так что это круто. Мы получили изображение. Так что теперь мы только собираемся сказать кнопку, чтобы установить это в качестве фонового изображения вместо что бы ни на это прямо сейчас.

Таким образом, чтобы поговорить с кнопкой, мы делаем открыть квадрат отправителя кронштейн. Правильно? Вы видите, что отправитель кнопка посылает нас это сообщение. Хорошо? Задавать. Хорошо, я собираюсь начать печатать набор фоновых. И вы видите, как я начинаю набирать, Xcode предлагает,

мне, что я мог бы хотеть. Теперь он знает, что отправитель это кнопка UI, так что это только предлагая методы кнопок здесь, которые начинаются с множеством B - установить цвет фона, установить фоновое изображение, и установить границы. Хорошо? Обратите внимание, я также получаю некоторую помощь в нижней части.

Смотрите, разве это не круто? Немного одна или две линии помощи? И я мог бы нажать на эту ссылку и было бы взять меня к документации. Мы не собираемся делать это по причинам времени. Но я могу просто нажать одну и он выбирает, что один

и сразу же выбирает первый аргумент. Так что я могу принять это. Хорошо? Так что я буду делать это. Изображение карты. И обратите внимание здесь, когда я типа CA, есть много вещей, которые начинаются с ЦС, которые могли бы пойти туда.

Но Xcode в довольно умный. Он знает, что локальная переменная имеет гораздо больше шансов, что вас хочу здесь, чем все эти другие CA - Функции, которые начинаются с CA. Так он автоматически выбирает, что для меня. И если вкладка я ударил, кстати,

это будет в основном избежать ее завершения. [Неразборчиво] А если я ударил другую вкладку, она идет сюда. Этот маленький четыре состояние вещь только то, что я говорил о том, где вы можете установить это для подсвеченного состояния, или выбранное состояние, или в отключенном состоянии. Мы просто будем делать нормальный

или по умолчанию состояние этой кнопки. Хорошо? Таким образом, мы устанавливаем фоновое изображение для этой кнопки. И мы также должны установить название, потому что мы не хотим чтобы увидеть, что туз треф, когда мы переверните его в обратном направлении. Так что я просто хочу, чтобы установить его к этому.

Хорошо. Это пустая строка. Я мог бы также сказать, ноль там. Хорошо. Но я говорю просто пустая строка чтобы увидеть, что пустая строка выглядит. Так что на самом деле, если мы выполним это, команда три. Хорошо, давайте попробуем это.

О, круто. [Неразборчиво] Так что вы идете. Так что есть миниатюрный вариант. Хорошо. Так вот наша карта. И если я нажимаю на него, о да, она переворачивается. Да. Стэнфорд логотип с деревом. Но теперь, если я нажму, не делать ничего другого;

она всегда переворачивается на спину, что это именно то, что наш код делает, не так ли? Так что это хорошо. Так что давайте исправим это так, чтобы он переворачивается в обоих направлениях. Хорошо? И я собираюсь сделать это, говоря, если - на самом деле, я собираюсь сделать еще одну вещь в первую очередь

чтобы сделать этот код немного проще вместо этого иметь эту локальную переменную, я могу просто взять это и вытолкнуть его прямо там. Хорошо? И это очень часто, чтобы сделать это. И если бы я хотел, чтобы обернуть его, он будет автоматически оберните если я делаю это слишком короткий.

Но я могу также поставить возвращение туда. И когда я делаю, посмотрите, что он делает с двоеточием. Посмотрите, как это строки двоеточие вверх? Он всегда будет делать это. Если вы нажмете возвращение в середине Послать сообщение который имеет несколько аргументов, он будет выровнять колонов

для всех аргументов. Очень круто. Таким образом, вы можете увидеть все аргументы выстроены слева и справа. Так или иначе, я собираюсь проверить, чтобы увидеть, если нынешнее название - хорошо, что это метод кнопка - если это строка. Если такой длины, хорошо, отлично от нуля, все в порядке -

так что тестирование там, чтобы увидеть, если длина отлична от нуля - что это хороший способ сделать это, потому что будет работать если название кнопки равна нулю или, если это пустая строка. Поскольку название кнопки начинается ноль. Если вы не установите его на что-нибудь, она начинается ноль. Так вот с одной строки кода, который я проверил, как начальная

состояние, возможно, - не в нашем случае, потому что мы устанавливаем заголовок в клубе - но в вашем случае это может быть. Тогда мы установим его на одну вещь, иначе мы установим его на другую вещь. Таким образом, мы просто хотели, чтобы установить это к этому. Отлично?

Так что, если есть название на кнопке, другими словами, у него есть туз клубов, то мы будем переключиться на спине. А если нет название на кнопке, то мы будем чтобы переключиться обратно на фронт. Хорошо? Ace клубов.

Хорошо? Так что теперь, когда мы бежим, наша карта будет переворачивать в обоих направлениях. Хорошо? Так что на самом деле просто телеграфировать материал в контроллер, чтобы делать то, что вы хотите. Следующее, что мы собираемся сделать, это в - хорошо, я покажу вам очень быстро здесь. Если удерживать нажатой клавишу опции, очень важный ключ,

Вы видите, как он ставит знак вопроса и начинает выделение вещи? Это собирается, чтобы позволить вам перейти в документации. Так что, если я хочу, чтобы узнать больше об этом нынешнее название, если я ударил вариант, нажмите на нее -

Видите ли, я получаю немного помочь здесь. Это свойство. Это только для чтения, это неатомической. Кстати, если вы видите "сохранить" в документации, это то же самое, как "сильный". Хорошо? Сохранение такой же, как сильна в основном.

Немного описания здесь, но и гиперссылок. И если я нажму на одном из этих гиперссылок, как этот, он принимает меня в документацию. Это отдельное окно прямо здесь. И вы можете перемещаться в этой документации. Вы действительно хотите, чтобы ознакомиться со всем этим.

Я не могу показать вам все сегодня за нехватки времени, но вы можете делать такие вещи, как поиск, как я могу пойти найти кнопку UI здесь. Хорошо. Там в кнопку UI. Я мог бы прокрутить вниз и пойти, например, набор фоновых изображений или установить фоновое изображение

для государства, которое мы только что видели. Может быть, я нажму идти UI изображение. Вы видите все это. Там приятно описания класса в начале а затем все методы и т.д., и т.д. Так что определенно хочу чтобы стать мастером этой документации.

Вы можете также вариант двойной щелчок на вещи и он пошлет вас прямо к документации. Если вы не хотите, чтобы получить небольшую помощь один первый, Вы можете пойти прямо в. Так что вариант является ключевым для этого. Давайте пойдем дальше - все в порядке.

Обратите внимание на то, что это небольшое пространство вдоль дна здесь появился когда мы запустили приложение - вы видите, что? Это отладчик на левой стороне, и это консоль справа. Хорошо? И вы, безусловно, будет использовать отладчик а консоль как в этом классе.

И на самом деле, я мог бы иметь время, чтобы сделать быстрый - показать вам, как сделать консоль. Но в любом случае, вы можете скрыть его, перемещая его вниз или же нажав на эту вещь [неразборчиво]. Отлично. Так что следующая вещь, которую мы собираемся сделать, это мы собираемся

положить немного ярлык на наш пользовательский интерфейс, который подсчитывает щелчки. Хорошо? Немного инкрементный вещь что увеличивает каждый раз, когда есть флип. И мы делаем это, возвращаясь сюда и хватая себя ярлык. Таким образом, метка только для чтения фрагмент текста, нередактируемого текста.

И я просто хочу, чтобы перетащить его сюда и поместить его в левом нижнем углу. Я собираюсь дважды щелкнуть на нем, чтобы назвать его «переворачивается двоеточие ноль." Это то, что я хочу, чтобы выглядеть, когда мой первый интерфейс запускает. Теперь вот, я никогда не будет разговоров по этому вопросу и в результате чего сообщение будет отправлено как кнопка;

это наоборот. Мой контроллер хочет поговорить с этим и сказать ему когда переворачивает все время меняется. Хорошо? Таким образом, вы можете подумать, что вы бы перетащить из вашего кода вниз к этому переворачивается, но, к сожалению, вы не сделаете этого. Вы по-прежнему удерживая контроль и перетащите отсюда.

Но вместо того, чтобы перетащить его вниз в вашей области реализации, вы перетащите его в область интерфейса, потому что вы собираетесь чтобы создать свойство, соединяющую на эту метку в основном. Таким образом, мы делаем это. Мы получаем вещь здесь.

Он просит нас немного разные вопросы: "Как зовут этого свойства?" Я буду называть его "щелкает ярлык." Хорошо? Обратите внимание на то, что это свойство является слабым. Хорошо? Когда я нажимаю подключиться, он собирается сделать здесь недвижимость и это будет слабым.

Это первый раз, когда мы видели слабой по сравнению с сильным. Причиной этого является истомлено потому что эта метка прочно удерживаются самой точки зрения. Таким образом, нам не нужно иметь сильный указатель на него, чтобы держать его в куче. Вид будет.

И если эта метка всегда оставляет точку зрения, он будет получать вычищены из кучи. И это свойство - это указатель на него - будет получить набор к нолю, что это именно то, что мы хотим. Потому что, если что переворачивает метка не в представлении, мы не хотим чтобы обновить его и отправить ему сообщение.

Так что это большое использование слабых здесь. Это нормальное свойство, которое вы привыкли за исключением того, для этого, может быть выходом IB. Это так же, как действия IB. Это бессмысленная вещь, компилятор игнорирует что Xcode использует.

Хорошо? Так что он может сделать это - показать вам, что это связано чтобы при наведении курсора на него. Хорошо? Кстати, вы можете увидеть все соединения по правой кнопкой мыши на вещи. Так вот я просто щелкнуть правой кнопкой мыши по кнопке и вы можете увидеть его соединения.

Если вы когда-нибудь хотите переименовать - как если мне не нравится сенсорной кнопки карты, я хочу, чтобы переименовать его к чему-то, вы не можете просто переименовать, к сожалению. Вы должны идти сюда, щелкните правой кнопкой мыши, использовать эту маленькую вещь, чтобы отключить его, а затем контролировать сопротивление снова.

Хорошо? Все получили, что? Это печально. Было бы очень хорошо, если бы Xcode мог отслеживать что для вас, но она не может. Так что если вы когда-нибудь хотите переименовать что-то, вы должны отключить его здесь, щелкнув правой кнопкой мыши на нем,

а затем контролировать перетащить новый и установить имя таким образом. Можно также щелкнуть правой кнопкой мыши на этого маленького парня и он покажет вам все соединения для вашего контроллера. Воспитывает это окно. И я могу увидеть этикетку. Ты видишь? Я передвигая мышь над кнопкой.

Метка. Там же эта маленькая недвижимость здесь, что-то вы еще не видели, которая в основном это свойство, которое указывает на весь вид из вашего контроллера. Так что это подключение к контроллерам. Смотрите, он говорит: "карточная игра вид контроллера"?

Хорошо? Так что это щелчок правой кнопкой мыши. Я правой кнопкой мыши здесь. Отлично. Так как мы собираемся сделать эту работу щелкает ярлык? Мы собираемся поставить его в сторону ни на секунду. Давайте не будем думать об этом.

Давайте вместо того, чтобы сделать еще одно свойство. Имущество. Который является атомарной, который только собирается чтобы быть INT, который я буду называть "подсчет флип". Хорошо? Таким образом, флип-счетчик просто целое число, которое происходит чтобы сохранить количество перестроек. И наблюдать за этим.

Некоторые больше места здесь. Иди туда. Я просто собираюсь спуститься сюда и сказать self.flip подсчет плюс плюс. Хорошо? Теперь, значит ли это назвать сеттер или газопоглотитель для флип рассчитывать? И то и другое. В точку.

Это вызывает как сеттер и добытчик. Это вызов добытчика, чтобы получить количество флип, то это плюс plussing его; а затем он звонит сеттера, чтобы установить его обратно. Хорошо. Так что это своего рода фанки подкладкой кода прямо там. Это то же самое, как говорят граф self.flip равен self.flip

рассчитывать плюс один. Так что это вызов геттера и сеттера. Хорошо. Так что теперь у нас есть этот хороший счет флип. Это отслеживание подсчета; как мы зацепить, что до на эту вещь здесь? Что я собираюсь сделать немного больше, кстати.

Хорошо. Как мы зацепить, что таким образом, что говорит переворачивает одну толстую кишку, переворачивает толстой кишки два, три переворачивает толстой кишки? Ну, мы собираемся сделать это с помощью сеттер для флип подсчета. Хорошо? Так обычно сеттер для флип подсчета будет выглядеть следующим образом. Хорошо? А вот еще большое использование сеттеров и добытчиками, который должен поддерживать пользовательский интерфейс в синхронизации со свойством.

И я буду просто делать это, говоря, ярлык self.flips - переворачивает label.text равно - ой, извините. Это трудно набрать стоя. Равно NS строка, строка с форматом, которую вы видели раньше, переворачивает двоеточие процентов количество D self.flip. Хорошо? Так что теперь каждый раз, когда отсчет флип изменяется мы собираемся

для обновления пользовательского интерфейса. Имеет смысл? Есть вопросы по этому поводу? Хорошо. Так что давайте работать. Хорошо. Вот наша вещь. Таким образом, щелчок, переворачивается, флип обновления подсчета.

Флип, флип, флип, флип. Назад и вперед работать, и количество флип отслеживания от того, сколько перестроек мы делаем. Хорошо? Таким образом, вы можете увидеть этот материал действительно просто телеграфировать. Хорошо? И, вы знаете, когда вы получаете в строительных даже сложных приложений,

потому что вы всегда будете использовать эти же механизмы с целевым действием и торговых точек, и вы собираетесь чтобы использовать инкубационных и добытчиками, чтобы держать вещи в синхронизации, это будет легко для людей чтобы понять, как работает ваш код. Они знают, где искать, чтобы увидеть, где обновление пользовательского интерфейса происходит,

и т.д. Я собираюсь сделать еще одну вещь здесь. Уделите минуту и ​​показать вам NS войти. Хорошо. Я сказал вам, что вы могли бы войти что-то в консоли. Так что давайте делать каждый раз, когда эта вещь меняется, давайте сделаем журнал NS. Так что это просто функция C.

И вы даете ему строку форматирования, как Printf. Так что я скажу счетчик флип равен процентов количество V self.flip. Хорошо? Таким образом, вы просто положить, что журнал NS там, и теперь, когда мы бежим вы собираетесь, чтобы увидеть его в консоли. Это собирается придумать, когда я нажимаю, и это будет сказать, что здесь произошло.

Кстати, конечно, я могу сделать это шире. И вернуться к тренажере. Посмотрим. Хорошо. Так что NS каротаж - удивительный способ отладки. Хорошо? Иногда намного проще, чем установка контрольной точки а затем, когда вы там ищете

по переменным и прочее. Он просто печатает, что происходит, и вы можете посмотреть его. Особенно в пользовательском интерфейсе вещи иногда анимированные, они происходят с течением времени. Иногда трудно установить контрольную точку в середине из анимации, чтобы увидеть, что происходит.

Но если вы делаете некоторые журналы NS, вы можете вид о видеть, как вещи прогресса. Отлично. Последнее, что я собираюсь показать вам, вот как чтобы добавить новый класс в приложение потому что вы будете нуждаться, чтобы сделать это.

Вы собираетесь добавить четыре класса к этому. Хорошо? Вы собираетесь начать с этим, все в порядке, а затем вы собираетесь добавить четыре класса - карта, палуба и т.д. И как вы добавить класс это вы - а на самом деле, как вы добавить любой файл в свой проект - это вы идете в меню файла, новый файл.

Хорошо? И есть все различные виды вещей, которые вы можете добавить здесь, файл базы данных, файлы схемы и все. Но вы хотите, это один верхний левый класс Objective-C. Хорошо? Вот вы только собираетесь ввести имя класса. Так, например, если я собираюсь добавить карту

и имя суперкласса. Хорошо. Если вы делаете игральную карту, вы можете ввести карту здесь. Он не должен быть чем-то, что выбрал из этого списка, в порядке, которые являются те IOS. Так вот я собираюсь сделать карточку. Я мог бы поставить карту прямо здесь.

Он спрашивает, где хранить это. Я мог бы поставить его прямо в том же месте что мой контроллер карточная игра, вы видите? Но на самом деле я большой поклонник класть вашу модель в своем собственном каталоге. Таким образом, вы будете использовать новую папку здесь.

Давайте создадим как каталог моделей, и что создает каталог модели здесь. Там в контроллер, вот каталог модель. И таким образом, создать. Так что собирается создать карту точек H и M. Вот карта точка H и М, ладно, вроде пустые их версий.

Вы можете переключаться между ними здесь. Обратите внимание на то, что если я включаю левый, правильные изменения, чтобы соответствовать. Ты видишь? Измените это, это соответствует. Это потому, что я выбрал коллеги прямо здесь. Если вы идете в ручной режим и выбрать этот файл вручную,

то он не будет делать эту магию больше. Но вы всегда можете вернуться к коллегам и он будет держать их в синхронизации. Хорошо. Таким образом, вы можете иметь - некоторые люди, как их файл заголовка на левой стороне, некоторые на правом, что угодно. Кроме того, обратите внимание, здесь было бы неплохо

если я могу также сгруппировать эти вещи в навигаторе. И я могу при наличии их выбирают правой кнопкой мыши новую группу. Скажем, модель. Прямо здесь. А теперь я поместил мою модель в своем собственном маленьком месте прямо здесь. Я даже могу переместить этот вокруг, положил его здесь, что угодно.

Я мог бы поставить все мои четыре класса там. Можно связать эту группу в файловую систему. На самом деле, если вы просто нажмите на файл и вызвать инспектора на нем прямо здесь, вы можете увидеть, что он получил это место где вы можете указать, является ли это абсолютный путь, или отношение к группе это в, или любой другой.

Таким образом, вы можете контролировать это. Вот и все. Так что я думаю, что это все, что вам нужно сделать свою домашнюю работу. Вы только собираетесь ввести весь код здесь карты и добавить свои три другие. Введите весь этот код в.

И тогда все, что вам нужно сделать, это сделать эту карту вместо показать туз треф все время, должен пройти через палубу, хорошо? Там очень подробный домашние задания записи до разм. Он имеет все виды подсказок и помощи, и говорит вам, о том, что требуемые задачи,

и критерии оценки, и все прочее. Так что обязательно читать эту вещь в деталях, хорошо? Не пропустите этот материал и просто стараться идти прямо к делать это. И если у вас есть вопросы, я буду здесь. Вот и все. >> Для больше, пожалуйста, посетите нас на Stanford.edu.



Video Description

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