Troubleshooting
Частые вопросы (FAQ)
Цвета
Q: Изменил цвет, но он не применился
Проверьте по чеклисту:
- Тема задана до
getChat()?chatCenterSDK.theme = myTheme
let chatController = try chatCenterSDK.getChat() - Правильный токен? Сверьте семантику в разделе Цветовая схема. Например,
linkиlinkLight— два разных токена для акцентных элементов. - Компонент не переопределяет токен? Если
components.navigationBarStyle.titleTextStyle.colorзадан явно — токенtypography.heading1на него не влияет. - Тёмная тема задана отдельно?
colors.link = .redв светлой теме не затрагиваетdarkTheme. applyvsbuild? Изменение компонента в Flow черезapplyможет затронуть все экраны. Используйтеbuildдля точечного переопределения (см. Стили -> Типичные ошибки).- Тема пересоздаётся перед каждым открытием? Создавайте
ChatThemeодин раз при инициализации SDK — не перед каждым вызовомgetChat().
Шрифты
Q: Изменил typography.body, но шрифт в пузырях не изменился
Текст в пузырях чата использует токен typography.message, а не body. Дефолт — .systemFont(ofSize: 14).
typography.message = .systemFont(ofSize: 15, weight: .regular)
Q: Кастомный шрифт не применяется к заголовку в навигационной панели
Заголовок навигационной панели управляется через NavigationBarStyle, а не через токен ChatTypography.title:
theme.components.navigationBarStyle.titleTextStyle.font = myFont
theme.components.navigationBarStyle.titleTextStyle.color = .white
Компоненты
Q: Изменение компонента в одном Flow влияет на все экраны
Компоненты из ChatComponents — reference-type. Мутация через apply правит общий объект, используемый и другими Flow. Чтобы переопределить компонент точечно, создайте новый экземпляр через build:
// Меняет глобально
theme.flows.chatFlow.apply {
$0.inputViewStyle.sendButtonStyle.image = myImage
}
// Точечное переопределение
let customInput = ChatInputStyle.build(with: theme.components) {
$0.sendButtonStyle.image = myImage
}
theme.flows.chatFlow.inputViewStyle = customInput
Q: Как изменить цвет фона пузырей сообщений?
Для входящих (от оператора) и исходящих (от клиента) сообщений по отдельности:
theme.flows.chatFlow.incomeMessages.bubbleTintColor = .systemBlue
theme.flows.chatFlow.outcomeMessages.bubbleTintColor = .systemGreen
Тёмная тема
Q: Тёмная тема не применяется при смене userInterfaceStyle
Убедитесь, что:
darkThemeзадан явно:chatCenterSDK.darkTheme = darkTheme- Тема задана до
getChat(), либо после смены тёмной темы чат закрыт и открыт заново черезgetChat()
Q: Часть элементов не меняет цвет в тёмной теме
Некоторые цвета (link, linkLight, positive, warning) одинаковы для светлой и тёмной темы по умолчанию. Для разных значений создайте отдельную ChatColors для тёмной темы и назначьте через darkTheme.
Иконки и изображения
Q: Иконка SF Symbol слишком маленькая / большая
Используйте конструктор с указанием размера:
images.attachButtonImage = ChatImage(system: "plus.circle", size: 24, tintColor: .systemBlue)
Граничные случаи
Q: Задал прозрачный цвет — текст пропал
ChatColors не проверяет цвет на прозрачность. Если задать .clear, элемент станет невидимым без ошибки.
// Текст будет невидим
colors.main = .clear
// Полупрозрачность
colors.main = .label.withAlphaComponent(0.8)
Q: Изменил theme пока чат уже открыт — UI не обновился
ChatTheme считывается при открытии чата. Изменение chatCenterSDK.theme после вызова getChat() не обновляет уже отображаемые компоненты.
Вариант 1 — перезапустить чат (наиболее надёжно):
chatCenterSDK.theme = newTheme
do {
let chatController = try chatCenterSDK.getChat() // открыть заново
navigationController?.pushViewController(chatController, animated: true)
} catch {
print("Не удалось переоткрыть чат: \(error)")
}
Вариант 2 — динамические цвета (обновляются автоматически при смене Light/Dark):
colors.main = UIColor { trait in
trait.userInterfaceStyle == .dark ? .white : .black
}
Ошибки конфигурации
Q: Иконка не отображается — как диагностировать?
ChatImage(named:) не выбрасывает ошибку если ассет не найден — иконка просто не отображается (внутри подставляется пустой UIImage()). Убедитесь, что имя ассета и бандл указаны верно:
// Кастомная иконка из бандла приложения
images.sendButtonImage = ChatImage(named: "my_icon", bundle: .main, tintColor: .white)
// Или SF Symbol (всегда доступен, не требует ассета)
images.sendButtonImage = ChatImage(system: "paperplane.fill", tintColor: .white)
Для проверки доступных SF Symbols используйте приложение SF Symbols (developer.apple.com/sf-symbols).
Q: Кастомный шрифт не загружается — как проверить?
Шрифт должен быть зарегистрирован в Info.plist под ключом UIAppFonts и использоваться по PostScript-имени:
// Диагностика: вывести все зарегистрированные PostScript-имена
for family in UIFont.familyNames.sorted() {
for name in UIFont.fontNames(forFamilyName: family) {
print(name) // ← ищите "YourFont-Regular" в выводе
}
}
// Всегда с fallback
typography.message = UIFont(name: "YourFont-Regular", size: 15)
?? .systemFont(ofSize: 15)
UIFont(name:size:) вернёт nil без ошибки если шрифт не найден — приложение не упадёт, но будет использован системный шрифт.
Отладка
Q: Как проверить, что тема применилась?
- Точка останова в отладчике — добавьте breakpoint после
chatCenterSDK.theme = myThemeи проверьте свойства объекта - Xcode View Hierarchy (
Debug → View Hierarchy) — выберите нужный элемент, цвет и шрифт видны в инспекторе справа - Логирование — убедитесь что код выполняется в нужном порядке:
let theme = ChatTheme(colors: colors)
print("Theme ready, link color: \(colors.link)")
chatCenterSDK.theme = theme
let chatController = try chatCenterSDK.getChat()
Не нашли ответ?
- API Reference — полный список классов и свойств
- Figma UIKit — визуальное представление компонентов
- Демо-приложение →
MainViewController+Custom.swift— актуальные рабочие примеры