SwiftUI отправляет действие со страницы в PageViewController - PullRequest
3 голосов
/ 25 мая 2020

Я установил PageViewController в SwiftUI, следуя известному руководству Взаимодействие с UIKit , с UIViewControllerRepresentable et c.

Мой массив контроллеров состоит из простых Просмотры SwiftUI. Я передаю простую структуру IntroPage для предоставления содержимого. Представления вложены, как это принято в SwiftUI, таким образом:

PageView
-   IntroScreen                // part of the pages array
    -   VStack 
        -   Text
        -   Image
        -   ButtonView         // a separate view struct
            - HStack
                - ForEach      // iterating through the buttons in my IntroPage Object
                    - Button
PageControl

Теперь я хочу добавить в эти представления несколько кнопок . Их следует настраивать через мою структуру IntroPage. Один из них переходит на следующую страницу в PageViewController, другой сообщает PageViewController, что сначала нужно добавить больше страниц, еще одна кнопка закрывает весь PageViewController.

Я не могу понять, как получить доступ к этим методам в PageViewController, где их реализовать (представление экземпляра? Координатор PageViewController?) И как получить доступ к нужным мне объектам (например, currentPage Переменная привязки PageViewController).

Например, я реализовал функцию forward() в координаторе PageViewController:

func forward() {
   if parent.currentPage < parent.controllers.count - 1 {
       parent.currentPage += 1
   }
}

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

Есть идеи?

РЕДАКТИРОВАТЬ: По запросу, вот ситуация в ButtonView.

struct IntroButtonView: View {
    var page: IntroPage
    var body: some View {
        HStack() {
           Button(action:dismiss) {
              Text("LocalizedButtonTitle")
           }
           // ... more buttons, based on certain conditions
        }
    }

    func dismiss() { 
         // how to dismiss the modally presented controller ?
    }

    func next()    { 
         // how to advance to the next page
    }

    func expand()  { 
         // how to add more pages to the pages array
    }
}

Или, может быть, я совершенно не прав и все еще думаю категориями «событий», а не «деклараций» ...

1 Ответ

2 голосов
/ 29 мая 2020

Ладно, разобрался. Должен сказать, сначала не интуитивно. Исходя из традиционного программирования, основанного на событиях, это совсем другой образ мышления.

Я использовал переменную @State в основном экземпляре представления.

Я использовал переменные @Binding для работы с состоянием как в восходящем (ViewControllers, Controls), так и в нисходящем (subviews) состоянии. Так, например, я использовал переменную, чтобы сообщить dataSource из UIPageViewController, следует ли возвращать контроллер представления до / после текущего.

Для отключения модально представленного контроллера, который я использовал, я использовал

@Environmen(\.presentationMode) var presentationMode

...

func dismiss() {
  self.presentationMode.wrapptedValue.dismiss()
}

Было несколько предостережений при принятии решения о том, как вкладывать представления и какие переменные выбирать для привязок, но это теперь мне ясно. В конечном итоге самая большая проблема заключалась в том, где должен быть закреплен «источник истины». Оказалось, прямо «посередине», то есть под контроллером и над конкретными видами.

Надеюсь, это будет полезно для других, ищущих что-то подобное.

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