Как переместить контроллер просмотра страницы с помощью кнопки [duplicate]

Вот ответ http://wiki.python.org/moin/DictionaryKeys

Что пойдет не так, если вы попытаетесь использовать списки как ключи, с хэш, как, скажем, место их памяти?

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

Как насчет использования литералов в словаре в словаре?

2
задан Kim Stacks 3 November 2015 в 10:59
поделиться

5 ответов

Ответ Майкла Даутермана совершенно прав, как показывает этот скринкаст:

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

Как и ваш, мой проект, показанный на скриншоте выше , имеет иерархию контроллера представления:

  • UITabBarController
  • ViewController
  • UIPageViewController
  • Страница (которая имеет основной вид и метка и кнопки являются подвидными для этого)

Похоже, что суть вашего вопроса заключается не столько в том, какой метод заставляет контроллер просмотра страницы перейти на следующую или предыдущую страницу - как вы уже сказали, это просто setViewControllers:..., но как кнопка связывается с иерархией контроллера представления. В моем примере это означает отправку сообщения с кнопки внутри представления страницы, мимо контроллера просмотра страницы, мимо UIPageViewController и до ViewController, который затем сообщает UIPageViewController, что делать.

Я могу подумайте о многочисленных способах этого:

  • Кнопка отправляет уведомление, для которого зарегистрирован ViewController
  • Кнопка отправляет действие с нулевым действием, для которого ViewController имеет handler
  • Кнопка отправляет сообщение контроллеру панели вкладок (его свойство tabBarController), которое затем отправляет сообщение вниз в его текущий выбранный контроллер представления, ViewController
  • Кнопка отправляет сообщение в контроллер своего вида (настроен в nib или раскадровке как действие), который отправляет сообщение своему parentViewController!.parentViewController!, который является ViewController.

Что я предпочитаю? Лично мне больше всего нравится ничтожное действие, потому что он не требует лишнего кода. Единственная реализация func pageNextButton() находится в ViewController. Это красота действия nil-target: он поднимает цепочку ответчиков, ищет получателя, автоматически . Контроллер просмотра страницы и UIPageViewController вообще не имеют кода в этом отношении.

Мне нравится это намного лучше, чем parentViewController!.parentViewController!, потому что последнее требует в конечном счете, чтобы контроллер вида страницы знал имя метода в ViewController, который он может вызывать, и он должен сбрасываться на ViewController, который не очень портативен и, по моему мнению, слишком много знает о своей среде. С другой стороны, с помощью ничтожного действия отправитель полностью агностик о том, кем будет реальная цель! Поэтому мне больше всего нравится действие nil-target, а второе - лучшее.

14
ответ дан matt 16 August 2018 в 00:26
поделиться
  • 1
    Прошу прощения, что меня считают спором. Я искренне хочу узнать, как это сделать. Я почти уверен, что мне не хватает фундаментальных знаний, поэтому я не могу понять ответ Майкла Дотерманна. Я добавил больше информации на мой вопрос. Спасибо, что постарался привести меня в «ага». – Kim Stacks 1 November 2015 в 05:09
  • 2
    Ладно, так что ты еще не знаешь? На ваш вопрос неоднократно ответили. Кнопка в QuizPageItem сообщает QuizViewController (или QuizPageViewController), что он был использован, и QuizViewController (или QuizPageViewController) переходит на следующую или предыдущую страницу соответственно, вызывая setViewControllers:..., как вы уже сказали несколько раз , Поэтому вы должны это сделать и принять один из ответов. – matt 1 November 2015 в 18:41
  • 3
    Послушайте, я сделал свой screencast еще более похожим на ваши спецификации. Я делаю именно то, что вы описываете, и я делаю это так, как сказал Майкл Даутерманн и другие. Ответы, которые вы были , являются ответом . Какие еще доказательства необходимы? – matt 1 November 2015 в 20:16
  • 4
    Очень хорошо, я добавил несколько дальнейших обсуждений. Если вы не понимаете цепочку ответчиков и действия nil-target, вы можете прочитать мою книгу: apeth.com/iOSBook/ch11.html#_nil_targeted_actions Если вы не знаете, какие уведомления являются : apeth.com/iOSBook/ch13.html#_notifications_2 Если вы не знаете о parentViewController и смотрите иерархию диспетчера, вам может потребоваться прочитать целую главу в контроллерах представлений: apeth .com / iOSBook / ch19.html – matt 2 November 2015 в 00:34
  • 5
    Если вы все равно не получите его, я разместил для вас пример проекта github: github.com/mattneub/pageViewControllerUsingInternalButtons – matt 2 November 2015 в 01:03

