我正在設計一個 UIPageViewController,用戶可以在其中瀏覽各種 YouTube 視頻。但是,我只想一次加載一定數量的 videoID、視頻識別符號。當用戶到達包含 videoID 的陣列的任一端時,我會請求加載更多內容。然而,由于不能通過 UIPageViewController 的 dataSource 制作和回傳視圖控制器,在這種情況下它是它自己,當用戶再次滑動時不會發生任何事情——即使在陣列中添加了更多 videoID(由于 dataSource 已經回傳 nil 并且它不會檢查兩次)。注意:如果前后沒有視圖控制器,dataSource 方法會標記控制器。
作為解決方案,我手動添加了一個 UIPanGestureRecognizer :
- 檢查當前 viewController 是否已被標記
- 根據 viewControllers 標記檢查用戶是否在正確的方向上滑動
- 檢查是否可以通過手動呼叫兩個 dataSource 方法之一來創建另一個視圖控制器
如果所有這些都是真的,我呼叫 setViewControllers 來手動導航。但是,它什么也沒做。
請求更多資料正常作業,手動呼叫時 dataSource 回傳另一個 viewController 但是 setViewControllers 方法不起作用。
// Add the GestureRecognizer
private func addCustomGestureRecognizer() {
let panGesture = UIPanGestureRecognizer(target: self, action: #selector(swipeManually))
panGesture.delegate = self
view.addGestureRecognizer(panGesture)
}
//Triggers every time a swipe is made
@objc private func swipeManually(_ sender: UIPanGestureRecognizer) {
if let currentVC = self.viewControllers?.first as? LearnVideoViewController {
guard currentVC.isEndOfTailSequence || currentVC.isEndOfHeadSequence else {return}
let userDidSwipeUp = sender.velocity(in: view).y < 0
// isEndOfTailSequence means it is the last viewController
// isEndOfHeadSequence means it is the first viewController
if currentVC.isEndOfTailSequence && userDidSwipeUp {
swipeUpManually(on: currentVC)
} else if currentVC.isEndOfHeadSequence && !userDidSwipeUp {
swipeDownManually(on: currentVC)
}
}
}
//Extension to manually navigate pages when needed
extension UIPageViewController {
func swipeUpManually(on currentVC: LearnVideoViewController) {
if let nextViewController = dataSource!.pageViewController( self, viewControllerAfter: currentVC) {
//No transition happens even if put in a DispatchQueue.Main.async block
setViewControllers([nextViewController], direction: .forward, animated: true, completion: nil)
}
}
func swipeDownManually(on currentVC: LearnVideoViewController) {
if let beforeController = dataSource!.pageViewController( self, viewControllerBefore: currentVC) {
//No transition happens even if put in a DispatchQueue.Main.async block
setViewControllers([beforeController], direction: .reverse, animated: true, completion: nil)
}
}
}
uj5u.com熱心網友回復:
您的問題是setViewControllers將整個視圖控制器堆疊重置為您傳入的任何視圖控制器陣列。您想要附加視圖控制器(并可能洗掉舊的),因此請進行相應調整。
setViewControllers([beforeController], direction: .reverse, animated: true, completion: nil)
這告訴控制器創建一個1( beforeController) 的視圖控制器堆疊。獲取當前集合并確保將其包含在此方法呼叫中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/437385.html
