Подтвердить что ты не робот

UIPageViewController в NavigationController

Я прочитал каждый учебник, который я нашел о UIPageViewController, но они показывают только основы, я хотел бы создать что-то вроде нового приложения Twitter:

enter image description here

UIPageViewController встроен в контроллер навигации, заголовок навигационной панели основан на текущей странице, и эти точки страницы также доступны, пользователь может нажать на элемент на текущей странице (элемент из представления таблицы/коллекции), чтобы увидеть подробности.

Я смог придумать что-то подобное, на каждой странице был вид коллекции, и показ детали какого-то элемента был отражен в панели навигации, было правильное название и "<", но я не смог изменить название на основе текущей отображаемой страницы

Пожалуйста, не могли бы вы описать мне, как это сделать за несколько шагов/базовую структуру контроллеров?

4b9b3361

Ответ 1

Не знаю, продолжаете ли вы по-прежнему работать над этим, но здесь все равно. Чтобы настроить UIPageViewController, вы можете использовать учебник и два вопроса ниже.

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

Как реализовать UIPageViewController, который использует несколько ViewControllers

Как добавить UIBarButtonItem в NavigationBar при использовании UIPageViewController

Последняя ссылка относится конкретно к настройке содержимого навигационной панели в зависимости от того, что вы просматриваете.

Ключом является создание свойства UINavigationItem в файле .h вашего контроллера содержимого содержимого UIPageViewController, что означает те/те, которые отображают то, что вы показываете.

Из моего кода в FirstViewController.h SecondViewController.h и ThirdViewController.h

@property (strong, nonatomic) UINavigationItem *navItem;  

Во второй и третьей ссылках выше вы увидите раскладку макета приложения Master-Detail (в котором используется навигационный контроллер). UIPageViewControllerDataSource - DetailViewController. Три страницы, связанные с pageViewController, являются моими контроллерами представления содержимого.

В DetailViewController.m вам нужно создать экземпляр contentViewControllers где-нибудь. В этот момент вы передаете идентификатор navigationOptemersViewControllers для контроллеров содержимого. Вот как я создаю экземпляры своих контроллеров представления контента, используя методы делегата 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, чтобы знать, как установить заголовок.

Надеюсь, это поможет!

Ответ 2

У меня была очень похожая настройка и я решил проблему.

Моя настройка заключается в том, что у меня есть UIPageViewController внутри UINavigationController, потому что я хотел, чтобы навигационная панель была постоянной, а я провела между каждым контроллером представления. Я хотел, чтобы название текущего UIViewController внутри UIPageViewController стало названием UINavigationController.

Способ сделать это - реализовать метод UIPageViewControllerDelegate pageViewController didFinishAnimating, который запускается после изменения контроллера представления из UIPageViewController. Вероятно, вы можете увидеть, где это происходит: отсюда установите свойство navigationItem.title UIViewPageController, которое 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;
    } 
}

NB: этот метод делегата запускается только с помощью прокрученных жестов.

Ответ 3

У меня тоже был этот вопрос, но в итоге я сделал что-то другое, потому что я использую Swift, поэтому я решил поделиться здесь.

В итоге я встроил UIPageViewController в представление контейнера в моем контроллере навигации. При пролистывании страницы я использовал pageViewController (_: didFinishAnimating: previousViewControllers: transitionCompleted :), с моим PageViewController в качестве UIPageViewDelegate. Оттуда я создал протокол, который я использовал для отправки данных о VC, отображаемом в родительский VC, и изменил заголовок, используя self.title= "My Title".

Я не сделал родительский VC UIPageViewDelegate, потому что я обнаружил, что было легче получить доступ к отображаемому VC из PageViewController, чем из родительского VC, так как let childVC = pageViewController.viewControllers![0] as! DetailViewController let childVC = pageViewController.viewControllers![0] as! DetailViewController.

Ответ 4

г. Исуру! У меня вопрос... Решение, данное г-ном Мингьюйеном, является точным решением, но упомянутый метод делегата (doneFinishAnimating()) вызывается при выполнении действия салфетки, из-за которого первоначально название не отображается.

Следовательно, для решения этой проблемы нам нужно установить начальное значение в методе viewDidLoad() класса UIPageViewController, как указано ниже:

  • (пустоты) viewDidLoad() {  self.navigationitem.title= arrayname [0]; }

Спасибо!