web-dev-qa-db-ja.com

NavigationController内のUIPageViewController

UIPageViewControllerについて見つけたすべてのチュートリアルを読みましたが、それらは基本を示しているだけなので、新しいTwitterアプリのようなものを作成したいと思います。

enter image description here

UIPageViewControllerはナビゲーションコントローラに埋め込まれ、ナビゲーションバーのタイトルは現在のページに基づいており、それらのページドットもそこにあります。ユーザーは現在のページのアイテム(テーブルビュー/コレクションビューのアイテム)をタップして詳細を表示できます。

私は同様のことを思いつくことができました、各ページにはコレクションビューがあり、いくつかのアイテムの詳細を示すことがナビゲーションバーに反映され、正しいタイトルと「<」ボタンがありましたが、現在に基づいてタイトルを変更できませんでした表示されたページ

コントローラーの基本的な構造をいくつかの手順で説明してください。

18
Adam Bardon

あなたがまだこれに取り組んでいるかどうかわからないが、とにかくここに行く。 UIPageViewControllerを設定するには、チュートリアルと以下の2つの質問を使用します。

http://www.appcoda.com/uipageviewcontroller-storyboard-tutorial/

複数のViewControllerを利用するUIPageViewControllerを実装する方法

IPageViewControllerの使用中にUIBarButtonItemをNavigationBarに追加する方法

最後のリンクは、表示している内容に応じて、navigationBarのコンテンツを設定することに関するものです。

重要なのは、UIPageViewControllerコンテンツビューコントローラーの.hファイルにUINavigationItemプロパティを作成することです。

FirstViewController.hSecondViewController.hThirdViewController.hのコードから

@property (strong, nonatomic) UINavigationItem *navItem;  

上記の2番目と3番目のリンクには、マスター/詳細アプリケーション(ナビゲーションコントローラーを使用)のストーリーボードレイアウトが表示されます。 UIPageViewControllerDataSourceDetailViewControllerです。 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プロパティを使用して、タイトルを何に設定するかを知る必要があります。

お役に立てれば!

15
Ben

私は非常によく似た設定で問題を解決しました。

私の設定では、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;
    } 
}

注:このデリゲートメソッドは、ジェスチャーが開始したスクロールのみをトリガーします。

6
micnguyen

私もこの質問をしましたが、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

0
Luke Redmore