- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
设置:我正在尝试创建一个带有嵌入式 UIPageViewController 的 ViewController,其中有 4 个页面,每个页面都是自己的 ViewController。
问题:滚动时,第二个 View 总是重复出现。例如,对于 View1、View2、View3、View4,滚动会显示 View1、View2、View2、View3、View4,然后向后滚动会显示 View4、View3、View3、View2、View1 的顺序,即使页面控制是准确的。
这是我的页面 View Controller 类:
import UIKit
class HostGamePageViewController: ROLViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource {
// Constants
let ViewControllers: NSArray = ["HostGameTest1", "HostGameTest2", "HostGameTest3", "HostGameTest4"]
// Properties
var pageViewController: UIPageViewController!
var currentViewController: String!
// UI
@IBOutlet var pageControl: UIPageControl!
override func viewDidLoad() {
super.viewDidLoad()
pageViewController = storyboard?.instantiateViewControllerWithIdentifier("HGPageViewController") as? UIPageViewController
pageViewController.delegate = self
pageViewController.dataSource = self
let startingViewController = viewControllerAtIndex(0)!
pageViewController.setViewControllers([startingViewController], direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: {done in })
addChildViewController(pageViewController)
view.addSubview(pageViewController.view)
pageViewController.view.frame = view.bounds
pageViewController.didMoveToParentViewController(self)
view.gestureRecognizers = pageViewController.gestureRecognizers
// Setup page controls
pageControl.numberOfPages = ViewControllers.count
view.bringSubviewToFront(pageControl)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// Get the index of the current page view
func indexOfViewController() -> Int {
if currentViewController != nil {
return ViewControllers.indexOfObject(currentViewController)
}
return NSNotFound
}
// Get the view controller of the given index
func viewControllerAtIndex(index: Int) -> UIViewController? {
if ViewControllers.count == 0 || index >= ViewControllers.count {
return nil
}
pageControl.currentPage = index
currentViewController = ViewControllers[index] as String
return storyboard?.instantiateViewControllerWithIdentifier(currentViewController) as? ROLViewController
}
// Handle clicks on the page control
@IBAction func pageControlClick(sender: UIPageControl) {
var direction: UIPageViewControllerNavigationDirection
if sender.currentPage < indexOfViewController() {
direction = UIPageViewControllerNavigationDirection.Forward
} else {
direction = UIPageViewControllerNavigationDirection.Reverse
}
if let viewController = viewControllerAtIndex(sender.currentPage) {
pageViewController.setViewControllers([viewController], direction: direction, animated: false, completion: nil)
}
}
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
var index = indexOfViewController()
if index == 0 || index == NSNotFound {
return nil
}
index--
return viewControllerAtIndex(index)
}
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
var index = indexOfViewController()
if index == NSNotFound {
return nil
}
index++
if index == ViewControllers.count {
return nil
}
return viewControllerAtIndex(index)
}
}
这是我的 Storyboard截图的链接: http://f.cl.ly/items/0V3W133Q34170q39393Q/Image%202014-09-11%20at%2011.49.44%20AM.png
我是否错误地设置了 dateSource?我在某处读到 UIPageViewController 通过将动画设置为 false 来进行一些缓存,这是应该的修复,但对我没有做任何事情。任何帮助将非常感激。谢谢!
最佳答案
我有一个非常相似的问题(不使用 swift,在 obj-c 中,有 3 个 View Controller ,中间的那个重复了一次:“0,1,1,2”)。原来这都是关于页面 View Controller 数据源方法的……
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController;
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController;
我还没有真正深入研究 swift(也没有兴趣这样做),但是伪读你的代码让我觉得你限制了“”的限制 before”和“after”关键方法(快速),变量包含在 Controller 内部用作UIPageViewControllerDataSource,即正是我更改并解决了问题。
我的英语不是很好,但我希望你能理解最后一句话。我使用的修复基于 this tutorial .在我的例子中,我在所有 3 种情况下都使用了 View Controller ,其中“UINavigationViewControllers”,所以我创建了一个具有属性的“NavigationWrapperViewController”:
@property(assign, nonatomic) NSUInteger index;
然后,在检查关键数据源方法中的边界限制时(只显示一个,对另一个使用相同的技术):
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {
NSUInteger indice = ((NavigationWrapperViewController*)viewController).index;
if ((indice == 0) || (indice == NSNotFound)) {
return nil;
}
return [self viewControllerAtIndex:(--indice)];
}
并且在 viewControllerAtIndex 中实例化 View Controller 时,不要忘记在返回它们之前正确设置该属性:
NavigationWrapperViewController *wrapperViewController = [self.storyboard instantiateViewControllerWithIdentifier:self.ViewControllers[index]];
wrapperViewController.index = index;
return wrapperViewController;
细微的区别在于,显示的 View Controller 的索引由当前 View Controller 存储(使用一个简单的包装器,该类完全是为了这个目的而创建的,它只是在他的 .h 文件中有一个属性实现) UIPageViewControllerDataSource 负责的类。
这解决了我的问题,也许是某种线程相关的问题影响了当前获取的 View Controller 索引,并导致整个 - 重复 View Controller - 问题。
如果您愿意尝试,希望对您有所帮助!
关于ios - Swift - UIPageViewController 总是重复第二个 ViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25795093/
我现在在另一个 ViewController 之上展示了一个几乎透明的 ViewController,但它禁用了与下面的 ViewController 的交互。这是我目前使用的代码: topContr
我有一个 View Controller ,其工具栏上有 3 个 UIButtons,可以打开一个新的 View Controller 作为弹出窗口。我在 Storyboard 中创建了 Segues
这个问题在这里已经有了答案: Delegates in swift? (15 个答案) 关闭 3 年前。 在我的场景中,我试图在关闭 View Controller 期间将值从 ViewContro
假设我有两个 viewController,AViewController 和 BViewController。 AViewController 嵌入在 NavigationController 中(
我有 3 个 View Controller A、B 和 C。 我在 vcA 上,我使用 推送 vcB [self.navigationController pushViewController:vc
我想知道如何在 VC3 和 VC1 之间传递数据。 我拥有的是 Root View (VC1)。然后你输入一个tableView,如果你选择一个项目,你将进入tableView2(VC3) - 类别
我在使用 Unwind Segue 时遇到问题。我有 3 个 ViewController,它们都在名为 ViewController.swift 的类下。我试图获取最后一个 ViewControll
我有一个应用程序,其左上角有一个汉堡菜单。按下时,菜单会以 90% 的不透明度淡入当前 ViewController,显示应用程序的主要导航选项。 我使用下面的代码从页面呈现 viewControll
我的问题是,当我呈现一个 UIViewController 时,呈现的 View 变黑了。 我有一个名为 mainViewController 的 UIViewController,它是我窗口的 Ro
例如,当我呈现UIActivityViewController或UIAlertController时,我仍然可以看到背景viewController,我不想在viewContollerA中嵌入view
我从second viewController进入了third viewController,但是我不想回到第二个viewController,我需要直接回到我的第一个viewController,我
我的应用程序是标签栏(+ 导航)应用程序。在 FirstViewController 中,我调用 onModalView。 -(void) onFilter { FilterViewControl
Photo Sharing 部分是我写的一个ViewController,当我按下正确的项目时,PhotoSharingViewController 会动画出现。 这是我的代码: PhotoShari
我正在尝试在另一个 View Controller 中使用 subview Controller 的应用程序。我有一个 VC,我正在实例化另一个 VC,并在外部 VC 内使用它自己的 xib。 我使用
我正在寻找有关包含 ViewController 的滚动的想法。我需要知道包含 View Controller 的位置。我已经尝试过 UIPageViewController 但我无法让滚动委托(de
我有一个带有嵌入式 NavigationController 的基本 ViewController 来提供工具栏。 ToolBar 有三个按钮,用于通过 segue 调用 ViewController
我的应用程序中的伙计们,我在应用程序委托(delegate)方法中有一些代码 application:didFinishLaunchingWithOptions:确定初始 View Controlle
我遇到了一个问题,我将对此进行描述,并且发现了一些类似的问题,但我认为与我的问题无关。 我有一个 UITabBarController,其中有 2 个用于 VC1 和 VC2 的选项卡。 VC1 转到
我的应用程序中有一个计时器。如果计时器达到 0,则用户将被带到失败页面。当这种情况发生时,之前的 ViewController 没有被关闭,导致更多的内存被占用。 如果出现失败页面,我希望关闭之前的
在问这个问题之前,我当然做了一些调查。我在 google 和 stackoverflow 上找到的链接或主题之一是: How do I load another view controller fro
我是一名优秀的程序员,十分优秀!