2014-11-23 5 views
2

, поэтому я довольно новичок в Obj-C и попробовал посмотреть пример кода и другие онлайн-ресурсы, чтобы ответить на мой вопрос, но я не могу найти ничего, что действительно помогает. По сути, я пытаюсь добавить несколько UIViewControllers, которые я создал в Storyboard, в UIPageViewController - первое, на что я обратился за помощью, был сам Xcode с использованием шаблона приложения на основе PageBased. Это действительно помогло довольно много, и у меня появился PageController. Затем я обратился к онлайн-ресурсам, но большинство (если не все) используют один viewController (например, this). Затем я обратился к StackOverflow и нашел следующее: How to implement UIPageViewController that utilizes multiple ViewControllers. Вышеуказанные ресурсы у меня это далеко: В PageViewController.h:Как добавить несколько ViewControllers в мой UIPageViewController?

#import <UIKit/UIKit.h> 

@interface PageViewController : UIPageViewController <UIPageViewControllerDataSource> 

@end 

В PageViewController.m:

#import "PageViewController.h" 

@interface PageViewController() 

@end 

@implementation PageViewController { 
    NSArray *viewControllers; 
    UIViewController *first; 
    UIViewController *second; 
    UIViewController *third; 
    UIViewController *fourth; 
    UIViewController *fifth; 
} 

- (UIViewController *)first { 

     UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Secondary" bundle:nil]; 
     first = [sb instantiateViewControllerWithIdentifier:@"1"]; 

    return first; 
} 

- (UIViewController *)second { 

    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Secondary" bundle:nil]; 
    second = [sb instantiateViewControllerWithIdentifier:@"2"]; 

    return second; 
} 
- (UIViewController *)third { 

    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Secondary" bundle:nil]; 
    third = [sb instantiateViewControllerWithIdentifier:@"3"]; 

    return third; 
} 
- (UIViewController *)fourth { 

    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Secondary" bundle:nil]; 
    fourth = [sb instantiateViewControllerWithIdentifier:@"4"]; 

    return fourth; 
} 
- (UIViewController *)fifth { 

    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Secondary" bundle:nil]; 
    fifth = [sb instantiateViewControllerWithIdentifier:@"5"]; 

    return fifth; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.dataSource = self; 

    // Aggancio il view controller iniziale. 
    [self setViewControllers:@[self.first] 
        direction:UIPageViewControllerNavigationDirectionForward 
        animated:YES 
        completion:nil]; 
} 

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

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

    UIViewController *nextViewController = nil; 

    if (viewController == self.first) { 
     nextViewController = self.second; 
    } 
    if (viewController == self.second) { 
     nextViewController = self.third; 
    } 
    if (viewController == self.third) { 
     nextViewController = self.fourth; 
    } 
    if (viewController == fourth) { 
     nextViewController = self.fifth; 
    } 

    return nextViewController; 
} 

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

    UIViewController *prevViewController = nil; 

    if (viewController == self.fifth) { 
     prevViewController = self.fourth; 
    } 
    if (viewController == self.fourth) { 
     prevViewController = self.third; 
    } 
    if (viewController == self.third) { 
     prevViewController = self.second; 
    } 
    if (viewController == self.second) { 
     prevViewController = self.first; 
    } 

    return prevViewController; 
} 

/* 
#pragma mark - Navigation 

// In a storyboard-based application, you will often want to do a little preparation before navigation 
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    // Get the new view controller using [segue destinationViewController]. 
    // Pass the selected object to the new view controller. 
} 
*/ 

@end 

Весь этот код делает это загрузить первый контроллер представления, которое в настоящее время салфетки возможно, но на самом деле не навредит никому - почему это ?. Что я делаю не так? Вышеупомянутые ресурсы использовали заголовки и страницы для создания представлений, и я действительно не знаю, как это сделать. Кто-нибудь возражал бы, чтобы я направлял меня или подталкивал меня в правильном направлении? Любая помощь будет принята с благодарностью. Благодаря!

+0

Вы рассмотрели методы UIPageViewControllerDataSource. https://developer.apple.com/library/ios/documentation/Uikit/reference/UIPageViewControllerDataSourceProtocolRef/index.html – Sandeep

ответ

6

Вот полный рабочий код, если кому-то это интересно. Потратил меня на то, чтобы все было правильно, но в итоге это сработало отлично!

#import "PageViewController.h" 

@interface PageViewController() 

@property (nonatomic, retain) UIViewController *first; 
@property (nonatomic, retain) UIViewController *second; 
@property (nonatomic, retain) UIViewController *third; 
@property (nonatomic, retain) UIViewController *fourth; 
@property (nonatomic, retain) UIViewController *fifth; 

