标签: uipageviewcontroller

UIPageViewController在静态视图控制器之间切换并保留(重用)内容

我有三个视图控制器:设置,Chatbox和QuickMsg.

我想使用UIPageViewController在这三个视图控制器之间切换.对于每个视图控制器,我不想在刷卡页面之间重新启动视图控制器,因为它包含用户输入的数据,我想要保留数据.我将三个视图控制器定义为静态变量.

当我在页面之间滑动时,屏幕变黑.我哪里做错了?

非常感谢提前!

ChatboxController,SettingController和QuickMsgController是三个UIViewController控制器. PagingViewController.h

#import <UIKit/UIKit.h>
#import "ChatboxController.h"
#import "SettingController.h"
#import "PagingViewController.h"
#import "QuickMsgController.h"
@class ChatboxController;
@class SettingController;
@class QuickMsgController;
@interface PagingViewController : UIViewController<UIPageViewControllerDataSource>

@property (strong, nonatomic) UIPageViewController *pageController;

@property (assign, nonatomic) NSInteger index;
+(ChatboxController*) getChatboxController;
+(SettingController*) getSettingsController;
@end
Run Code Online (Sandbox Code Playgroud)

PagingViewController.m

#import "PagingViewController.h"

@interface PagingViewController ()

@end

@implementation PagingViewController

static ChatboxController* chatboxViewController;
static SettingController* settingViewController;
static QuickMsgController* quickMessageViewController;
int defaultIndex=1;
NSArray *viewControllers;
+(ChatboxController*) getChatboxController
{
    return chatboxViewController;
}
+(SettingController*) getSettingsController
{
    return settingViewController;
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController …
Run Code Online (Sandbox Code Playgroud)

objective-c ios uipageviewcontroller

0
推荐指数
1
解决办法
2673
查看次数

子类化UIPageViewController,但是当我将[[alloc] init]的结果分配给self时,我收到警告.为什么?

我有一个叫做ImageGalleryPageViewController子类的类UIPageViewController.在我的init方法中,我调用:

self = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
Run Code Online (Sandbox Code Playgroud)

但我得到这个警告:

从'UIPageViewController*'分配给'ImageGalleryPageViewController*'的指针类型不兼容

我应该只是投出结果[[alloc] init]吗?这看起来很奇怪,难道不应该认识到我是一个子类而不是抱怨吗?

cocoa-touch objective-c uiviewcontroller ios uipageviewcontroller

0
推荐指数
1
解决办法
823
查看次数

UIPageViewController的第一页显示黑屏但未加载内容

我有一个UIPageViewController,它正在翻阅页面,所有页面都正确加载,除了它保持黑色的第一页,加载图标也不会消失.以下是我的方法用于设置pageviewcontroller的第一个视图(它是对从后端获取信息的函数的回调)

self.card.images = cardImagesArray
activityIndicator.stopAnimating()
activityIndicator.removeFromSuperview()
self.cardImages = cardImagesArray
let startingViewController: UIViewController = getItemController(0)!
let viewControllers: NSArray = [startingViewController]
pageViewController!.setViewControllers(viewControllers as! [AnyObject], direction: .Forward, animated: false, completion: nil)
Run Code Online (Sandbox Code Playgroud)

ios uipageviewcontroller swift

0
推荐指数
1
解决办法
1638
查看次数

iOS:右键滑动手势在UIPageViewController中无响应

我目前正面临一个场景,我UIPageViewController在视图上使用了一个场景,当用户从索引值向右滑动时我想要正确的滑动手势0,所以我试图UIPageViewController通过以下代码添加右侧滑动手势:

UISwipeGestureRecognizer *rightRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(rightSwipeHandle:)];
rightRecognizer.direction = UISwipeGestureRecognizerDirectionRight;
[rightRecognizer setNumberOfTouchesRequired:1];
//Edit 1
[self.pageViewController.view addGestureRecognizer:rightRecognizer];
Run Code Online (Sandbox Code Playgroud)

但是,当我添加手势时,pageviewcontroller我收到以下错误消息(由@Lyndsey Scott解答)

no visible interface uipageviewcontroller declares the selector addgesturerecognizer
Run Code Online (Sandbox Code Playgroud)

任何人都可以指导我如何在此实现正确的滑动 pageViewController

编辑1:替换了@Lyndsey Scott提供的代码,删除了错误,但问题仍然存在,我无法触发该滑动事件.

objective-c ios uiswipegesturerecognizer uipageviewcontroller

