6

を使用してインデックスを追跡したいUIPageViewController。スワイプするたびに、index++またはする必要がありindex--ます。このデリゲート メソッドは、スワイプして戻すか、さらにスワイプするたびに呼び出されます。

- (void)pageViewController:(UIPageViewController *)pvc didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
    // If the page did not turn
    if (!completed)
    {
        // You do nothing because whatever page you thought
        // the book was on before the gesture started is still the correct page
        return;
    }

    // I want to check here whenever the page was swiped back or further
}

ユーザーが後ろにスワイプした場合、またはさらにスワイプした場合、このメソッドをチェックインするにはどうすればよいですか? 「viewControllerAfterViewController」と「viewControllerBeforeViewController」の 2 つの DataSource メソッドがあることはわかっていますが、ページ遷移が完了したかどうかを確認できません (上記の方法でこれを行うことができます)。上記の方法?

4

4 に答える 4

6

使用プロトコル:

MyClass : UIViewController <UIPageViewControllerDataSource,UIPageViewControllerDelegate

属性を宣言します。

@property(nonatomic) NSInteger currentIndex;
@property(nonatomic) NSInteger nextIndex;

そしてメソッドで:

-(void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers{
    NewsTableViewController *controller  = [pendingViewControllers firstObject];
    self.nextIndex = [self.arrViews indexOfObject:controller];
}

-(void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed{
    if (completed) {
        self.currentIndex = self.nextIndex;
    }
    self.nextIndex = 0;
}

そこに現在のページがあります。Corey Floyd に感謝します ここにリンクの説明を入力してください

于 2014-12-20T02:23:24.147 に答える
4

ドキュメントによると、ユーザーがページを前方または後方にスワイプしたかどうかを判断する方法はないようです。ブール値の 'finished' は、ユーザーがページめくりを完了したかどうかを示します。

回避策:

int 変数を作成し、viewControllerAfterViewController および viewControllerBeforeViewController メソッドを使用して、変数の値を増減します。それを使用して、それらが前進または後退したかどうかをテストします。

編集:ドキュメントpresentationIndexForPageViewController から使用できます

編集2:このリンクをここでsetViewControllers:direction:animated:completion:確認してください方向がまたはのいずれUIPageViewControllerNavigationDirectionForwardかになるという名前のメソッドがありますUIPageViewControllerNavigationDirectionReverse

編集 3: コード - これは、どのビュー コントローラーが前方または後方に呼び出されるかを知っていることを前提としています。

appDelegate とセッター メソッドで変数を作成します。

int indexVar;

- (void)setIndex:(int)indexVar;

次に、View Controller (前方または後方) で値を増やすか、値を減らします (viewDidLoad):

(AppDelegate *)[[UIApplication sharedApplication] delegate] setIndex:<whatever>];

それらの線に沿った何か。これは目標を達成するための正確な方法ではありませんが、正しい方向に向かうことを願っています.

于 2013-04-24T20:48:26.997 に答える
0

viewWillAppear メソッドで呼び出されるプロトコル メソッドを使用して、ViewController クラスのそれぞれにプロトコルを作成することによってそれを行いました。次に、PageViewController で、View Controller の 1 つをインスタンス化するたびに、そのデリゲートを PageViewController に設定します。これは私のプロジェクトの 3 番目の ViewController です (各 View Controller でこれを行ったことに注意してください)。

@class ViewController3;
@protocol ViewControllerPageNumber <NSObject>

-(void)viewWillAppearMyPageNumber:(int)myPageNumber;

@end
@interface ViewController3 : UIViewController
@property (nonatomic, weak) id <ViewControllerPageNumber> delegate;
@end

および viewWillAppear メソッドの .m ファイル

-(void)viewWillAppear:(BOOL)animated{
    [self.delegate viewWillAppearMyPageNumber:3];//The 3 will be different for each ViewController 
}

次に、PageViewController.m で、View Controller をインスタンス化するたびに、デリゲートを self(または PageViewController) に設定します。viewCons は、viewControllers 名を含む単なる文字列の配列です。

- (UIViewController *)viewControllerAtIndex:(NSUInteger)index {
    id vc = [[NSClassFromString([viewCons objectAtIndex:index]) alloc] init];
    if([vc isMemberOfClass:[NSClassFromString(@"ViewController3") class]]){
        ViewController3 *vc3=(ViewController3 *) vc;
        vc3.delegate=self;
    }else if([vc isMemberOfClass:[NSClassFromString(@"ViewController2") class]]){
        ViewController2 *vc2=(ViewController2 *) vc;
        vc2.delegate=self;
    }else if([vc isMemberOfClass:[NSClassFromString(@"ViewController") class]]){
        ViewController *vc1=(ViewController *) vc;
        vc1.delegate=self;
    }
    return vc;
}

最後に、カスタム デリゲート メソッドを実装しています。この場合、PageViewController の上に設定したラベルのテキストを更新します。

-(void)viewWillAppearMyPageNumber:(int)myPageNumber{
    [self refreshLabelsOnCurrentPageWithIndex:myPageNumber];
}
于 2015-01-05T09:13:19.787 に答える