我有一个类
我正在使用此页面控制器在音乐播放器中显示歌曲的缩略图。当用户翻页时,通过在
当我向前翻页然后立即向后翻页时,页面会正确地翻转(先向前再向后);但是,
因此,如果我们有歌曲列表
SliderPgaeViewController: UIPageViewController
,它使用滚动过渡样式,如下所示:class SliderPgaeViewController: UIPageViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource, PlayerUpdatePageControllerDelegate {
var lastPendingIndex: Int = 0
var sliderPageDelegate: SliderPageDelegate? = nil
let playerManager = PlayerManager.getInstance()
override func viewDidLoad() {
super.viewDidLoad()
self.dataSource = self
self.delegate = self
setViewControllers([createViewController(index: playerManager.getCurrentIndex())!], direction: .forward, animated: true, completion: nil)
lastPendingIndex = playerManager.getCurrentIndex()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func presentationCount(for pageViewController: UIPageViewController) -> Int {
return playerManager.getSongsCount()
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
if let vc = viewController as? PlayerImageViewController {
if (vc.index == 0){
return nil
}
return createViewController(index: vc.index! - 1)
}
return nil
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
if let vc = viewController as? PlayerImageViewController {
if (vc.index == playerManager.getSongsCount() - 1){
return nil
}
return createViewController(index: vc.index! + 1)
}
return nil
}
func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]){
if let vc = pendingViewControllers[0] as? PlayerImageViewController {
self.lastPendingIndex = vc.index!
}
}
func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool,previousViewControllers: [UIViewController],transitionCompleted completed: Bool) {
print("before completion : \(self.lastPendingIndex)")
if(completed){
print("completed : \(self.lastPendingIndex)")
if (viewControllers?.first as? PlayerImageViewController) != nil {
sliderPageDelegate?.updateSong(index: self.lastPendingIndex, dir: 0)
}
}
}
private func createViewController(index i: Int) -> UIViewController?{
let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "PlayerImageController") as! PlayerImageViewController
vc.index = i
vc.image = playerManager.getSong(index: i).image
return vc
}
...
我正在使用此页面控制器在音乐播放器中显示歌曲的缩略图。当用户翻页时,通过在
pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool,previousViewControllers: [UIViewController],transitionCompleted completed: Bool)
中调用sliderPageDelegate?.updateSong(index: self.lastPendingIndex, dir: 0)
来更改正在播放的歌曲。当我向前翻页然后立即向后翻页时,页面会正确地翻转(先向前再向后);但是,
sliderPageDelegate?.updateSong(index: self.lastPendingIndex, dir: 0)
仅在向前翻页时被调用。因此,如果我们有歌曲列表
(A、B、C、......)
,并且我们当前正在播放歌曲A
。当用户向前滑动时,缩略图将更改为B
的缩略图,并且播放器将更新歌曲为B
。但是,如果向前滑动后很快又向后滑动,则缩略图将更改为A
,但歌曲仍为B
。
更新:
如果A
具有index = 0
,而B
具有index = 1
,则快速移动A->B->A
将打印以下内容:before completion : 1
before completion : 1
completed : 1
completed = true
给更新歌曲的委托函数的事件?听起来太简单了,但每次我期望某些事情发生而它没有发生时,这就是我的第一个检查(例如,“封装函数的事件是否实际触发了该条件?”)。 - ArchdoogviewControllerBefore
和viewControllerAfter
代码中,你调用了一个if let vc = viewController as? PlayerImageViewController
。你确定每个 vc 都是PlayerImageViewController
吗? - Jake