0
推荐指数
1
解决办法
1795
查看次数

使用页面视图控制器出错

我一直收到以下错误:

***由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'提供的视图控制器数(0)与请求的转换所需的数量(1)不匹配.

我不确定我做错了什么PageViewController可能导致这个错误.我也试着按照这里提供的答案.但是,解决方案并没有帮助我,因为我不确定我的代码中哪一部分可能导致问题.我对Swift很新,所以任何帮助都会非常感激.

更新: 我发现setViewController导致问题,并在删除时消失.但是,为什么会导致问题呢?谢谢!

    var pageViewController: UIPageViewController!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    self.pageViewController = harishStoryboard.instantiateViewControllerWithIdentifier("ViewController1") as! UIPageViewController
    self.pageViewController.dataSource = self
    let allViewControllers = [harishStoryboard.instantiateViewControllerWithIdentifier("ViewController2") as! ViewController2, harishStoryboard.instantiateViewControllerWithIdentifier("ViewController3") as! ViewController3, harishStoryboard.instantiateViewControllerWithIdentifier("ViewController4") as! ViewController4, harishStoryboard.instantiateViewControllerWithIdentifier("ViewController5") as! ViewController5, harishStoryboard.instantiateViewControllerWithIdentifier("ViewController6") as! ViewController6, harishStoryboard.instantiateViewControllerWithIdentifier("ViewController7") as! ViewController7]
    let viewControllers = NSArray(object: allViewControllers)
    self.pageViewController.setViewControllers(viewControllers as? [UIViewController], direction: .Forward, animated: false, completion: nil)
    self.addChildViewController(pageViewController)
    self.view.addSubview(self.pageViewController.view)
    self.pageViewController.didMoveToParentViewController(self)
}
Run Code Online (Sandbox Code Playgroud)

ios uipageviewcontroller swift

0
推荐指数
1
解决办法
2138
查看次数

检测页面变化/动画完成到 UIPageViewController 中的另一个页面

我有以下功能,每当用户从一个页面滑动到另一个页面(垂直分页)时,我想调用它:

func sendNotification (){

    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "stopVideo"), object: nil)
    print("called")

}
Run Code Online (Sandbox Code Playgroud)

当前,每当创建 pageAfter 或 -before 时都会调用该函数。用于“创建”下一页/上一页的函数如下所示(在本例中为viewControllerAfter):

func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {

    let currentIndexString  = (viewController as! MyViewController).index
    let currentIndex        = indec.index(of: currentIndexString!)

    //set if so that next page
    if currentIndex! < indec.count - 1 {

        let myViewController = MyViewController()

        myViewController.index            = indec[currentIndex! + 1]

        sendNotification() //function is called 

        return myViewController

    }

    return nil

}
Run Code Online (Sandbox Code Playgroud)

由于 UIPageViewController 在某种程度上准备了以下页面并且返回上一页也不会调用该函数(因为不需要“创建”视图控制器)我没有得到我想要的结果。我想知道是否有一个函数可以sendNotification()在动画完成时调用。我发现了很多关于跳转到另一页的问题,但没有一个关于我的问题。我真的很感激你的帮助!

ios uipageviewcontroller swift

0
推荐指数
1
解决办法
4169
查看次数

添加页面时 UIPageViewController 崩溃

在我正在开发的 iOS 11 应用程序中(使用 Swift 4),我需要将页面动态添加到UIPageViewController. 但是,在某些情况下,我会收到以下崩溃错误 ( NSInternalInconsistencyException):

2017-11-27 14:55:54.787260+0000 MyApp[380:79434] *** Assertion failure in -[UIPageViewController _flushViewController:animated:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3698.21.8/UIPageViewController.m:2124
2017-11-27 14:55:54.791022+0000 MyApp[380:79434] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Don't know about flushed view <UIView: 0x12dd48ac0; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x1c003c280>>'
Run Code Online (Sandbox Code Playgroud)

我对 iOS 开发很陌生,所以如果答案很明显,我很抱歉,但我很难找到崩溃的根本原因。记录的消息也不是很有帮助...

这是我用来添加页面的代码:

//Inflate the view controller
let viewController = newViewController(param: someParam )

//Add it to the view controllers pool
viewControllersOrdered.insert(viewController, at: getInsertionIndex(param: someOtherParam) ) …
Run Code Online (Sandbox Code Playgroud)

ios uipageviewcontroller swift

0
推荐指数
1
解决办法
2877
查看次数

UIPageViewController -presentationCount不触发

问题:UIPageViewController页面之间的导航工作正常,但:
1)导航点视图未显示
2)未调用某些dataSource方法(可能是1引起的)

