UIPageViewController与不同的ViewControllers,正确的方法?

时间:2013-12-22 22:21:09

标签: ios objective-c uipageviewcontroller

基本上,我有一个表视图控制器和一个普通的视图控制器,我想这样做,以便我可以在视图控制器之间滑动,就像应用程序的主屏幕(明显相同类型的视图控制器)。

但我发现的事情是UIpageviewcontroller在你拥有相同类型的viewcontroller的多个视图时会被使用,例如在图片之间滑动,你可以在课堂上设置一个索引以及与索引相关的图像数组并以此方式设置它。

但是我试图在这个设置中获得不同的视图控制器。现在它已经是两个但肯定会达到4个左右。

UIPageViewController是正确的设置方式还是其他方式。

编辑:下面添加的代码

    //
//  ViewController.m
//  testb
//
#import "MainPostController.h"
#import "MainTableViewController.h"
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize pageViewController;
@synthesize indexValue = _indexValue;

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.indexValue= 1;
    NSLog(@"main intitated");

    // Do any additional setup after loading the view, typically from a nib.
    self.pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageViewController"];
    self.pageViewController.dataSource = self;

    MainTableViewController *tvc = [self.storyboard instantiateViewControllerWithIdentifier:@"MainTableViewController"];
    MainPostController *pvc;
    NSArray *viewcontrollers =[NSArray arrayWithObjects:tvc, pvc, nil];

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

    self.pageViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 30);

    [self addChildViewController:pageViewController];
    [self.view addSubview:pageViewController.view];
    [self.pageViewController didMoveToParentViewController:self];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}




-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
    if (self.indexValue == 1) {
        MainPostController *pvc = [self.storyboard instantiateViewControllerWithIdentifier:@"MainPostController"];
        self.indexValue = 0 ;
        return  pvc;

    }
    else return nil;




}

-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{

    if (self.indexValue == 0) {
        MainTableViewController *tvc = [self.storyboard instantiateViewControllerWithIdentifier:@"MainTableViewController"];
        self.indexValue = 1;
        return tvc;

    }
    else return nil;


}
@end

我希望初始视图是表视图控制器(tvc),我希望Post视图控制器(pvc)位于其左侧。我可以加载它并轻松地在两者之间滑动但有时我可以进一步滑动边界所以基本上如果我开始在tvc - > pvc - > tvc那么我可以通过向右滑动到同一个tvc更进一步然后通过向左滑动进行最后一次转换,到达边界或走另一条路tvc - > gt; pvc - > tvc - > pvc - > pvc。最终达到了界限。一旦应用程序在tvc初始启动我无法前进一个页面,(这应该发生什么)如果我去tvc - > pvc并尝试转到左边的页面它不会让我(这应该是什么应该发生)

由于

4 个答案:

答案 0 :(得分:8)

最后完成它,不必向不同的类添加任何属性。刚试过课。下面是代码:

-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
    if ([viewController isKindOfClass:[MainTableViewController class]]) {
        MainPostController *pvc = [self.storyboard instantiateViewControllerWithIdentifier:@"MainPostController"];
        return  pvc;

    }

    else return nil;

}


-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{

    if ([viewController isKindOfClass:[MainPostController class]]) {
        MainTableViewController *tvc = [self.storyboard instantiateViewControllerWithIdentifier:@"MainTableViewController"];
        return tvc;

    }
    else return nil;
}

应该很容易添加更多视图控制器,因为我只需要添加if语句来测试它们。解决方法的主要问题是方法isKindOfClass:

感谢您的回复!

答案 1 :(得分:2)

我遇到了同样的问题,这就是我所做的和完美的工作。

  

·H

@interface ViewController : UIViewController <UIPageViewControllerDataSource>

@property (strong, nonatomic) UIPageViewController *pageViewController;

@property (nonatomic) NSArray *viewControllerIDArr;

@end
  

的.m

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self setupDefaults];
}

- (void)setupDefaults
{
    self.viewControllerIDArr = @[@"FirstViewController", @"SecondViewController"];

    self.pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageViewController"];

    self.pageViewController.dataSource = self;

    UIViewController *startingViewController = [self.storyboard instantiateViewControllerWithIdentifier:self.viewControllerIDArr[0]];

    NSArray *viewControllers = @[startingViewController];

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

    self.pageViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 45);

    [self addChildViewController:_pageViewController];

    [self.view addSubview:_pageViewController.view];

    [self.pageViewController didMoveToParentViewController:self];
}

- (UIViewController *)getViewControllerFromClass:(Class)class isNext:(BOOL)next
{
    NSInteger index = [self.viewControllerIDArr indexOfObject:[NSString stringWithFormat:@"%@", class]];

    if (next)
        index+=1;
    else
        index-=1;

    if (index < 0 || index >= self.viewControllerIDArr.count)
        return nil;
    else
        return [self.storyboard instantiateViewControllerWithIdentifier:self.viewControllerIDArr[index]];

}


#pragma mark - Page View Controller Data Source

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
    return [self getViewControllerFromClass:viewController.class isNext:NO];
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
    return [self getViewControllerFromClass:viewController.class isNext:YES];
}

- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController
{
    return 0;
}

- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController
{
    return 0;
}

注意:

self.viewControllerIDArr容器故事板ID &#39>的viewControllers。

在故事板中看起来像这样:

enter image description here

答案 2 :(得分:1)

这是一个老问题但是由于我遇到了这个问题,我会发布我的解决方案。

我第一次这样做时添加了我的代码

func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { }

当您使用两根手指连续滚动视图时遇到问题并且除非滚动停止,否则不会调用didFinishAnimating

所以我只是使用了这种委托方法。

func pageViewController(pageViewController: UIPageViewController, willTransitionToViewControllers pendingViewControllers: [UIViewController]) {

    let currentView = pendingViewControllers[0]

    if currentView is UINavigationController && currentView.restorationIdentifier == "Settings" {
        index = 0
    } else if currentView is UINavigationController && currentView.restorationIdentifier == "Main" {
        index  = 1
    } else if currentView is UINavigationController && currentView.restorationIdentifier == "Message" {
        index = 2
    }
}

其中currentView是当前UIViewController(或UINavigationController,就像我正在使用的那样,使用restorationIdentifier来识别我的导航控制器),index是一个全局值,可以知道{{1在数组中实例化。

答案 3 :(得分:-1)

您可以使用UIViewPageViewController和一些自定义逻辑。

正如您所说,处理此问题的常用方法是让页面视图控制器的数据源为每个页面创建相同类型的视图控制器,并使用模型中的数据填充它。

在您的情况下,您可以将pageNumber属性添加到您要在页面视图控制器中托管的所有视图控制器。然后,在数据源方法中,使用旧视图控制器的页码来确定新的页码。然后根据页码给出一个switch语句。 switch语句中的每个case都会创建一个不同类型的视图控制器。