2016-04-26 5 views
2

Ich bin auf der Suche nach einem zuverlässige Weg, um UIPageViewController aktuellen Index zu verfolgen.Eine zuverlässige Möglichkeit, UIPageViewController aktuellen Index zu erhalten

Das Problem ist bekannt; Obwohl ViewControllers korrekt dargestellt werden, ist es schwierig, den aktuellen Index zu verfolgen.

Ich dachte, es wird gut sein für SO-Community dieses Thema zu aktualisieren, da es aus irgendeinem Grund nicht lösen

ich durch viele Threads hier durchsucht haben, aber die meisten Antworten sind veraltet oder als unzuverlässig markiert (Das Ergebnis hängt auf, wenn Benutzer einen vollen Swipe oder nur die Hälfte Swiped etc)

Ich habe this Thread, aber es gibt keine explizit richtige Antwort.

Ich habe versucht:

1) Die Verfolgung der Viewcontroller Ansicht tag - link - immer 0 zurück

2) bei Indexvariable Methoden in beiden UIPageViewController Sehen, viewControllerBeforeViewController und viewControllerAfterViewControlle

seine Ergebnisse sind unvorhersehbar, manchmal springt es über einen Index usw.

Haben Sie jemanden mit einem guten Weg, zuverlässige Art und Weise kommen den UIPageCiewController-Index im Auge zu behalten, um ihn zu nutzen (zum Beispiel den aktuellen Index drucken)?

Ich würde sowohl obj-c und schnelle Implementierung schätzen, aber swift ist derjenige, den ich suche.

+0

Ich habe eine Antwort in dieser Verbindung, aber leider meine Antwort hat keinen upvotes, aber unter Verwendung von Delegierten ist der einzige Weg (für mich zumindest) den Index korrekt zu verfolgen. Lassen Sie mich wissen, wenn Sie auf meine Implementierung (ObjC) schauen wollen ... – 0yeoj

+0

ich denke @ 0yeoj Lösung ist, was Sie suchen: http://Stackoverflow.com/a/33818615/2301271 – Joshua

+0

@ 0yeoj fühlen sich frei poste deine Implementierung hier, vorzugsweise in swift – DCDC

Antwort

2

Dies ist für ObjC

parent

#import "PagesViewController.h" 

// Delegate: PageViewDelegate 
// Declared inside `PagesViewController` 
// 
@interface ParentViewController() <UIPageViewControllerDataSource, UIPageViewControllerDelegate, PageViewDelegate> 

@property (nonatomic) UIPageViewController *pageViewController; 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil]; 
    self.pageViewController.dataSource = self; 
    self.pageViewController.view.frame = self.view.frame; 

    // im setting page 3 as the default page 
    // 
    [self.pageViewController setViewControllers:[NSArray arrayWithObject:[self viewControllerAtIndex:3]] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil]; 
    [self addChildViewController:self.pageViewController]; 
    [self.view addSubview:self.pageViewController.view]; 
} 

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController 
{ 
    NSUInteger index = [(PagesViewController *)viewController index]; 

    if (index == 0) { 
     return nil; 
    } 

    index--; 

    return [self viewControllerAtIndex:index]; 
} 

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

    NSUInteger index = [(PagesViewController *)viewController index]; 

    index++; 

    if (index == 5) { 
     return nil; 
    } 

    return [self viewControllerAtIndex:index]; 
} 

- (PagesViewController *)viewControllerAtIndex:(NSInteger)index 
{ 
    PagesViewController *vc = [[PagesViewController alloc] init]; 

    // set delegate here.. 
    // 
    vc.delegate = self; 

    // other data 
    // 
    vc.index = index; 
    vc.titleLabel = [NSString stringWithFormat:@"Screen :%ld", (long)index]; 

    return vc; 
} 

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

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

// This is what you need 
// 
- (void)viewController:(id)VC didShowWithIndex:(long)index 
{ 
    NSLog(@"didShowWithIndex: %ld", index); 
} 

PagesViewController.h

@protocol PageViewDelegate <NSObject> 

- (void)viewController:(id)VC didShowWithIndex:(long)index; 

@end 


@interface PagesViewController : UIViewController 

@property (weak) id <PageViewDelegate> delegate; 

@property (nonatomic) NSInteger index; 

@property (nonatomic) NSString *titleLabel; 

@end 

PagesViewController.m

@implementation PagesViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.view.backgroundColor = [UIColor blackColor]; 

    UILabel *titleLabel = [[UILabel alloc] initWithFrame:self.view.frame]; 
    titleLabel.textAlignment = NSTextAlignmentCenter; 
    titleLabel.textColor = [UIColor whiteColor]; 
    titleLabel.text = self.titleLabel; 
    [self.view addSubview:titleLabel]; 
} 

// Trigger delegate here 
// 
- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    [self.delegate viewController:self didShowWithIndex:self.index]; 
} 

@end 
2

Wie @ 0yeoj vorgeschlagen, Delegation Design-Muster ist die Lösung hier. Es erfordert ein wenig über den Tellerrand hinaus zu denken.

Lassen Sie uns Protokoll IndexDelegate hinzufügen und ein wenig PageContentViewController

protocol IndexDelegate { 
func showIndex(index:Int) 
} 

import UIKit 

class PageContentViewController: UIViewController { 

@IBOutlet weak var imageView: UIImageView! 
var delegate:IndexDelegate? 
var pageIndex:Int = 0 
var imageFile:String! 
override func viewDidLoad() { 
    super.viewDidLoad() 
    self.imageView.image = UIImage(named: self.imageFile) 
    } 
override func viewDidAppear(animated: Bool) { 
    self.delegate!.showIndex(self.pageIndex) 
    } 

jetzt in unserer Mutter View-Controller wir zu Protokoll

func showIndex(index: Int) { 
    print(index) 
    } 

vergessen nicht entsprechen, ändern zu setzen yourPageContentViewControllerInstance.delegate = self und erben Protokoll YourParentViewController:UIViewController, UIPageViewControllerDataSourceDelegate, IndexDelegate {}

Das war's! Funktioniert perfekt und zuverlässig und verzögert sich nicht!

+0

Hallo DCDC, wo platzierst du den "yourPageContentViewControllerInstance.delegate = self". Schleifen Sie alle VControllers und weisen Sie delegate = parent zu? – drdrdrdr