web-dev-qa-db-fra.com

SwiftUI: forcer une mise à jour

Normalement, nous ne pouvons pas discuter de Apple trucs d'avant-première, mais j'ai déjà vu beaucoup de discussions sur SwiftUI, donc je soupçonne que c'est OK; juste une fois.

Je suis en train de planter dans les mauvaises herbes sur l'un des tutoriels (je fais ça).

J'ajoute une paire de boutons sous les écrans pouvant être glissés dans le didacticiel "Interfaçage avec UIKit": https://developer.Apple.com/tutorials/swiftui/interfacing-with-uikit

Ce sont les boutons "Suivant" et "Précédent". À une extrémité ou à l'autre, le bouton correspondant se cache. Je travaille bien.

Le problème que j'ai, est d'accéder à l'instance UIPageViewController représentée par le PageViewController.

J'ai la propriété currentPage changeante (en faisant du PageViewController un délégué de l'UIPageViewController), mais je dois forcer l'UIPageViewController à changer par programme.

Je sais que je peux "forcer brutalement" l'affichage en redessinant le corps de PageView, reflétant une nouvelle currentPage, mais je ne sais pas exactement comment faire.

struct PageView<Page: View>: View {
    var viewControllers: [UIHostingController<Page>]
    @State var currentPage = 0

    init(_ views: [Page]) {
        self.viewControllers = views.map { UIHostingController(rootView: $0) }
    }

    var body: some View {
        VStack {
            PageViewController(controllers: viewControllers, currentPage: $currentPage)

            HStack(alignment: .center) {
                Spacer()

                if 0 < currentPage {
                    Button(action: {
                        self.prevPage()
                    }) {
                        Text("Prev")
                    }

                    Spacer()
                }

                Text(verbatim: "Page \(currentPage)")

                if currentPage < viewControllers.count - 1 {
                    Spacer()

                    Button(action: {
                        self.nextPage()
                    }) {
                        Text("Next")
                    }
                }

                Spacer()
            }
        }
    }

    func nextPage() {
        if currentPage < viewControllers.count - 1 {
            currentPage += 1
        }
    }

    func prevPage() {
        if 0 < currentPage {
            currentPage -= 1
        }
    }
}

Je sais que la réponse devrait être évidente, mais j'ai du mal à trouver comment actualiser par programme le VStack ou le corps.

10
Chris Marshall

Définition de currentPage, car il s'agit d'un @State, rechargera tout le corps.

6
Lu_