2017-01-31 5 views
1

Моя проблема заключается в следующем: я использую pageViewControllers для создания страницы учебника/onboarding для приложения, которое я создаю. Левый салфетки на последней (третьей) странице моего учебника должен выполнить сеанс.выполнить segue из pageViewController

Это то, что у меня есть на данный момент, но оно дает мне ошибку кодирования с ключевым значением. У меня двойная, тройная проверка моих выходов, и swipeView очень правильно подключен.

class GrowController: UIViewController { 

@IBOutlet weak var swipeView: UIView! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    view.addSubview(swipeView) 
    createGesture() 

} 

func createGesture() { 
    let showReg = UISwipeGestureRecognizer(target: self, action: #selector(showRegister)) 
    showReg.direction = .left 
    self.swipeView.addGestureRecognizer(showReg) 
} 

func showRegister(gesture: UISwipeGestureRecognizer) { 
    performSegue(withIdentifier: "showRegister", sender: self) 
    } 
} 

То есть контроллер для фактического UIViewController (конкретной страницы, что отображается)

Теперь иву также пытался возиться с какой-то логикой в ​​моих TutorialViewController, которая является UIPageViewController управления пойлом формирует страницу страница и т.д.

Logic, что здесь

class TutorialViewController: UIPageViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource { 

var viewControllerIndex: Int? 

//Array of my pages to load (GrowController is page3) 
lazy var tutorialArray: [UIViewController] = { 
    return [self.tutorialInstance(name: "page1"), self.tutorialInstance(name: "page2"), self.tutorialInstance(name: "page3")] 
}() 

private func tutorialInstance(name: String?) -> UIViewController { 
    return UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: name!) 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.dataSource = self 
    self.delegate = self 

    if let firstViewController = tutorialArray.first { 
     setViewControllers([firstViewController], direction: .forward, animated: false, completion: nil) 
    } 
} 

// Scroll view 
override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 
    for view in self.view.subviews { 
     if view is UIScrollView { 
      view.frame = UIScreen.main.bounds 
     } 
     else if view is UIPageControl { 
      view.backgroundColor = UIColor.clear 
     } 
    } 
} 


// Page View Controller delegate functions 
public func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { 
    guard let viewControllerIndex = tutorialArray.index(of: viewController) else { 
     return nil 
    } 

    let previousIndex = viewControllerIndex - 1 

    guard previousIndex >= 0 else { 
      return nil 
    } 

    guard tutorialArray.count > previousIndex else { 
// Added this line just testing around, nothing happened here though. 
     performSegue(withIdentifier: "ShowRegister", sender: self) 
     return nil 
    } 

    return tutorialArray[previousIndex] 
} 


public func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { 
    guard let viewControllerIndex = tutorialArray.index(of: viewController) else { 
     return nil 
    } 

    let nextIndex = viewControllerIndex + 1 

    guard nextIndex < tutorialArray.count else { 
     return nil 
    } 

    guard tutorialArray.count > nextIndex else { 
     return nil 
    } 

    return tutorialArray[nextIndex] 
} 

public func presentationCount(for pageViewController: UIPageViewController) -> Int { 
    return tutorialArray.count 
} 

public func presentationIndex(for pageViewController: UIPageViewController) -> Int { 
    guard let firstViewController = viewControllers?.first, let firstViewControllerIndex = tutorialArray.index(of: firstViewController) else { 
     return 0 
    } 
    return firstViewControllerIndex 
    } 


} 

ли это иметь someth связанный с методом делегатов willTransitionTopageView? Я не знаю, как это реализовать, я пробовал.

Я думал, что могу просто добавить subView в контроллер Grow, поместить в него жест жестов и выполнить segue всякий раз, когда пользователь удаляется с этой страницы. На данный момент этот код вызывает сбой при загрузке страницы 3 (GrowController)

Любая помощь ВЕЛИКОЕ оценили, я пытался понять это уже более недели, и это второй вопрос по теме i ' я поставил. Благодаря!

enter image description here

+0

Позвольте мне просто проверить, что я понимаю, что вы хотите делать. Вы хотите, чтобы пользователь имел возможность прокручивать салфетки, чтобы пройти через три страницы контроллера просмотра страницы, а затем, если пользователь снова замахнется, мы отходим прямо отсюда? Это верно? – matt

+0

Точно! за исключением того, что он начинается на первой странице, а его просто салфетки, а затем третий салфетка со страницы 3 выйдет! но да, это точная концепция – Dan

+0

Правильно ли привязаны segues от GrowController до следующего контроллера? (через раскадровку или программно). Кроме того, вы можете публиковать фактические журналы ошибок, которые вы получаете. –

ответ

0

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

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