Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 512новых вакансий за сутки·54 396вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 565
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 395 кандидатов открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python8 752
  • Облачные технологии6 631
  • QA вакансии2 183
  • Android1 322
  • Инженер данных860
  • Продакт-менеджер316

Разработка

  • iOS1 238
  • Backend вакансии1 196
  • AI вакансии549
  • Fullstack вакансии500
  • Frontend вакансии426
  • Mobile вакансии28

По стеку

  • Go5 209
  • Java3 131
  • Kotlin1 113
  • Node.js1 008
  • Rust833
  • .NET656
  • PHP322
  • C++270
  • C#207

DevOps и инфраструктура

  • Kubernetes3 882
  • Linux-инфраструктура2 817
  • DevOps вакансии2 655
  • Terraform / IaC2 191
  • Мониторинг и Observability1 071
  • CI/CD919
  • SRE308
  • Кибербезопасность38

Аналитика и данные

  • Аналитик данных522
  • Data Scientist435
  • Бизнес-аналитик397
  • Системный аналитик67

Другие направления

  • Проджект-менеджер109
  • UI/UX дизайн67
  • Ручное тестирование14

По регионам

  • Вакансии в США25 642
  • Вакансии в Европе10 259
  • Работа в России3 639
  • Вакансии в Канаде2 255

По формату

  • Удалённые вакансии42 339
  • Релокация в США25 642
  • Гибридная работа5 706
  • Офисная работа4 402

По уровню

  • Senior вакансии22 510
  • Middle вакансии11 429
  • Junior вакансии3 877

Сейчас нанимают

Все компании
  • Wise192 вакансии
  • Rakuten189 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis42 вакансии
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме UIKitВсе вопросы
UIKitMiddleТеория

Как интегрировать SwiftUI-представления в UIKit-приложение с помощью UIHostingController?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

UIHostingController — подкласс UIViewController, принимающий SwiftUI-представление; добавляется как дочерний контроллер через addChild/addSubview/didMove(toParent:) и обновляется через rootView.

Базовое использование

Создайте UIHostingController, передав SwiftUI-представление в инициализатор, и добавьте его как дочерний контроллер.

import SwiftUI
import UIKit

// SwiftUI-компонент
struct BadgeView: View {
    let count: Int
    var body: some View {
        Text("\(count)")
            .padding(8)
            .background(Color.red)
            .foregroundColor(.white)
            .clipShape(Circle())
    }
}

// UIKit-контроллер
class ProfileViewController: UIViewController {

    private var hostingController: UIHostingController<BadgeView>?

    override func viewDidLoad() {
        super.viewDidLoad()
        embedBadge()
    }

    private func embedBadge() {
        let swiftUIView = BadgeView(count: 5)
        let hosting = UIHostingController(rootView: swiftUIView)

        // Стандартный паттерн встраивания дочернего VC
        addChild(hosting)
        view.addSubview(hosting.view)
        hosting.view.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            hosting.view.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 16),
            hosting.view.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16),
            hosting.view.widthAnchor.constraint(equalToConstant: 40),
            hosting.view.heightAnchor.constraint(equalToConstant: 40)
        ])
        hosting.didMove(toParent: self)
        hostingController = hosting
    }

    // Обновление SwiftUI-представления
    func updateBadge(count: Int) {
        hostingController?.rootView = BadgeView(count: count)
    }
}

UIHostingController: встраивание SwiftUI в UIKit

UIHostingController — это подкласс UIViewController, который принимает SwiftUI-представление (View) и отображает его в UIKit-иерархии. Это официальный мост между двумя UI-фреймворками.

Встраивание в UITableViewCell / UICollectionViewCell

Для использования SwiftUI внутри ячеек создайте UIHostingController один раз и обновляйте его rootView при переиспользовании ячейки. Избегайте создания нового контроллера в каждом cellForRowAt.

class SwiftUITableViewCell: UITableViewCell {
    private var hostingController: UIHostingController<AnyView>?

