easy_dev991
624 subscribers
29 photos
19 videos
3 files
169 links
Делюсь интересными находками/лайфхаками в процессе разработки под iOS, и возможно ты найдешь что-то полезное для себя!

GitHub: https://github.com/easydev991
Download Telegram
#ios #swift #swiftui #uikit

Все еще верстаете на ките и пользуетесь таблицами/коллекциями для создания списков? При этом хочется использовать в этих экранах 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)
}
}


Весь код для демо-ячейки можно посмотреть в гитхабе.
3🔥2
#ios #career

Хабр добавил тесты для подтверждения навыков в резюме, получилось забавно 😁

Более подробно расскажу в платном канале✔️
🔥5
#ios #swift #swiftui #swiftdata #cloudkit #hint

Создали новое 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 26 RC (ссылка), краткий перевод ниже.

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


На мой взгляд это здорово, скоро проверим на практике 👍
10
#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-уведомления в 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 с момента публикации статьи об этом, и все же он пригодился 👌
🔥52
This media is not supported in your browser
VIEW IN TELEGRAM
#ios #ios26 #swiftui #navigationview #bug #contest

Представляю вашему вниманию очередной баг iOS 26 при работе с NavigationView, который отлично работает на всех версиях iOS, в том числе на iOS 26.

На iOS 26 экран автоматически закрывается при первом вызове любого из menu/picker/confirmationDialog, а вот код этого экрана, и там нет никаких ошибок, и чинить там нечего 🤦‍♂️

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

--------

Позже напишу статью на эту тему, а пока что объявляю мини-конкурс: кто правильно назовет причину возникновения бага в iOS 26, тот молодец 🚀
🔥5
#swift #news

Вчера состоялся превью-релиз Swift SDK для Android, весь анонс и детали можно почитать по ссылке.

Кто знает, вдруг через пару лет можно будет с легкостью разрабатывать андроид-приложения на свифте?)
🔥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