SwiftUI: принудительное обновление - PullRequest
1 голос
/ 12 июня 2019

Обычно мы не можем обсуждать предварительную версию Apple, но я уже видел множество обсуждений SwiftUI, поэтому я подозреваю, что все в порядке; только один раз.

Я нахожусь в процессе вождения в сорняки на одном из учебных пособий (я делаю это).

Я добавляю пару кнопок под прокручивающимися экранами в учебном пособии «Интерфейс с UIKit»: https://developer.apple.com/tutorials/swiftui/interfacing-with-uikit

Это кнопки «Далее» и «Предыдущая». Когда на одном конце или другом, соответствующая кнопка скрывается. У меня это работает нормально.

У меня проблема с доступом к экземпляру UIPageViewController, представленному PageViewController.

У меня есть свойство currentPage, изменяющее (делая PageViewController делегатом UIPageViewController), но мне нужно заставить программно изменять UIPageViewController.

Я знаю, что могу "грубой силой" отобразить изображение, перерисовав тело PageView, отражая новую currentPage, но я не совсем уверен, как это сделать.

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
        }
    }
}

Я знаю, что ответ должен быть очевидным, но мне трудно понять, как программно обновить VStack или тело.

1 Ответ

2 голосов
/ 12 июня 2019

Установка currentPage, так как это @State, перезагрузит все тело.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...