Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СЕССИЯ ОТВЕТЫ / iOS сессия ответы.docx
Скачиваний:
21
Добавлен:
25.12.2020
Размер:
14.45 Mб
Скачать
  1. Создание и отображение данных в ячейках (Creating custom table cell)

(Курсера)

Здесь, в нашем контроллере вида, у нас есть табличный вид, хорошо? Но табличное представление еще не загружается данными. Поэтому для того, чтобы все это работало должным образом, нам нужно ввести нечто, называемое протоколами и делегатами dun. Ну, табличное представление, оно должно знать, где находится источник данных, Эй, мне нужны некоторые данные, дайте их мне. Где я его возьму? А также есть и другие вещи, такие как: Эй, мне нужно показать ячейки на экране, мне нужно показать что-то на экране и заполнить его данными. Таким образом, пользователю будет на что посмотреть. Ну, сейчас он этого не делает,так что давайте сделаем это. И мы делаем это, внедряя некоторые протоколы. Поставьте запятую после UIViewController, и мы введем UItableviewDataSource и uitableviewdelegate, хорошо? Это два протокола, и хотя он говорит "источник данных" и "делегат", это протоколы, протокол Swift. И они действительно основаны на коде objective-c, который был написан давным-давно, но в Swift они переведены как протоколы. Итак, это протоколы в Swift. И мы хотим сказать, что мы будем придерживаться набора правил, и мы поговорим о протоколах позже более подробно и подробно. Так что пока просто следуйте за мной. Итак, UITableViewDataSource и UITableViewDelegate. Ладно, я сохраню этот файл здесь. Хорошо, и обычно они кричали бы на меня. Ладно, там вы идете. И поэтому, если мы нажмем этот маленький красный значок здесь, новый с xcode 9-это дополнительное предварительное заполнение функций, которые вам нужны, чтобы заставить это работать. Поэтому нажмите на эту маленькую красную стрелочку, и она скажет, что тип CategoriesVC не соответствует протоколу UITableViewDataSource. Вы хотите добавить заглушки протоколов? Так что это говорит о том, что вы не слушаете правила. Вы приняли набор правил UITableViewDataSource и UITableViewDelegate, но вы не соблюдаете эти правила. Вы их еще даже не реализовали. Итак, я собираюсь нажать кнопку Исправить, что очень здорово, и это поместило их сюда, что немного раздражает. Поэтому я командую X. И то, что мы собираемся сделать, это положить их сюда, и мы собираемся сделать некоторую очистку здесь, так как текущая версия xcode, которая является бета-версией, показывает, что это доступно, и т. д. Это может исчезнуть в будущих версиях, я бы ожидал, что это произойдет, потому что это довольно грязно и уродливо. Но избавьтесь также и от доступного, и от этого, доступного здесь. Итак, он реализовал две функции, необходимые для правильной работы. Хорошо, количество строк и разделов, так сколько же строк вы хотите показать в табличном представлении? Он должен знать это заранее. А затем cell for row index path, хорошо, cellForRowAt indexPath. И это говорит о том, что давайте создадим ячейку, многоразовую ячейку на этом конкретном пути. Итак, пункт номер десять показывает ячейку и помещает этот тип данных. Именно здесь вы фактически вводите данные в табличное представление элемента номер один, два, три, четыре и т. д. Хорошо. Так сколько же строк в этом разделе? Ну, это довольно просто, все, что нам нужно сделать, это получить целое число и то, что просто хочет знать, сколько строк представления таблицы. Мы уже знаем, что это сколько, четыре? У нас на экране четыре. Теперь мы могли бы просто сказать return four, но это обман, и это не тот способ, которым вы бы писали код, настоящий код, надежный код. Поэтому мы собираемся вернуть DataService. instance. Мы собираемся вызвать на нем эту функцию. instance. Ладно, вот эта переменная. А потом мы вызовем функцию getCategories. Итак, то, что мы делаем, - это захватываем категории. Ну, а что же категории возвращают? Ну, он возвращает массив, так что мы знаем, что получаем массив прямо здесь. Ну, это запрос на int, так как же мы получаем общее количество элементов в массиве? Простой. Вызов функции подсчета точек. Итак, то, что мы здесь делаем, мы говорим: верните общее количество элементов в этом массиве. Ладно, достаточно просто. Это все, что мы делаем, возвращая этот счет. Но как насчет этого парня? Как на самом деле захватить ячейку и поместить в нее данные? Ну, я думаю, что мы должны сначала написать некоторый код в нашей ячейке табличного представления, прежде чем мы действительно реализуем эту функцию здесь. Итак, что мы собираемся сделать, так это перейти сюда, в нашу точку зрения, в нашу ячейку категории. То, что я хочу сделать, это удалить этот набор функций, выбранный, мне это не нужно, и мне не нужно это пробуждение от zip-файла или файла наконечника прямо здесь. Мы собираемся создать здесь свою собственную функцию. Мы назовем это "обновленные просмотры", хорошо? В основном обновите представления о ячейке. И мы пройдем в категорию, какой бы ни была текущая категория, хорошо? И опять же, это еще одна причина, по которой вы должны иметь многоразовые вещи. В противном случае нам пришлось бы иметь заголовок здесь и имя изображения здесь, и мы будем передавать два разных элемента снова и снова. Где в данном случае мы передаем только один многоразовый объект, который хорошо написан кодом и защищен. Поэтому мы собираемся обновить представления. В принципе, каждый раз, когда мы хотим показать ячейку на экране, мы собираемся вызвать эту функцию updateViews и передать в категорию, и она будет обновлять представления. Итак, давайте покажем вам, как это просто здесь, хорошо? Итак, мы собираемся сказать categoryImage.image, поэтому мы собираемся установить на нем изображение, равное UIImage, и мы собираемся сделать то, что говорит image named. И все, что мы собираемся сделать, это передать имя изображения, которое мы задаем в категории. Так категория.имя_образа. Это так просто. CategoryImage, конечно, categoryTitle-это следующий,. text равен category. title. Мы сделали это так же слишком, помнишь? Наша категория здесь, у нее есть название изображения, и у нее есть название удивительно, удивительно. Все, что нам нужно сделать, это захватить то, что мы уже установили, прямо здесь, и это так просто, мы будем обновлять представления каждый раз, легко-просто. Итак, давайте теперь вернемся к нашим категориям VC и к тому, как мы можем реализовать эту функцию здесь. Позвольте мне дать ему немного больше места, чтобы вы могли видеть, над чем мы здесь работаем. Давайте закроем эту тему. Итак, здесь, в нашем табличном представлении, мы собираемся сказать: если let cell, давайте попробуем создать ячейку, равную tableView.dequeueReusableCell с идентификатором. Мы еще не создали этот идентификатор. Так что мы собираемся принять его имя. Мы будем называть это как CategoryCell. Хорошо, и мы собираемся использовать его как категориальную ячейку. Итак, мы захватываем табличное представление, которое работает с этим делегатом, и вызываем dequeueReusableCell, и это функция, которую вы вызываете, чтобы получить многоразовую ячейку. Знаете ли вы, что на табличном представлении на IOS, хорошо, что это похоже на Android. посмотрите, как видны один, два, три, четыре элемента. Знаете ли вы, что, если бы у вас была сотня предметов, они не были бы здесь спрятаны? Там будет всего пять или шесть камер вместе. И вот что происходит: он снимает тот, что находится внизу, которого больше нет на экране, и кладет его обратно наверх, чтобы захватить предмет, который все еще находится в памяти. Поэтому ему не нужно воссоздавать его заново и замедлять работу вашего приложения. И это просто, так что эй, я достал для тебя твой старый сотовый. Какие данные мы должны поместить в него, чтобы обновить его? Это все. Что? Да, он просто захватывает исходную ячейку, которую вы уже использовали, и вы обновляете ее новыми данными, вот как это работает. Итак, то, что мы здесь делаем, - это захват многоразовой ячейки. Хорошо, называется CategoryCell, который мы еще не установили. И теперь все, что нам нужно сделать, это захватить категорию для этой строки, а затем поместить ее в функцию обновления представлений. Итак, когда вы говорите "пусть категория", как вы думаете, как мы можем захватить соответствующую категорию? То, что я хочу, чтобы вы сделали, хорошо, самостоятельно, это приостановили это видео, и я хочу, чтобы вы выяснили, как захватить правильную категорию для правильной строки и сохранить ее в этой переменной. Ты это сделал? Я знаю, что некоторые из вас это делали, а некоторые нет, потому что так всегда бывает. Но для тех, кто сделал это, Поздравляю, если вы поняли это, если вы этого не сделали, это нормально, потому что мы собираемся сделать это прямо сейчас. Итак, пусть категория равна. Ладно, ты готова? Мы собираемся сказать, DataService.Инстанции.getCategories. Итак, как нам получить нужную категорию в нужном ряду? Что же нам делать? Ну, мы просто берем элемент из массива, index path. row. Ладно, тебе это действительно кажется странным? Ладно, ты такой же, как и то, что происходит, Марк, это безумный синтаксис. Когда вы преподавали массивы, вы никогда не учили нас ставить квадратные скобки после скобок, это не имеет никакого смысла для меня. Ну, это потому, что мы возвращаем массив из функции. Так что это было бы равносильно тому, чтобы сделать вот это. Я мог бы сказать Давай категорий, в порядке, равен Датасервис.инстанции.getCategories. Таким образом, он хранит массив внутри категории здесь или в массиве категорий. И тогда то, что я мог бы сделать, я мог бы просто, я мог бы сказать категории, как так хорошо. Ты такой, что теперь это начинает казаться мне знакомым, потому что это массив, и ты хватаешь индекс из этого массива. Но зачем это делать, если мы можем сделать это намного быстрее с помощью одной строки кода. Итак, мы хватаем категории, а затем мы хватаем конкретный предмет из этой категории, легко-просто, хорошо. И если это не легко, не волнуйтесь, это просто требует большой практики, хорошо. Ты будешь записывать это снова и снова, хорошо? Повторение кода, код каждый день, изучение каждый день. Давайте пойдем дальше и обновим ячейку прямо сейчас, так что cell. updateViews и она ищет категорию, поэтому мы переходим в категорию, которую только что захватили. Ладно? И это тоже выглядит очень хорошо. Теперь многие разработчики действительно испытывают искушение сделать какой-нибудь неприятный код, который идет примерно так, вместо того чтобы просто обновлять представления и позволять им управлять самим собой. Им нравится делать такие вещи. Поэтому они хотели бы сказать: cell.imageView.image равно, category.imageName.

Так что то же самое мы сделали в нашем представлении, но им нравится делать это здесь с точки зрения таблицы, и это плохая практика. Вы всегда хотите, чтобы ваши взгляды были самодостаточными, взгляды должны управлять собой. Контроллер представления должен говорить, что происходит на экране в разное время, но каждое представление, которое у вас есть, должно управлять самим собой, если оно имеет какое-либо значение или значение, каковым является ячейка представления таблицы. Поэтому никогда не делайте этого, никогда не манипулируйте ячейками табличного представления из ячейки табличного представления для пути индекса строки. Это отвратительно, и я ничему этому не учу, и если ты этому научился, то не от меня. Так что делайте это так, это гораздо лучше. Итак, что мы собираемся сделать дальше, так это вернуть эту ячейку, потому что функция tableView cell for row at index path хочет, чтобы мы вернули ячейку. В противном случае, давайте просто вернем пустую ячейку, вернем CategoryCell мы сделаем пустую ячейку вот так.

Соседние файлы в папке СЕССИЯ ОТВЕТЫ