UIPageViewController 委托、数据源和接口错误

Posted

技术标签:

【中文标题】UIPageViewController 委托、数据源和接口错误【英文标题】:UIPageViewController delegate, dataSource, & interface error 【发布时间】:2017-05-08 01:58:09 【问题描述】:

我正在开发一个使用 UIPageViewController 的应用程序,以便我可以从左向右滑动以浏览页面 (ViewControllers)。自从我的原始帖子以来,我已经编写了代码。但我收到三个错误。

错误 1:在“IntroPages”类型的对象上找不到属性“delegate” 错误 2:在“IntroPages”类型的对象上找不到属性“dataSource” 错误 3:“IntroPages”没有可见的@interface 声明选择器“setViewControllers:direction:animated:completion:”

所有三个错误都在 viewDidLoad 的第一部分(部分在 大括号中)。前两个是 viewDidLoad 下面的代码,第三个是 5 行。

委托和数据源在 .h 文件中被引用。为什么他们没有被发现?为什么“IntroPages”没有可见的@interface?

代码如下。

IntroPages.h

#import <UIKit/UIKit.h>

@interface IntroPages : UIViewController
<UIPageViewControllerDelegate, UIPageViewControllerDataSource>

@end

IntroPages.m

#import "IntroPages.h"

@interface IntroPages ()

@end

@implementation IntroPages

    NSArray *myViewControllers;


- (void)viewDidLoad 
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.delegate = self; 
    self.dataSource = self;

    UIViewController *p1 = [self.storyboard
                            instantiateViewControllerWithIdentifier:@"Intro1ID"];
    UIViewController *p2 = [self.storyboard
                            instantiateViewControllerWithIdentifier:@"Intro2ID"];
    UIViewController *p3 = [self.storyboard
                            instantiateViewControllerWithIdentifier:@"Intro3ID"];
    UIViewController *p4 = [self.storyboard
                            instantiateViewControllerWithIdentifier:@"Intro4ID"];

    myViewControllers = @[p1,p2,p3,p4];

    [self setViewControllers:@[p1]
                   direction:UIPageViewControllerNavigationDirectionForward
                    animated:NO completion:nil];

    NSLog(@"loaded!");



@end

【问题讨论】:

那么你面临的问题是什么......以及你尝试了什么......?发布你的代码。 我编辑了我所在位置的帖子。包含代码。 【参考方案1】:

如果页面不是太多,您可以创建一个视图控制器数组,其中包含一组 id,如下所示:

// assuming this
@property (strong, nonatomic) IBOutlet UIPageViewController *pageViewController;
@property (strong, nonatomic) NSArray *pages;

// then, to setup, say these are the page ids...
NSArray *vcIds = @[ @"id0", @"id1", ... ];
self.pages = [NSMutableArray array];

for (NSString *vcId in vcIds) 
    UIViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:vcId];
    [self.pages addObject:vc];


[self.pageViewController setViewControllers:self.pages direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

UIPageViewControllerDataSource 在给定 vc 之前和之后请求视图控制器。通过在 pages 数组中查找传递的 vc 得到正确的结果...

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController 
    NSUInteger index = [self.pages indexOfObject:viewController];
    return (index)? self.pages[index-1] : 0;


- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController 
    NSUInteger index = [self.pages indexOfObject:viewController];
    return (index<self.pages.count-1)? self.pages[index+1] : self.pages[self.pages.count-1];

【讨论】:

数组中只有 5 个页面。您提供的代码与我在教程中看到的类似。该教程在数组中包含标题和图像,但它们实际上并未分配给 VC。他们只是从阵列中拉出来创建一个 vc。我假设从数组中调用实际的 vcs 是相似的。感谢您的帮助。 我是否正确假设使用它的故事板将包括原始视图控制器 -> 页面视图控制器 -> 将从数组中调用的任何视图? @thejdah,是的。事实上,我们在建议的代码中使用self.storyboard 获得故事板,因此要求self 的vc 定义在与具有这些ID 的vc 相同的故事板中。如果您需要在不同的故事板中定义 vcs,请告诉我,我可以向您展示如何做到这一点 所有这些都在实现文件中? 是的,虽然属性在界面中,可能在你的 .m 文件或 .h 文件中

以上是关于UIPageViewController 委托、数据源和接口错误的主要内容,如果未能解决你的问题,请参考以下文章

UIPageViewController 委托、数据源和接口错误

UIPageViewController 委托方法类似于 scrollViewDidScroll:(UIScrollview*)scrollview

UIPageViewController 不调用委托方法(Swift 5)

在故事板中使用 UIPageViewController

如何从自定义函数中调用委托函数?

即使在实现委托方法后也没有显示页面控件