- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我的类 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
}
...
我正在使用此页面 Controller 在音乐播放器中显示歌曲的缩略图。当用户翻页时,播放器通过调用 sliderPageDelegate?.updateSong(index: self.lastPendingIndex, dir: 0)
在 pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished : Bool,previousViewControllers: [UIViewController],transitionCompleted 完成: Bool)
当我向前翻页然后立即向后翻页时,页面正确翻页(先向前再向后);但是,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
最佳答案
我在您的代码中添加了 PageControllerDelegate
并引入了两个新方法。然后在您的 UIPageViewController
类中实现这些委托(delegate),然后在 PlayerImageViewController
类中调用 viewWillAppear
和 viewWillDisappear
中的两个方法。现在删除您的 didFinishAnimation
方法并将该代码写入 viewControllerIsBeingDisplay
。
如需更深入的了解,请查看此代码。
class PlayerImageViewController: UIViewController {
var index: Int?
var image: UIImage?
weak var delegate: PageControllerDelegate?
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
if let del = self.delegate {
del.viewControllerIsBeingHide(self)
}
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if let del = self.delegate {
del.viewControllerIsBeingDisplay(self)
}
}
}
protocol SliderPageDelegate {
func updateSong(index: Int, dir: Int)
}
protocol PageControllerDelegate {
func viewControllerIsBeingHide(_ viewController: PlayerImageViewController)
func viewControllerIsBeingDisplay(_ viewController: PlayerImageViewController)
}
class SliderPgaeViewController: UIPageViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource, PageControllerDelegate {
var lastPendingIndex: Int = 0
var sliderPageDelegate: SliderPageDelegate? = nil
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!
}
}
private func createViewController(index i: Int) -> UIViewController?{
let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "PlayerImageController") as! PlayerImageViewController
vc.index = i
vc.delegate = self
// vc.image = playerManager.getSong(index: i).image //Commented becoz i do not have this file
return vc
}
var previousVCIndex = 0
func viewControllerIsBeingHide(_ viewController: PlayerImageViewController) {
previousVCIndex = viewController.index!
}
func viewControllerIsBeingDisplay(_ viewController: PlayerImageViewController) {
if let del = sliderPageDelegate {
del.updateSong(index: previousVCIndex, dir: 0)
}
}
}
关于ios - UIPageController : Turning the page forward then backward quickly only updates the first page,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49196590/
当我打开一个 Xcode 项目时,快速帮助功能工作得很好,但是当打开一个不在打开的项目中的文件(例如 abc.swift )时,文档不会出现。 下面是一个例子: 最佳答案 安装版本Command Li
我扩展了org.eclipse.ui.editors.text.TextEditor来实现自定义编辑器。对于此编辑器,我定义了一个标记类型(org.eclipse.core.resources.mar
我将 Xcode 7 beta 5(这是当前安装的唯一 xcode)与 Swift 2 一起使用,当我尝试使用 Quick 运行单元测试时,出现以下错误: error: module file was
我有一个 Excel 文档,从另一个 xls 中提取项目作为列表项来填充下拉菜单。问题是,有很多选择。我找不到快速到达我想要的区域的方法。 (例如,打开下拉列表并按“b”不会像大多数普通下拉列表那样转
如果出现给定情况,我有一组测试会使整个测试套件崩溃。而且,那种情况对于套件来说已经是失败了。 与其崩溃,我宁愿在系列设置期间测试条件是否为真,并在失败时快速中止它。 这可能吗? 最佳答案 是的,您可以
Currentyl 我正在开发一个 Java Web 应用程序,一些简单的 JSF + Spring + Hibernate 教科书应用程序架构,但我发现每次我必须这样做时,我都会在将 WAR 上传到
当我使用 --quick option 运行 mysql 时正如另一个网络帖子中所建议的描述 返回很多 -- 而当我在没有 --quick 的情况下运行 mysql 时选项 desc table返回正
是解决Quick sort中最差时间复杂度的中位数3吗? 还有, 使用 3 的中位数方法时是否存在最坏情况的时间复杂度? 最佳答案 我认为一直以中位数为基准的快速排序的最差时间复杂度是 O(nlogn
我想创建一个自定义对话框,例如联系人应用程序中的“快速联系”或官方 Twitter 应用程序中的对话框。当我点击一个按钮时,它会在按钮上方或下方打开。 http://londatiga.net/ima
开始为 Linux 平台编写 C 代码,我正在使用 man 工具来获取有关标准库函数的信息。现在我想知道有什么解决方案可以轻松获取有关这些函数使用的结构的信息。 此处的示例是 man sched_se
1.视图模型介绍 在qml中、常见的view视图有: listview: 列表视图,视图中数据来自listmodel、xmllistmodel或c++中继承自qabstractitemmo
目录 1.Popup介绍 2.自定义Popup 1.Popup介绍 Popup是一个弹出窗口的控件 它的常用属性如下所示: ancho
PathView ,顾名思义,沿着特定的路径显示 Model 内的数据。 Model 能够是 QML 内建的 ListModel 、 XmlListModel ,也能够是在 C++ 中实现的 QAb
[对于那些不在家的人,这是 Rolling My Own Version Control 的续集;)] 所以我放弃并安装了 TortoiseSVN(为了和 friend 一起做一个项目,我的个人版本控
我试图在Qt Quick应用程序中打开一个链接,收到functions are not supported in Qt Quick ui form警告,该应用程序正常工作,我想摆脱该警告,如何解决此警
我对 Qt 和 Qt Quick 非常陌生。我正在验证 Qt Quick 的 Qt Test 单元测试框架,但我无法理解如何运行测试。这就是我所拥有的,我创建了一个具有以下结构的 SUBDIRS 项目
我有执行简单选择的存储过程。任何时候我手动运行它,它都会在秒下运行。但是在生产中(SQL Azure S2 数据库),它每 12 个我们的计划任务内运行一次 - 所以我认为期望它每次都以“冷”运行是合
我正在使用quick-Json在我的程序中序列化 HashMap(String, String[]) ,但我在反序列化该对象时遇到问题。我使用此代码来序列化 map JsonGenerator
是的,我知道这个问题在技术上将是“开放式的”,并且可能会“引起辩论”,但请记住,我并不是在这里询问方向,我只是想确保我在右场。所以,话虽这么说,这是我的问题: 我想创建一个程序,允许用户输入并存储 1
我想拦截Qt Quick事件,比如key events ,这样我就可以在它们到达当前目标之前处理它们,例如当前的 focused item ,可选择阻止事件在默认事件链中传播。可以通过QML代码处理事
我是一名优秀的程序员,十分优秀!