    func configure<Content: View>(with content: Content, parent: UIViewController) {
        if hostingController == nil {
            let hosting = UIHostingController(rootView: AnyView(content))
            hosting.view.backgroundColor = .clear
            parent.addChild(hosting)
            contentView.addSubview(hosting.view)
            hosting.view.translatesAutoresizingMaskIntoConstraints = false
            NSLayoutConstraint.activate([
                hosting.view.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
                hosting.view.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
                hosting.view.topAnchor.constraint(equalTo: contentView.topAnchor),
                hosting.view.bottomAnchor.constraint(equalTo: contentView.bottomAnchor)
            ])
            hosting.didMove(toParent: parent)
            hostingController = hosting
        } else {
            hostingController?.rootView = AnyView(content)
        }
    }
}

Передача данных из UIKit в SwiftUI

Используйте @ObservableObject / ObservableObject или @State-привязанные значения через Binding. Обновление hostingController.rootView вызывает ре-рендер SwiftUI.

class CounterViewModel: ObservableObject {
    @Published var count: Int = 0
}

struct CounterView: View {
    @ObservedObject var vm: CounterViewModel
    var body: some View {
        Text("Count: \(vm.count)")
    }
}

// В UIKit:
let vm = CounterViewModel()
let hosting = UIHostingController(rootView: CounterView(vm: vm))
// Позже:
vm.count += 1  // SwiftUI обновится автоматически

Подводные камни

  • Забыть вызвать addChild(_:) и didMove(toParent:) — без этого UIKit не управляет жизненным циклом вложенного контроллера, что ведёт к утечкам и некорректной работе viewWillAppear.
  • Создавать новый UIHostingController при каждой переиспользовании ячейки в таблице — это дорого. Обновляйте только rootView.
  • Не сбрасывать view.backgroundColor = .clear — по умолчанию фон чёрный/белый, что портит дизайн при встраивании.
  • Ожидать, что UIHostingController корректно вычислит intrinsicContentSize без дополнительной настройки — в сложных случаях нужен вручную заданный sizingOptions (iOS 16+: preferredContentSize / UIHostingControllerSizingOptions).
  • Передавать ссылочные типы напрямую без @ObservableObject — SwiftUI не знает об изменениях и не перерисовывается.
  • Использовать AnyView в горячем пути — это отключает type-erasure оптимизации SwiftUI и замедляет diffing.
  • Не учитывать Safe Area — UIHostingController по умолчанию учитывает её; внутри ячеек это нежелательно, установите hosting.view.insetsLayoutMarginsFromSafeArea = false.

Частые вопросы на собеседовании

  • Что такое Auto Layout и как создавать constraints программно по сравнению с Interface Builder?
  • Как работает навигация в UIKit с помощью UINavigationController?
  • В чём разница между UIView и UIViewController?
  • Как работает жизненный цикл UIViewController? Опишите каждый lifecycle-метод.

Типичные ошибки

  • Сводить «интегрировать SwiftUI-представления в UIKit-приложение с помощью UIHostingController» к синтаксису и не объяснять reuse pool.
  • Игнорировать жизненный цикл, основной поток или момент освобождения ресурсов в сценарии uikit-29.
  • Выбирать API по привычке, не проверяя состояние, ошибки, доступность и платформенные ограничения.

Что проверяет интервьюер

  • Формулирует точную модель для «интегрировать SwiftUI-представления в UIKit-приложение с помощью UIHostingController» и подтверждает ее корректным примером.
  • Умеет связать ответ с иерархия view controller, тестированием и отладкой на устройстве.
  • Называет ограничения подхода uikit-29, включая производительность, память и сопровождение.

Как вы знаете этот вопрос?

Проверить себя по теме UIKit →

Источники

  • https://developer.apple.com/documentation/swiftui/uihostingcontroller
←Предыдущий вопросЧто такое UIKit и какова его роль в разработке под iOS?Следующий вопрос→`UIStoryboard` vs программный UI vs XIB — каковы плюсы и минусы каждого?

Связанные темы

UIKitframework-api-designMobile-Engineering