iOS Dev
SwiftUI - Как управлять ScrollView программно
Создайте экран чата и управляйте просмотром прокрутки
В этом руководстве вы узнаете, как создать экран чата, в котором сообщения будут прокручиваться автоматически. Вместе со мной вы создадите следующее приложение.
Вот исходный код, если вы хотите получить к нему доступ раньше.
1. Запустите проект Xcode
Давайте создадим новый проект в Xcode. В моем случае я назвал проект «Чат».
2. Спланируйте экран
Перед запуском приложения всегда лучше иметь набросок. Итак, это набросок, который я нарисовал. Вы разработаете следующий экран с функциями.
Если сломать составляющие экрана, то будет:
- Заголовок
- Два разных типа сообщения чата
- Текстовое поле
- Кнопка отправки
3. Создайте модельный класс для сообщения.
Сначала создайте каталог с именем «Model» в каталоге «Shared» и там создайте новый файл Swift с именем «MessageModel.swift».
В этом приложении наш класс модели представляет четыре данных:
- Идентификатор, позволяющий однозначно идентифицировать сообщение чата.
- Фактическое текстовое сообщение
- Время сообщения
- Кто автор сообщения
Скопируем следующий код в MessageModel.swift
файл.
struct MessageModel
определяет модель данных. В этой модели id
и time
будут автоматически сгенерированы во время создания экземпляра MessageModel.
. isAuthor
- это логическое свойство, в котором true
означает, что сообщение создано автором, который видит экран.
Для простоты, когда автор что-то пишет, мы временно отвечаем поддельным серверным сообщением. Вот почему мы определили
getRndomAnswer
статическую функцию в этой модели сообщения.
4. Создайте представление карточки для сообщения.
Давайте определим карточку для отдельного сообщения. Создайте новый файл с именем «MessageCardView.swift» и скопируйте следующий код.
Если вы запустите предварительный просмотр, вы увидите следующий экран.
- Приведенный выше код легко понять.
MessageCardView
содержит одну точку данныхmessage
, которая будет экземпляромMessageModel.
2. Мы определили некоторые вычисленные свойства, которые дают нам динамическое значение на основе свойства isAuthor
. Например, цвет фона сообщения автора будет оранжевым, а цвет фона ответного сообщения поддельного сервера будет зеленым.
3. Затем мы создали реальное представление карточки сообщения и с помощью Spacer()
скорректировали размещение карточек.
5. Реализуйте функцию чата в приложении.
Теперь давайте обновим файл ContentView.swift
. Удалите существующий код и скопируйте следующий код.
5.1 Сохраненные свойства
Сначала мы определили некоторые сохраненные свойства. messageList
сохранит все сообщения между автором и фальшивыми сообщениями с сервера.
authorMessage
будет использоваться для привязки к текстовому полю для хранения сообщения пользователя.
Пространство имен bottomID
определено для идентификации представления. Вы можете указать идентификатор любого представления с помощью пространства имен. Этот bottomId
используется для автоматической прокрутки прокрутки.
5.2 Заголовок
Определен простой заголовок для отображения заголовка «Беседа» в верхней части экрана.
5.3 Просмотр чата
Эта часть жизненно важна. Мы использовали ScrollViewReader
для чтения ScrollView.
Здесь мы использовали LazyVStack
для отображения сообщений. При использовании MessageCardView
сообщения будут отображаться.
После цикла ForEach
вы увидите Text("").id(bottomID).
Здесь мы определили пустое текстовое представление с идентификатором.
Затем мы использовали модификатор .onReceive
и подписчика Just
, чтобы подписаться на изменения messageList.
Если messageList
обновляется, будет выполнена .onReceive
part, и мы использовали оператор scrollView.scrollTo(bottomID)
, который будет прокручивать до последнего сообщения внизу.
5.4 Функция добавления сообщений
Функция addMessageToMessageList
проверит некоторые предварительные условия, создаст экземпляр MessageModel
и добавит messageList.
Внизу, используя
DispatchQueue
, мы добавим фальшивое случайное сообщение кmessageList
, которое имитирует ответ сервера.
5.5 Просмотр нижнего колонтитула
Представление footer
создает представление нижнего колонтитула, в котором будут отображаться текстовое поле и кнопка. Текстовое поле привязано к состоянию $authorMessage
, и при нажатии кнопки будет выполнен метод addMessageToMessageList()
.
5.6 Тело
Наконец, создается основной вид для создания нужного нам экрана.
Если вы запустите приложение, напишите новое сообщение, будет показан поддельный ответ, и scrollview будет автоматически прокручиваться.
Надеюсь, вы понимаете, как легко создать экран чата с помощью SwiftUI. Вот исходный код полного приложения.
👨🏼💻 Если вам понравился этот пост, вы можете оставить до пятидесяти 👏👏👏 аплодисментов. Если у вас есть вопросы или мнения, дайте мне знать в комментариях.