@end 

@implementation PageViewController { 
    NSArray *viewControllers; 
} 

- (UIViewController *)first { 
    if (!_first) { 
     UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Secondary" bundle:nil]; 
     _first = [sb instantiateViewControllerWithIdentifier:@"1"]; 
    } 
    return _first; 
} 

- (UIViewController *)second { 
    if (!_second) { 
    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Secondary" bundle:nil]; 
    _second = [sb instantiateViewControllerWithIdentifier:@"2"]; 
    } 
    return _second; 
} 
- (UIViewController *)third { 
    if (!_third) { 
    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Secondary" bundle:nil]; 
    _third = [sb instantiateViewControllerWithIdentifier:@"3"]; 
    } 
    return _third; 
} 
- (UIViewController *)fourth { 
    if (!_fourth) { 
    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Secondary" bundle:nil]; 
    _fourth = [sb instantiateViewControllerWithIdentifier:@"4"]; 
    } 
    return _fourth; 
} 
- (UIViewController *)fifth { 
    if (!_fifth) { 
    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Secondary" bundle:nil]; 
    _fifth = [sb instantiateViewControllerWithIdentifier:@"5"]; 
    } 
    return _fifth; 
} 


- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.dataSource = self; 

    // Aggancio il view controller iniziale. 
    [self setViewControllers:@[self.first] 
        direction:UIPageViewControllerNavigationDirectionForward 
        animated:YES 
        completion:nil]; 
} 

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

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

    UIViewController *nextViewController = nil; 

    if (viewController == self.first) { 
     nextViewController = self.second; 
    } 
    if (viewController == self.second) { 
     nextViewController = self.third; 
    } 
    if (viewController == self.third) { 
     nextViewController = self.fourth; 
    } 
    if (viewController == self.fourth) { 
     nextViewController = self.fifth; 
    } 

    return nextViewController; 
} 

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

    UIViewController *prevViewController = nil; 

    if (viewController == self.fifth) { 
     prevViewController = self.fourth; 
    } 
    if (viewController == self.fourth) { 
     prevViewController = self.third; 
    } 
    if (viewController == self.third) { 
     prevViewController = self.second; 
    } 
    if (viewController == self.second) { 
     prevViewController = self.first; 
    } 

    return prevViewController; 
} 

@end 
3

Это старый, но это очень помогло мне. По какой-то причине у вашего кода были некоторые проблемы для меня, и я не использовал раскадровку. Для будущей ссылки на кого-то это код, который я использую, работает:

#import "PageController.h" 
#import "SeasonTixViewController.h" 
#import "SeasonTicketPricesViewController.h" 
#import "ArenaLayoutSeasonTixViewController.h" 

@interface PageController() 

@property (nonatomic, retain) UIViewController *first; 
@property (nonatomic, retain) UIViewController *second; 
@property (nonatomic, retain) UIViewController *third; 

@end 

@implementation PageController { 
NSArray *viewControllers; 
} 

- (UIViewController *)first { 
if (!_first) { 
    SeasonTixViewController *first = [[SeasonTixViewController alloc] init]; 
    _first = first; 
} 
return _first; 
} 

- (UIViewController *)second { 
if (!_second) { 
    SeasonTicketPricesViewController *second = [[SeasonTicketPricesViewController alloc] init]; 
    _second = second; 
} 
return _second; 
} 
- (UIViewController *)third { 
if (!_third) { 
    ArenaLayoutSeasonTixViewController *third = [[ArenaLayoutSeasonTixViewController alloc] init]; 
    _third = third; 
} 
return _third; 
} 


- (void)viewDidLoad { 
[super viewDidLoad]; 

self.pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil]; 

[[self.pageController view] setFrame:self.view.bounds]; 

self.pageController.dataSource = self; 

[self.pageController setViewControllers:@[self.first] 
       direction:UIPageViewControllerNavigationDirectionForward 
       animated:YES 
       completion:nil]; 

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

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

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

UIViewController *nextViewController = nil; 

if (viewController == self.first) { 
    nextViewController = self.second; 
} 
if (viewController == self.second) { 
    nextViewController = self.third; 
} 

return nextViewController; 
} 

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

UIViewController *prevViewController = nil; 

if (viewController == self.third) { 
    prevViewController = self.second; 
} 
if (viewController == self.second) { 
    prevViewController = self.first; 
} 

return prevViewController; 
} 

- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController { 
// The number of items reflected in the page indicator. 
return 3; 
} 

- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController { 
// The selected item reflected in the page indicator. 
return 0; 
} 

@end 
Смежные вопросы