2013-11-13 3 views
0

У меня есть контроллер просмотра страницы с тремя навигационными контроллерами, каждый из которых сначала переходит к диспетчеру с главной таблицей. После того, как пользователь нажимает на таблицу, происходит переход с нажатием на другой VC (с подробной таблицей).Отключить переход страницы в VC, нажатой контроллером навигации

Стиль перехода - это прокрутка.

это работа хорошо. Но у меня есть следующий эффект: прокрутка страниц работает повсюду. Мне нужно прокручивать страницы только тогда, когда пользователь в таблице vc. Левый салфетки в таблице подробностей vc переходит к предыдущему навигационному контроллеру, а не обратно в главную таблицу vc.

Что мне нужно для исправления описанного поведения? X-Code 5, iOS 7

Обновление: я могу предотвратить переход страницы, возвращая нуль в источниках данных до/после, но прокрутка по-прежнему отображается на экране.

Когда я попытался отключить прокрутки, установив источник данных к нулю в 2 способах: 1) в pageViewController: didFinishAnimating) а есть исключение: Нагрузочное приложение из-за неперехваченное исключение «NSInternalInconsistencyException», причина: «Недопустимый параметр не удовлетворяет: [views count] == ​​3 ' 2) в главной таблице vc в файле willAppear/willDisapper и имеет исключение: Завершение приложения из-за неперехваченного исключения «NSGenericException», причина:' * Коллекция < __NSArrayM: 0x8a445d0> была мутирована, будучи перечислены.

Обновление 2: здесь ссылка на мой проект: http://yadi.sk/d/MWmdA3XLCdn4U. Нажмите синюю кнопку с изображением «загрузка», чтобы получить файл, или используйте переключатель языка внизу страницы.

Обновление 3: Благодаря Давиду. Его решение работает. Кроме того: я просто кладу Pan GR на DetailTable VC в свою раскадровку и связываю ее с представлением без каких-либо строк кода.

ответ

2

Две идеи приходят на ум:

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

  • Внедрить протокол данных и установить флаг, чтобы, когда вы хотите предотвратить пейджинг, dataSource возвращает nil для следующего/предыдущего контроллера представления.

Примечание: Я не сделал это с помощью pageController, но я сделал аналогичные вещи с навигационными контроллерами.

EDIT1: Я играл с вашим проектом, и да, его не будет легко предотвратить прокрутку, но это возможно. Ключевой проблемой является то, что на контроллере страницы есть подпрограмма scrollview, на которой размещаются страницы. В нем есть распознаватель жестов, чтобы распознавать поведение перетаскивания и реагировать на него. К сожалению, для «прокручивания» варианта контроллера страницы распознаватели жестов не отображаются. Есть интересная тема по этому вопросу here on SO.

Так у вас есть несколько вариантов:

  • взгляд для вида прокрутки в подвидов, найти жест распознаватель, и отключить его.

  • отключить один и тот же Scrollview

  • сделать некоторые фантазии трюки после того, как вы нажмете на первый контроллер представления. Но я имею в виду, что после завершения анимации вытащите этот вид из подзонов, удалите пейджинговый контроллер из окна и установите вытащенный вид непосредственно в качестве контроллера корневого представления. Это может быть сделано для работы, но поскольку смещения меняются. вам может потребоваться создать прозрачный вид того же размера, что и окно, и сначала вставить в него вытащенный вид.

  • добавить свой собственный распознаватель жесты и просто игнорировать результаты. Поэтому в viewDidLoad в любом представлении, которое вы не хотите подкачки, добавьте код ниже. Кажется, он работает неплохо.

Код:

UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)]; 
[self.view addGestureRecognizer:pan]; 

EDIT2: Предпочтительный способ сделать это будет использовать свой собственный панорамирование жест распознаватель, как показано в коде выше. Что вы можете сделать, так это когда появляется представление, что вы НЕ хотите активировать пейджинговый элемент управления, добавьте распознаватель жестов в viewDidLoad. Когда пользователь перейдет к основному виду, то этот распознаватель панорамирования не будет активен, и элемент управления страницей будет работать нормально. Я попробовал это с вашим демо-проектом, он отлично работает.

В то время как другие способы можно заставить работать, тем сложнее, как вы видите. Чтобы изменить scrollView или его распознаватель, вам нужно исследовать в подзонах просмотра страниц, что-то, на что Apple хмурится, и хрупка (что означает, что в будущем это может легко прорваться). Вам нужно будет предоставить общедоступные методы в вашем подклассе и выяснить, как получить ссылку на элемент управления страницы для каждого поднабора.

+0

Я могу предотвратить прокрутку до/после, но свиток все еще отображается, однако переход не работает. –

+0

Hah - отличная причина иметь очки - так что вы можете заманить разработчиков щедростью. Посмотрите, собрайте действительно простой демонстрационный проект - тот, который демонстрирует проблему, и загрузите его в общественное место, например dropbox. Тогда кто-то вроде меня попытается найти решение - его интересные проблемы, а другие ударят когда-нибудь (подавление пейджинга). Опять же, веская причина инвестировать время в ответы на вопросы, с 50-процентной щедростью, вы получите кормящее безумие разработчиков, пытающихся обеспечить ответ на стишок! –

+0

Обновлен мой вопрос со ссылкой на проект. –

Смежные вопросы