2016-11-04 8 views
2

Я пытался понять это в течение нескольких часов, и я должен быть недоразумением, как работает UIPageViewController.Как изменить UIPageViewController из ININ одного из UIViewControllers, который является частью UIPageViewController?

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

НО! Я хочу иметь возможность программно отображать следующий контроллер представления в строке после того, как они увольняют предупреждение на одном из этих контроллеров представлений.

И до сих пор, единственное решение, которое я нашел, что приближается, это решение здесь (https://github.com/jeffaburt/UIPageViewController-Post), что позволяет кнопку «Далее», но кнопка не на контроллере представления, который показывает, он находится на контроллере корневого представления, который содержит UIPageViewController.

У меня есть UIPageViewController, настроенный для отображения 5 различных контроллеров вида, с помощью этого кода.

private(set) lazy var orderedViewControllers: [UIViewController] = { 
    return [self.newColoredViewController("setup1"), 
      self.newColoredViewController("setup2"), 
      self.newColoredViewController("setup3"), 
      self.newColoredViewController("setup4"), 
      self.newColoredViewController("setup5")] 
}() 

Тогда функция newColoredViewController делает это:

private func newColoredViewController(color: String) -> UIViewController { 
    return UIStoryboard(name: "Main", bundle: nil) . 
     instantiateViewControllerWithIdentifier("\(color)") 
} 

и вот мой viewDidLoad:

override func viewDidLoad() { 
    super.viewDidLoad() 

    dataSource = self 



    if let SetupViewController = orderedViewControllers.first { 
     setViewControllers([SetupViewController], 
          direction: .Forward, 
          animated: true, 
          completion: nil) 
    } 


} 

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

Я пытался сделать это, но она ничего не делает:

setViewControllers([orderedViewControllers[3]], 
          direction: .Forward, 
          animated: true, 
          completion: nil) 

Я пытался сделать это, но она ничего не делает:

func scrollToNextViewController() { 
    if let visibleViewController = viewControllers?.first, 
     let nextViewController = pageViewController(self, 
                viewControllerAfterViewController: visibleViewController) { 
     scrollToViewController(nextViewController) 
    } 
} 

Пожалуйста, укажите мне в правильном направлении! Я могу исследовать весь день и, как правило, могу понять это из-за предыдущих вопросов stackoverflow, на которые уже ответил, но здесь я в тупике.

Спасибо заранее!

ответ

0

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

Там вы переходите к ссылке на контроллер отображения. Что-то вроде newSetupViewConroller.setNextDelegate(self).

Определить протокол NextDelegate, который имеет метод performNext

Это должно быть тип параметра (и соотнесения переменная экземпляра) из setNextDelegate. (В качестве альтернативы методы сеттера вы можете, конечно, объявить некоторое свойство типа NextDelegate)

Вашего Предъявления-контроллер должен соответствовать этому протоколу и реализовать метод performNext.

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

В рамках метода performNext вы находитесь в своем контроллере представления и имеете доступ к pageViewController и идите оттуда.

(Есть более простые способы сделать это, но я думаю, что это правильный один. Это то, что протоколы сделаны для.)

+0

Ack! Я едва понимаю, как реализовать то, что вы только что объяснили. Итак, я должен изменить функцию 'private func newColoredViewController (color: String) -> UIViewController { return UIStoryboard (имя:« Main », bundle: nil). instantiateViewControllerWithIdentifier ("\ (color)") } ' и попытаться передать переменную? Когда вы говорите «переходите к ссылке на контроллер представления, как это сделать? –

+0

Вы сказали, что есть более простые способы сделать это - не могли бы вы пролить свет на них? Я все для правильных способов сделать но, честно говоря, я не думаю, что смогу реализовать то, что вы объяснили, потому что я еще не такой уровень кодера !! –

+0

Да, не возвращайте экземпляр напрямую, а удерживайте его в некоторой локальной переменной на мгновение и пройдите контроллер представления представления. Но мой совет - не объявлять параметр как объект класса контроллера представления, а использовать протокол между ними. Сочетание классов в обоих направлениях отлично работает, но на самом деле не очень хороший стиль. –

2

я понял, более простой способ сделать это в структуре Я уже настроен. В UIPageViewController, добавили эту функцию:

func nextPageWithIndex(index: Int) 
{ 
    // let nextWalkthroughVC = newColoredViewController("setup4") 
    let nextWalkthroughVC = orderedViewControllers[index] 
     setViewControllers([nextWalkthroughVC], direction: .Forward, animated: true, completion: nil) 

} 

, а затем в одном из настроек View Controllers я создал кнопку действия, выбежала этот код:

@IBAction func yeaaa(sender: AnyObject) { 
       let parent = self.parentViewController as! SetupViewController 

    parent.nextPageWithIndex(3) 
} 

(где «SetupViewController» является UIPageViewController)

YEEHAWWWW, который приводил меня в норму.

Вот видео, которое дал мне идею "self.parentViewController как SetupViewController!" И "nextPageWithIndex" код: https://www.youtube.com/watch?v=K3CSBxX5VXA

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

  • Нет связанных вопросов^_^