SwiftUI: текстовое поле в UIPageViewController
Я новичок в SwiftUI, я работаю над вводным представлением, в котором есть 3 страницы, каждая из которых имеет TextField. Возможно ли это в SwiftUI?
Код, который у меня есть до сих пор, повторно отображает представление, которое закрывает клавиатуру после каждого нажатия на клавиатуру, что не очень хорошо для пользователя.
Ниже мой UIViewControllerRepresentable, в makeUIViewController стиль перехода прокрутки запускается после каждого нажатия клавиатуры. как мне этого избежать?
struct PageViewController: UIViewControllerRepresentable {
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
@Binding var currentPageIndex: Int
var viewControllers: [UIViewController]
func makeUIViewController(context: Context) -> UIPageViewController {
let pageViewController = UIPageViewController(
transitionStyle: .scroll,
navigationOrientation: .horizontal)
pageViewController.dataSource = context.coordinator
pageViewController.delegate = context.coordinator
return pageViewController
}
func updateUIViewController(_ pageViewController: UIPageViewController, context: Context) {
pageViewController.setViewControllers(
[viewControllers[currentPageIndex]], direction: .forward, animated: true)
}
class Coordinator: NSObject, UIPageViewControllerDataSource, UIPageViewControllerDelegate {
var parent: PageViewController
init(_ pageViewController: PageViewController) {
self.parent = pageViewController
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
//retrieves the index of the currently displayed view controller
guard let index = parent.viewControllers.firstIndex(of: viewController) else {
return nil
}
//shows the last view controller when the user swipes back from the first view controller
if index == 0 {
return parent.viewControllers.last
}
//show the view controller before the currently displayed view controller
return parent.viewControllers[index - 1]
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
//retrieves the index of the currently displayed view controller
guard let index = parent.viewControllers.firstIndex(of: viewController) else {
return nil
}
//shows the first view controller when the user swipes further from the last view controller
if index + 1 == parent.viewControllers.count {
return parent.viewControllers.first
}
//show the view controller after the currently displayed view controller
return parent.viewControllers[index + 1]
}
func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
if completed,
let visibleViewController = pageViewController.viewControllers?.first,
let index = parent.viewControllers.firstIndex(of: visibleViewController) {
parent.currentPageIndex = index
}
}
}
}