UIPageViewControllerについて見つけたすべてのチュートリアルを読みましたが、それらは基本を示しているだけなので、新しいTwitterアプリのようなものを作成したいと思います。
UIPageViewControllerはナビゲーションコントローラに埋め込まれ、ナビゲーションバーのタイトルは現在のページに基づいており、それらのページドットもそこにあります。ユーザーは現在のページのアイテム(テーブルビュー/コレクションビューのアイテム)をタップして詳細を表示できます。
私は同様のことを思いつくことができました、各ページにはコレクションビューがあり、いくつかのアイテムの詳細を示すことがナビゲーションバーに反映され、正しいタイトルと「<」ボタンがありましたが、現在に基づいてタイトルを変更できませんでした表示されたページ
コントローラーの基本的な構造をいくつかの手順で説明してください。
あなたがまだこれに取り組んでいるかどうかわからないが、とにかくここに行く。 UIPageViewControllerを設定するには、チュートリアルと以下の2つの質問を使用します。
http://www.appcoda.com/uipageviewcontroller-storyboard-tutorial/
複数のViewControllerを利用するUIPageViewControllerを実装する方法
IPageViewControllerの使用中にUIBarButtonItemをNavigationBarに追加する方法
最後のリンクは、表示している内容に応じて、navigationBarのコンテンツを設定することに関するものです。
重要なのは、UIPageViewControllerコンテンツビューコントローラーの.hファイルにUINavigationItemプロパティを作成することです。
FirstViewController.h
SecondViewController.h
とThirdViewController.h
のコードから
@property (strong, nonatomic) UINavigationItem *navItem;
上記の2番目と3番目のリンクには、マスター/詳細アプリケーション(ナビゲーションコントローラーを使用)のストーリーボードレイアウトが表示されます。 UIPageViewControllerDataSource
はDetailViewController
です。 pageViewController
に関連付けられている3つのページは、私のコンテンツビューコントローラです。
DetailViewController.mでは、contentViewControllersをどこかにインスタンス化する必要があります。その時点で、DetailViewControllers navigationItem IDをコンテンツビューコントローラーに渡します。これが、UIPageViewController
のデリゲートメソッドを使用してコンテンツビューコントローラをインスタンス化する方法です。
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
NSString * ident = viewController.restorationIdentifier;
NSUInteger index = [_vc indexOfObject:ident];
if ((index == 0) || (index == NSNotFound)) {
return nil;
}
index--;
if (index == 0) {
return [self controllerAtIndex:index];
}else if (index == 1){
return [self secondControllerAtIndex:index];
}else if (index == 2){
return [self thirdControllerAtIndex:index];
}else{
return nil;
}
}
デリゲートメソッドは、以下のメソッドを呼び出します。ほんの少しの変更を加えたチュートリアルリンクからほとんど直接です。
-(FirstController *)controllerAtIndex:(NSUInteger)index
{
FirstController *fvc = [self.storyboard instantiateViewControllerWithIdentifier:@"FirstPageController"];
fvc.imageFile = self.pageImages[index];
fvc.titleText = self.pageTitles[index];
fvc.pageIndex = index;
fvc.navItem = self.navigationItem;
return fvc;
}
self.navigationItem
を含むプロパティがビューコントローラーに渡されることに注意してください。これを渡すことで、navigationBar項目を変更できるようになります。
次に、コンテンツビューコントローラーのviewDidAppear
メソッドで、ナビゲーションバーのタイトルを次のように設定します。
navItem.navigationItem.title = @"Whatever you want the title to be";
画面が表示されるたびにviewDidAppear
が呼び出されるわけではないため、viewDidLoad
を使用することが重要です。 UIPageViewControllerは、表示しているページの前と後のページをキャッシュするため、システムにアクセスするたびにページをロードする必要がなくなります。
チュートリアルのように、すべてのページで単一のビューコントローラーを使用している場合は、indexプロパティを使用して、タイトルを何に設定するかを知る必要があります。
お役に立てれば!
私は非常によく似た設定で問題を解決しました。
私の設定では、UINavigationController内にUIPageViewControllerがあります。これは、各ビューコントローラー間でスワイプしている間、ナビゲーションバーを永続的にしたいためです。 UIPageViewController内の現在のUIViewControllerのタイトルをUINavigationControllerのタイトルにしたかったのです。
これを行う方法は、UIPageViewControllerからビューコントローラーへの変更が行われた後にトリガーされるUIPageViewControllerDelegate
メソッドpageViewController didFinishAnimating
を実装することです。たぶんこれがどこにあるかを見ることができます:ここから、UIViewPageControllerのnavigationItem.titleプロパティを設定します。これは、UINavigationControllerが自身のタイトルを設定するために使用し、現在のビューコントローラーのタイトルのプロパティを使用します。
例:
- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
if(finished && completed)
{
NSString *titleOfIncomingViewController = [[pageViewController.viewControllers firstObject] title];
pageViewController.navigationItem.title = titleOfIncomingViewController;
}
}
注:このデリゲートメソッドは、ジェスチャーが開始したスクロールのみをトリガーします。
私もこの質問をしましたが、Swiftを使用しているため、別のことをすることになり、ここで共有したいと思いました。
ナビゲーションコントローラーのコンテナービューにUIPageViewControllerを埋め込むことになりました。ページスワイプで、pageViewController(_:didFinishAnimating:previousViewControllers:transitionCompleted :)を使用し、PageViewControllerをUIPageViewDelegateとして使用しました。そこから、表示されているVCに関するデータを親VCに送信するために使用するプロトコルを作成し、self.title = "My Title"
を使用してタイトルを変更しました。
親VC UIPageViewDelegateを作成しませんでした。表示されたVC親からではなく、PageViewControllerからアクセスする方が簡単だからですVC as let childVC = pageViewController.viewControllers![0] as! DetailViewController
。