UIPageViewController within NavigationController

后端 未结 4 702
耶瑟儿~
耶瑟儿~ 2020-12-23 10:54

I\'ve read every tutorial I\'ve found about UIPageViewController, but they show just basics, I\'d like to create something like new twitter app has:

相关标签:
4条回答
  • 2020-12-23 11:04

    Mr. Isuru ! I got your question... Solution given by Mr. Micnguyen is the exact solution but the mentioned delegate method (didFinishAnimating()) is called when swipe action is done due to which initially title is not shown.

    Hence to resolve that problem, we need to set its initial value in viewDidLoad() method of UIPageViewController class as mentioned below:

    • (void)viewDidLoad(){ self.navigationitem.title = arrayname[0]; }

    Thanks !

    0 讨论(0)
  • 2020-12-23 11:06

    Don't know if you are still working on this but here goes anyway. To set up a UIPageViewController you might use the tutorial and two questions below.

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

    How to implement UIPageViewController that utilizes multiple ViewControllers

    How to add UIBarButtonItem to NavigationBar while using UIPageViewController

    The last link pertains specifically to setting the contents of the navigationBar depending on what you are viewing.

    The key is to create a UINavigationItem Property in the .h file of your UIPageViewController content view controllers, meaning the ones/one that are displaying whatever it is you are displaying.

    From my code in FirstViewController.h SecondViewController.h and ThirdViewController.h

    @property (strong, nonatomic) UINavigationItem *navItem;  
    

    In the second and third links above you'll see a storyboard layout of a Master-Detail application (which uses a navigation controller). The UIPageViewControllerDataSource is the DetailViewController. The three pages associated with the pageViewController are my content view controllers.

    In DetailViewController.m you have to instantiate the contentViewControllers somewhere. At that point you pass the DetailViewControllers navigationItem id to the content view controllers. Here is how I instantiate my content view controllers using the delegate methods of the 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;
        }
    }
    

    The delegate method calls the method below. It is almost directly from the tutorial link with just a few modifications.

    -(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;
    }
    

    Notice that properties are passed into the view controller including self.navigationItem. Passing it in ensures you can make changes to the navigationBar items.

    Then in the viewDidAppear method of your content view controller you can simply set the title on the navigation bar like this.

    navItem.navigationItem.title = @"Whatever you want the title to be";
    

    It is important to use viewDidAppear because viewDidLoad is not called every time the screen appears. I believe the UIPageViewController caches the page before and the page after whatever you are viewing which saves the system from having to load the page every time you navigate to it.

    If you are using a single view controller for all you pages like the tutorial does you will have to use the index property to know what to set the title to.

    Hope this helps!

    0 讨论(0)
  • 2020-12-23 11:17

    I had this question too, but ended up doing something different, because I'm using Swift, so I thought I'd share here.

    I ended up embedding a UIPageViewController in a Container View in my Navigation Controller. On a page swipe, I used pageViewController(_:didFinishAnimating:previousViewControllers:transitionCompleted:), with my PageViewController as the UIPageViewDelegate. From there I created a protocol that I used to send data about the VC displayed to the parent VC, and change the title using self.title = "My Title".

    I didn't make the parent VC the UIPageViewDelegate because I found it to be easier to access the displayed VC from the PageViewController than from the parent VC as let childVC = pageViewController.viewControllers![0] as! DetailViewController.

    0 讨论(0)
  • 2020-12-23 11:22

    I had a very similar setup and solved the problem.

    My setup is that I have a UIPageViewController inside a UINavigationController because I wanted the navigation bar to be persistent while I swiped between each view controller. I wanted the title of the current UIViewController inside the UIPageViewController to become the title of the UINavigationController.

    The way to do this is to implement the UIPageViewControllerDelegate method pageViewController didFinishAnimating which triggers after a change to a view controller is made from the UIPageViewController. You can probably see where this going: From here, set the navigationItem.title property of the UIViewPageController, which the UINavigationController uses to set it's own title, with that of the current view controller's title.

    Example:

    - (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;
        } 
    }
    

    NB: This delegate method triggers only off gesture-initiated scrolls.

    0 讨论(0)
提交回复
热议问题