我有以下UI设置(基本上UIPageViewController在中UITableViewCell

UITableViewCell <-UIViewController <-ContainerView <-UIPageViewController

问题:

呼叫确定:

func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController?

func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController?
Run Code Online (Sandbox Code Playgroud)

未致电:

func presentationCount(for pageViewController: UIPageViewController) -> Int
func presentationIndex(for pageViewController: UIPageViewController) -> Int 
Run Code Online (Sandbox Code Playgroud)

所有设置都在viewDidLoad之后完成:

dataSource = self
setViewControllers([viewController], direction: .reverse, animated: false, completion: nil)
Run Code Online (Sandbox Code Playgroud)

注意:我正在UIPageViewController内容视图中直接在应用程序的其他位置使用其他位置->那里的所有委托方法都工作正常。另一个(可能直接相关)的问题是导航点视图不可见。(如果未嵌入,再次可以正常工作)。

有人遇到过这样的事情吗?为什么某些dataSource委托方法被调用而另一些则不被调用?

我一直在看这段代码,我已经在Google上找到了好几个小时,但无法继续前进。

UIPageViewController实现

datasource uitableview uipagecontrol ios uipageviewcontroller

0
推荐指数
1
解决办法
933
查看次数

以编程方式创建分屏 UIPageViewController

我正在尝试创建一个仅占我屏幕一部分的滚动 pageviewcontroller。我已经使用 Storyboard 和 ContainerView 对象成功地完成了这项工作,但我现在需要以编程方式复制创建项目的功能。

ContainerView 似乎不是我可以使用 swift 创建的东西,所以我尝试使用 UIView 作为容器来执行此操作,我尝试使用 UIPageViewController 执行 addSubview,但我收到错误cannot convert value of type UIPageViewController to expected argument type UIView

我认为我在这里一定遗漏了一些简单的东西,因为正如我所说,我已经使用 Storyboard/Interface Builder 完成了这一点,但是如何在使用 Swift 以编程方式构建时获得类似的功能?

uiscrollview ios uipageviewcontroller swift

0
推荐指数
1
解决办法
3617
查看次数

'=='如何与UIViewControllers一起使用?

在使用的教程中UIPageViewController,有这样的代码:

if self == parent.pages.first {
    self.label_Back.isUserInteractionEnabled = false
}
Run Code Online (Sandbox Code Playgroud)

基本上检查哪个是否self是第一个控制器堆栈。这是如何运作的?

而且,如果我们有一个控制器类的多个实例中pages的阵列UIViewController,将做firstIndex类似下面工作的事情吗?

/**
 Notifies '_tutorialDelegate' that the current page index was updated.
 */
private func notifyTutorialDelegateOfNewIndex() {
    if let firstViewController = viewControllers?.first,
        let index = self.pages.firstIndex(of: firstViewController) {
            tutorialDelegate?.tutorialPageViewController(tutorialPageViewController: self, didUpdatePageIndex: index)
    }
}
Run Code Online (Sandbox Code Playgroud)

uiviewcontroller ios uipageviewcontroller swift

0
推荐指数
1
解决办法
75
查看次数

在Swift 3 iOS中向前游泳时,在UIPageViewController中调用After和Before方法

我用数据源数组制作了UIPageViewController,它运行正常.但是当向右滑动转发时,请调用After和Before方法.
我的代码在这里:

import UIKit

class MainPageViewController: UIPageViewController,UIPageViewControllerDataSource {


override func viewDidLoad() {
    super.viewDidLoad()

    self.dataSource = self
initUPageVC(idx:0,isAnimate:false,direction: UIPageViewControllerNavigationDirection.forward)
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController?
{

    //PRIVIOUS
    let pageContent: MainPageContentViewController = viewController as! MainPageContentViewController

    var index = pageContent.index

    if ((index == 0) || (index == NSNotFound))
    {
        return nil
    }

    index -= 1;

    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "updateMenuBarItemSelectedNotif"), object: index)

    return getViewControllerAtIndex(index)
}

func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController?
{

    //NEXT
    let pageContent: MainPageContentViewController = viewController …
Run Code Online (Sandbox Code Playgroud)

containers swipe ios uipageviewcontroller swift3

-1
推荐指数
1
解决办法
1878
查看次数