#ios #swift #swiftui #uikit
Все еще верстаете на ките и пользуетесь таблицами/коллекциями для создания списков? При этом хочется использовать в этих экранах SwiftUI?
Не беда! В iOS 16 добавили нативную интеграцию SUI в ячейках с помощью contentConfiguration.
Вот так нужно было в apple презентовать этот инструмент😁, а не тихонечко сказать в одном из видео, что вот теперь вы можете в ячейках добавлять SUI.
Алгоритм работы с этой штукой:
1️⃣ Верстаем вьюху для ячейки на SUI
2️⃣ В самой ячейке делаем проверку на iOS 16, и если версия подходит, то добавляем вьюху как показано в документации, можно обращаться напрямую к свойству
3️⃣ Если версия iOS < 16, то либо не показываем обновленный UI (😁), либо используем костыли с
Важный момент: если просто добавить SUI-вьюху в ячейку и не настроить отступы для конфигурации, то будут добавлены дефолтные отступы по горизонтали и вертикали.
Чтобы такой фигни не было, нужно вручную поверх конфигурации добавить отступы через метод margins.
Пример настройки
Весь код для демо-ячейки можно посмотреть в гитхабе.
Все еще верстаете на ките и пользуетесь таблицами/коллекциями для создания списков? При этом хочется использовать в этих экранах SwiftUI?
Не беда! В iOS 16 добавили нативную интеграцию SUI в ячейках с помощью contentConfiguration.
Вот так нужно было в apple презентовать этот инструмент😁, а не тихонечко сказать в одном из видео, что вот теперь вы можете в ячейках добавлять SUI.
Алгоритм работы с этой штукой:
1️⃣ Верстаем вьюху для ячейки на SUI
2️⃣ В самой ячейке делаем проверку на iOS 16, и если версия подходит, то добавляем вьюху как показано в документации, можно обращаться напрямую к свойству
contentConfiguration внутри ячейки3️⃣ Если версия iOS < 16, то либо не показываем обновленный UI (😁), либо используем костыли с
UIHostingControllerВажный момент: если просто добавить SUI-вьюху в ячейку и не настроить отступы для конфигурации, то будут добавлены дефолтные отступы по горизонтали и вертикали.
Чтобы такой фигни не было, нужно вручную поверх конфигурации добавить отступы через метод margins.
Пример настройки
contentConfiguration с нужными отступами:
func setup(with viewModel: DemoCollectionCellViewModel) {
if #available(iOS 16.0, *) {
contentConfiguration = UIHostingConfiguration {
SwiftUIView(viewModel: viewModel)
}.margins(.horizontal, 12) // <- вот тут задали отступы по горизонтали
} else {
setupOld(with: viewModel)
}
}
Весь код для демо-ячейки можно посмотреть в гитхабе.
Apple Developer Documentation
UIHostingConfiguration | Apple Developer Documentation
A content configuration suitable for hosting a hierarchy of SwiftUI views.
❤3🔥2
#ios #swift #swiftui #swiftdata #cloudkit #hint
Создали новое iOS-приложение с использованием Swift Data и CloudKit, но оно крашится после добавления контейнера?
Не беда!
На скриншоте исправление краша в только что созданном приложении, где включена галка
Все поля в моделях
Если оставить поле
При этом краша не будет, если снять галку с контейнера в настройках проекта 😐
Будет здорово, если в новом
Создали новое iOS-приложение с использованием Swift Data и CloudKit, но оно крашится после добавления контейнера?
Не беда!
На скриншоте исправление краша в только что созданном приложении, где включена галка
Host in CloudKit и добавлен ваш CloudKit Container.Все поля в моделях
Swift Data должны быть или опциональными, или иметь дефолтное значение.Если оставить поле
timestamp без дефолтного значения, будет краш:Thread 1: Fatal error: Could not create ModelContainer: SwiftDataError(_error: SwiftData.SwiftDataError._Error.loadIssueModelContainer, _explanation: nil).При этом краша не будет, если снять галку с контейнера в настройках проекта 😐
Будет здорово, если в новом
Xcode появятся более прозрачные ошибки на этот случай (бету не ставил).🔥8
#ios #xcode
Приятная новость в
Xcode получил новую функцию кеширования компиляции, которую можно включить вручную и которая ускоряет циклы сборки и тестирования для Swift и C‑подобных языков.
Эта фича сохраняет результаты компиляции для набора исходных файлов и при повторной компиляции тех же файлов использует их из кеша, сокращая время сборки.
Наибольшую выгоду это дает при переключении между ветками или выполнении чистых сборок.
На мой взгляд это здорово, скоро проверим на практике 👍
Приятная новость в
Xcode 26 RC (ссылка), краткий перевод ниже.Xcode получил новую функцию кеширования компиляции, которую можно включить вручную и которая ускоряет циклы сборки и тестирования для Swift и C‑подобных языков.
Эта фича сохраняет результаты компиляции для набора исходных файлов и при повторной компиляции тех же файлов использует их из кеша, сокращая время сборки.
Наибольшую выгоду это дает при переключении между ветками или выполнении чистых сборок.
На мой взгляд это здорово, скоро проверим на практике 👍
Apple Developer Documentation
Xcode 26 Release Notes | Apple Developer Documentation
Update your apps to use new features, and test your apps against API changes.
❤10
Послезавтра релиз новых версий iOS/macOS и т.д. Какие у вас планы на обновление?
Anonymous Poll
22%
В числе первых обновляюсь на бету, так что обновлюсь сразу
20%
Бету не тестирую, но обновлюсь сразу
15%
Подожду первые обзоры и обновлюсь через несколько дней или неделю-другую, если у большинства все ок
35%
Подожду 1-2 релиза, пока поправят неизбежные баги, посмотрю обзоры и обновлюсь, когда будет ок
8%
Не буду обновляться, меня устраивает старая версия (версию в комменты)
❤2
У вас работает SwiftUI Preview в Xcode 26?
Anonymous Poll
56%
Да
26%
Частично - в некоторых местах проекта не работает
18%
Нет, везде перестали работать
🔥2
#ios #xcode #appstore #appstoreconnect
Недавно узнал, что версия приложения в поле
Нет строгой проверки на соответствие
А вы знали об этом?)
Недавно узнал, что версия приложения в поле
Version в Xcode на вкладке General не обязана совпадать с версией в App Store Connect.Нет строгой проверки на соответствие
Version между Xcode и App Store Connect — можно прикрепить сборку с версией 999 к версии релиза 1.2, при желании 😱А вы знали об этом?)
👨💻4🔥2
#ios #swift #notificationcenter #notification
Недавно в рабочем iOS-приложении перестали сохраняться push-уведомления в
Проблема проявилась где-то после перехода на новый Xcode 16*, что бы это могло быть? 🤔
Выяснилось, что
Причем раньше все работало отлично, где-то 4-5 релизов назад 😱
✅ Решение оказалось простым - нужно было добавить
Скорее всего, неправильная настройка
⚠️ Важно всегда проверять
Недавно в рабочем iOS-приложении перестали сохраняться push-уведомления в
CoreData: пользователи не видели историю уведомлений, хотя сами уведомления приходили и отображались на экране телефона корректно.Проблема проявилась где-то после перехода на новый Xcode 16*, что бы это могло быть? 🤔
Выяснилось, что
Notification Service Extension не мог получить доступ к Core Data файлам из-за неправильной настройки Target Membership. Файлы модели данных не были включены в target для extension, поэтому при попытке инициализации Core Data возникала ошибка.Причем раньше все работало отлично, где-то 4-5 релизов назад 😱
✅ Решение оказалось простым - нужно было добавить
Core Data файлы в Target Membership для NotificationService. После этого extension снова смог сохранять уведомления в базу данных.Скорее всего, неправильная настройка
Target Membership возникла при рефакторинге проекта или добавлении новых файлов, а может быть и вовсе при переходе с "групп" на "папки" 🙈Xcode иногда не добавляет автоматически файлы в нужные targets, особенно при работе с `extension`'ами, которые имеют отдельную конфигурацию.⚠️ Важно всегда проверять
Target Membership при добавлении новых файлов в проект, особенно если они используются в нескольких таргетах.🔥8
easy_dev991
#ios #swiftui #performance Убираем лишние вычисления body в SwiftUI View
#ios #swiftui #equatable
Наглядный пример использования протокола
Вьюха принимает на вход несколько свойств, и ни одно из них не изменяется при нажатии на кнопку "избранного" в навбаре, но по умолчанию вьюха обновляется при изменении этого
Все, что нужно было сделать для исправления проблемы:
Это первый случай, когда мне пригодился протокол
Наглядный пример использования протокола
Equatable, чтобы избавиться от лишних перерисовок вьюхи. На первом видео до исправления, на втором - после.Вьюха принимает на вход несколько свойств, и ни одно из них не изменяется при нажатии на кнопку "избранного" в навбаре, но по умолчанию вьюха обновляется при изменении этого
State-свойства на экране.Все, что нужно было сделать для исправления проблемы:
struct HTMLContentView: UIViewRepresentable, @preconcurrency Equatable {
static func == (lhs: HTMLContentView, rhs: HTMLContentView) -> Bool {
lhs.infopost == rhs.infopost && lhs.fontSize == rhs.fontSize
}
// остальной код
}
Это первый случай, когда мне пригодился протокол
Equatable с момента публикации статьи об этом, и все же он пригодился 👌🔥5❤2
Есть разные форматы трудоустройства, и iOS-разработчики не исключение. Давайте узнаем, какой формат сколько людей предпочитает.
Anonymous Poll
68%
Выбираю работу по трудовому договору или договору ГПХ (с постоянным заказчиком)
3%
Выбираю самозанятость с постоянным заказчиком
6%
Выбираю ИП с постоянным заказчиком
2%
Выбираю фриланс с разными заказчиками (как повезет/кто подвернется)
14%
Стремлюсь начать зарабатывать деньги в iOS-разработке
8%
Для меня iOS-разработка - хобби; не слежу за доходом в этом направлении или не зарабатываю тут
😁3👍1
This media is not supported in your browser
VIEW IN TELEGRAM
#ios #ios26 #swiftui #navigationview #bug #contest
Представляю вашему вниманию очередной баг iOS 26 при работе с
На iOS 26 экран автоматически закрывается при первом вызове любого из
Исправить ситуацию можно как минимум двумя способами, один из которых совсем простой, а второй чуть посложнее, но применяется в проекте во многих местах с другой целью.
--------
Позже напишу статью на эту тему, а пока что объявляю мини-конкурс: кто правильно назовет причину возникновения бага в iOS 26, тот молодец 🚀
Представляю вашему вниманию очередной баг iOS 26 при работе с
NavigationView, который отлично работает на всех версиях iOS, в том числе на iOS 26.На iOS 26 экран автоматически закрывается при первом вызове любого из
menu/picker/confirmationDialog, а вот код этого экрана, и там нет никаких ошибок, и чинить там нечего 🤦♂️Исправить ситуацию можно как минимум двумя способами, один из которых совсем простой, а второй чуть посложнее, но применяется в проекте во многих местах с другой целью.
--------
Позже напишу статью на эту тему, а пока что объявляю мини-конкурс: кто правильно назовет причину возникновения бага в iOS 26, тот молодец 🚀
🔥5
#swift #news
Вчера состоялся превью-релиз Swift SDK для Android, весь анонс и детали можно почитать по ссылке.
Кто знает, вдруг через пару лет можно будет с легкостью разрабатывать андроид-приложения на свифте?)
Вчера состоялся превью-релиз Swift SDK для Android, весь анонс и детали можно почитать по ссылке.
Кто знает, вдруг через пару лет можно будет с легкостью разрабатывать андроид-приложения на свифте?)
Swift.org
Announcing the Swift SDK for Android
Swift has matured significantly over the past decade — extending from cloud services to Windows applications, browser apps, and microcontrollers. Swift powers apps and services of all kinds, and thanks to its great interoperability, you can share code across…
🔥1
#xcode #bug
В
Почистить кэш, пересоздать файл со строками не помогает.
На скриншоте причина, почему мне завернули очередной релиз приложения с площадками.
Исправляется эта фигня откатом с
В
Xcode 26 у меня внезапно сломалась локализация для Info.plist-файла - просто перестали работать строки на русском языке, а на английском все ок.Почистить кэш, пересоздать файл со строками не помогает.
На скриншоте причина, почему мне завернули очередной релиз приложения с площадками.
Исправляется эта фигня откатом с
xcstrings на старый формат strings для локализации Info.plist🙈😨3❤🔥1
easy_dev991
#ios #swiftui #scrollview #scrollviewreader #scrollto Скроллим к нужному элементу
#ios #swiftui #scrollview #scrollto
На днях застрял со скроллом к нужному элементу и думал "что же не так?".
У меня есть список элементов в
Все оказалось очень просто - нужно явным образом добавить модификатор
Потом вспомнил, что у меня уже есть статья на эту тему 😁
На днях застрял со скроллом к нужному элементу и думал "что же не так?".
У меня есть список элементов в
ForEach, внутри массив с Identifiable-элементами, но scrollTo(id) не работает.Все оказалось очень просто - нужно явным образом добавить модификатор
.id для всех элементов в цикле ForEach. Потом вспомнил, что у меня уже есть статья на эту тему 😁
❤4😁4😴1