iOS 26 приносит Swiftui-подобную реактивность в uikit с @observable
8 августа 2025 г.С iOS 26 Apple принесла одну из самых любимых особенностей Swiftui в Uikit-долгожданную способность наблюдать напрямую в слое пользовательского интерфейса. В сочетании с новымupdateProperties()Метод жизненного цикла, разработчики UIKIT теперь могут наслаждаться преимуществами реактивного программирования, которые разработчики Swiftui в течение многих лет бредят.
Перед iOS 26
До iOS 26 обновление пользовательского интерфейса в UIKIT обычно опирается на методы, подобные тем, которые показаны ниже.
final class ViewController: UIViewController {
private var data: UserData? {
didSet { updateUI() }
}
private func updateUI() {
usernameLabel.text = data?.username
userImageView.image = data?.image
setNeedsLayout()
}
}
ЕслиupdateUIМетод не был вызван, пользовательский интерфейс не обновлялся соответственно. С другой стороны, называя его слишком часто может негативно повлиять на производительность. К счастью, эта давняя дилемма наконец-то была решена.
Внедрение автоматического отслеживания наблюдений
iOS 26 представляет Swift's@ObservableМакро до uikit, предлагая полные возможности автоматического отслеживания. Когда доступ к наблюдаемым свойствам доступны в рамках обозначенных методов uikit, структура автоматически устанавливает зависимости и гарантирует, что представления неверны и обновляются при изменении этих свойств.
@Observable class DataModel {
var image: UIImage
var username: String
}
final class UserViewController: UIViewController {
var dataModel: DataModel
var usernameLabel: UILabel
var userImage: UIImageView
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
// UIKit automatically tracks these properties
userImage.image = dataModel.image
usernameLabel.text = dataModel.username
}
}
Больше не нужно звонитьsetNeedsLayout()или вручную запускать методы обновления. Просто применив@Observableмакрос для вашего класса данных и реализацияviewWillLayoutSubviewsМетод, uikit будет:
- Автоматически отслеживать зависимости, такие как
imageиusernameВо время начального макета, - Недействительно взглянуть на точку зрения, когда эти свойства изменятся, и
- Revoke
viewWillLayoutSubviews()Для обеспечения того, чтобы пользовательский интерфейс остался в синхронизации.
Облегчает использование CollectionView
@Observable class ItemModel {
var title: String
var subtitle: String
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath)
let itemModel = itemModel(for: indexPath)
cell.configurationUpdateHandler = { cell, state in
var content = UIListContentConfiguration.subtitleCell()
content.text = listItemModel.title
content.secondaryText = listItemModel.subtitle
cell.contentConfiguration = content
}
return cell
}
Готовы модернизировать приложения uikit?
Чтобы в полной мере воспользоваться новыми реактивными возможностями, введенными в iOS 26, начните с обновления вашего проекта до iOS 26 SDK и перекомплектоспособности ваших существующих приложений.
Затем определите области в вашей кодовой базе, которые полагаются на ручные шаблоны обновления пользовательского интерфейса. Преобразовать подходящие модели данных для использования@Observableмакро и реализуйтеupdateProperties()Метод обработки логики обновления, специфичной для свойств. Для повышения отзывчивости пользовательского интерфейса и более плавной анимации используйтеflushUpdates()где это уместно.
Uikit вступает в новую эру-более реактивную, исполнительную и подходящую для разработчиков, чем когда-либо прежде. Добро пожаловать в будущее развития iOS.
Оригинал