我有三个视图控制器:设置,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) 我有一个叫做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
我有一个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) 我目前正面临一个场景,我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
我一直收到以下错误:
***由于未捕获的异常'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) 我有以下功能,每当用户从一个页面滑动到另一个页面(垂直分页)时,我想调用它:
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 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) 问题: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上找到了好几个小时,但无法继续前进。
datasource uitableview uipagecontrol ios uipageviewcontroller
我正在尝试创建一个仅占我屏幕一部分的滚动 pageviewcontroller。我已经使用 Storyboard 和 ContainerView 对象成功地完成了这项工作,但我现在需要以编程方式复制创建项目的功能。
ContainerView 似乎不是我可以使用 swift 创建的东西,所以我尝试使用 UIView 作为容器来执行此操作,我尝试使用 UIPageViewController 执行 addSubview,但我收到错误cannot convert value of type UIPageViewController to expected argument type UIView。
我认为我在这里一定遗漏了一些简单的东西,因为正如我所说,我已经使用 Storyboard/Interface Builder 完成了这一点,但是如何在使用 Swift 以编程方式构建时获得类似的功能?
在使用的教程中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) 我用数据源数组制作了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) ios ×11
swift ×6
objective-c ×3
cocoa-touch ×1
containers ×1
datasource ×1
swift3 ×1
swipe ×1
uiscrollview ×1
uitableview ×1