Sobes.tech
Junior

Czy używasz UIKit lub SwiftUI w swoich projektach?

sobes.tech AI

Odpowiedź od AI

Używam zarówno UIKit, jak i SwiftUI. Wybór zależy od wymagań projektu:

  • Preferuję UIKit dla projektów z surowymi wymaganiami dotyczącymi kompatybilności z starszymi wersjami iOS, skomplikowanej personalizacji elementów, integracji z kodem legacy lub specyficznych wzorców nawigacji, które SwiftUI jeszcze nie obsługuje w pełni natywnie. UIKit jest również często wygodniejszy do tworzenia niestandardowych kontrolek z nietypowym zachowaniem lub głębokiej integracji z Core Animation.

  • Używam SwiftUI dla nowych projektów, które wymagają szybkiego rozwoju, deklaratywnego podejścia do budowania interfejsu, łatwej obsługi stanu i podglądu w czasie rzeczywistym. Jest idealny do rozwoju wieloplatformowego w ekosystemie Apple (iOS, macOS, watchOS, tvOS). Doskonale nadaje się do tworzenia skomplikowanych animacji i przejść przy minimalnej ilości kodu. Zarządzanie danymi za pomocą @State, @Binding, @ObservedObject, @EnvironmentObject i @FetchRequest znacznie upraszcza logikę widoku.

Często łączę oba frameworki (interoperacyjność), używając UIHostingController do osadzania widoków SwiftUI w UIKit lub UIViewRepresentable/UIViewControllerRepresentable do korzystania z komponentów UIKit w SwiftUI.

Przykład osadzania widoku SwiftUI w UIViewController UIKit:

import SwiftUI
import UIKit

class MyUIKitViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let swiftUIView = MySwiftUIView() // Twój widok SwiftUI
        let hostingController = UIHostingController(rootView: swiftUIView)

        addChild(hostingController)
        view.addSubview(hostingController.view)
        hostingController.didMove(toParent: self)

        hostingController.view.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            hostingController.view.topAnchor.constraint(equalTo: view.topAnchor),
            hostingController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor),
            hostingController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            hostingController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor)
        ])
    }
}

struct MySwiftUIView: View {
    var body: some View {
        Text("Hello from SwiftUI!")
            .padding()
            .background(Color.blue)
            .foregroundColor(.white)
            .cornerRadius(10)
    }
}