Вы можете использовать:

Для следующей страницы

pageViewController.setViewControllers(startingViewControllers,
                                                direction: UIPageViewControllerNavigationDirection.Forward,
                                                animated: true,
                                                completion: nil)

Для предыдущей страницы

pageViewController.setViewControllers(startingViewControllers,
                                                direction: UIPageViewControllerNavigationDirection.Reverse,
                                                animated: true,
                                                completion: nil)
2
ответ дан anhtu 16 August 2018 в 00:26
поделиться
  • 1
    Привет, я обновил вопрос. Я не мог использовать ваш ответ, потому что кнопки находятся внутри QuizPageItem. Мой обновленный вопрос прольет больше света. – Kim Stacks 1 November 2015 в 04:15

Вы можете использовать setViewControllers:direction:animated:completion: , чтобы программным образом перевернуть ваши страницы .

Просто пройдите по предыдущему или следующему контроллеру просмотра страницы, и все должно быть установлено.

6
ответ дан Community 16 August 2018 в 00:26
поделиться
  • 1
    Привет, я обновил вопрос. Я не мог использовать ваш ответ, потому что они все равно ViewController (QuizPageItem). Я не могу просто перейти в следующий контроллер представления. – Kim Stacks 1 November 2015 в 04:15
  • 2
    @KimStacks На ваш вопрос был дан ответ. Путь к программному превращению страниц состоит в том, чтобы сообщить контроллеру просмотра страницы setViewControllers:direction:animated:completion:. Вам нужно прекратить спорить и начать слушать. У этого ничего есть кнопка, находящаяся внутри страницы внутри контроллера просмотра страницы. Вы все равно можете отправить сообщение. – matt 1 November 2015 в 04:22
  • 3
    Прошу прощения, что меня считают спором. Я искренне хочу узнать, как это сделать. Я почти уверен, что мне не хватает фундаментальных знаний, поэтому я не могу понять ваш ответ. Я добавил больше информации на мой вопрос. Спасибо, что постарался привести меня в «ага». – Kim Stacks 1 November 2015 в 05:10

Вы можете использовать эту функцию:

func movePageToIndex(pageIndex NSInteger)->() {
    var viewControllers = []
    var direction : UIPageViewControllerNavigationDirection! 
    if (pageIndex < currentIndex) {
        direction = UIPageViewControllerNavigationDirection.Reverse
    } else {
        direction = UIPageViewControllerNavigationDirection.Forward
    }
    viewControllers = @[[self.getItemController(pageIndex)]]

    WEAKSELF weakSelf = self;
    self.pageViewController.setViewControllers:viewControllers direction:direction animated:false completion:nil];
}
1
ответ дан Hardik Thakkar 16 August 2018 в 00:26
поделиться
  • 1
    Привет, я обновил вопрос. Я не мог использовать ваш ответ, потому что кнопки находятся внутри QuizPageItem. Мой обновленный вопрос прольет больше света. – Kim Stacks 1 November 2015 в 04:14

Swift 3.0

Очень простое решение здесь

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

В моем случае у меня есть UIPageViewController с именем «UserDetailsPVC» и он содержит 4 страницы (UIViewControllers), которые выглядят следующим образом

  PageOneVC:UIViewController
  PageTwoVC:UIViewController
  PageThreeVC:UIViewController
  PageFourVC:UIViewController

В UIPageViewController можно определить массив страниц

 var pages:[UIViewController] = [
        UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "PageOneVC"),
        UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "PageTwoVC"),
        UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "PageThreeVC"),
        UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "PageFourVC")
]

Теперь, чтобы изменить страницу UIPageViewController с любого из UIViewController

    // get parent view controller
    let parentVC = self.parent as! UserDetailsPVC

    // change page of PageViewController
    parentVC.setViewControllers([parentVC.pages[1]], direction: .forward, animated: true, completion: nil)
9
ответ дан Rajat Jain 16 August 2018 в 00:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: