У меня есть rootViewController, который является в основном моим pageViewController, который реализует все функции протокола контроллера страниц. Я уже успешно реализовал весь pageViewController с помощью pageControl, который правильно показывает текущий номер страницы.Перейти к следующей странице программно в UIPageViewController
На первой странице, содержащейся в корневом контролере, у меня есть viewController, в котором есть несколько текстовых полей, которые должны быть заполнены с помощью pickerView. Я также создал inputAccessory toolBar, который сопровождает сборщиков. Когда все поля заполнены текстом, barButton на toolBar переключится на Done. При нажатии этой кнопки «Готово» в этом диспетчере view я хочу, чтобы rootViewController перешел на следующую страницу.
Сначала я попробовал прямо представить viewController, к которому я хотел обратиться, но заметил, что страница не была представлена как часть pageViewController (кажется довольно очевидным, почему она не работает сейчас!). Поэтому я попытался реализовать протокол, который заставит rootViewController перейти на следующую страницу. Я реализовал все отлично, но делегат не устанавливается. Кажется, я не понимаю, почему это не задано. Может ли это быть из-за того, что я, возможно, пропустил в потоке среды UIPageViewController? Я в тупике.
В конечном итоге в протоколе я пытаюсь установить связь между содержащимся ViewController и rootViewController.
Вот мой исходный код:
В rootController:
import UIKit
class rootPageViewController: UIViewController, UIPageViewControllerDataSource,
UIPageViewControllerDelegate, tutorialPageTurnerDelegate {
var tutorialOne = userInputViewController()
@IBOutlet var pageLight: UIPageControl!
var turn: UIPageViewController!
let pages = ["userInput","tutorialOne","tutorialTwo","connectScreen"]
var i: Int!
override func viewDidLoad() {
super.viewDidLoad()
if let take = storyboard?.instantiateViewControllerWithIdentifier("pageView") {
self.addChildViewController(take)
self.view.addSubview(take.view)
take.view.addSubview(pageLight)
take.view.bringSubviewToFront(pageLight)
turn = take as! UIPageViewController
turn.dataSource = self
turn.delegate = self
// the delegate for the protocol I've implemented
tutorialOne.delegate = self
turn.setViewControllers([viewControllerAtIndex(0)!], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: nil)
turn.didMoveToParentViewController(self)
}
}
.
.
... pageviewcontroller protocol functions and misc code ...
.
.
// Helper Function to return Index
func viewControllerAtIndex(index: Int) -> UIViewController? {
let vc = storyboard?.instantiateViewControllerWithIdentifier(pages[index])
// _________EDIT_________
if index == 0 {
var tutorialOne: userInputViewController = userInputViewController()
tutorialOne.delegate = self
}
return vc
}
// function required by the protocol
func saveActionCompleted() {
print("Yes it does come here")
turn.setViewControllers([viewControllerAtIndex(1)!], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: nil)
turn.didMoveToParentViewController(self)
}
...
Теперь вот ViewController, где я создал протокол:
import UIKit
import CoreData
protocol tutorialPageTurnerDelegate {
func saveActionCompleted()
}
class userInputViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate,
UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
var delegate: tutorialPageTurnerDelegate?
override func viewDidLoad() {
super.viewDidLoad()
//Create toolbar
let toolBar = UIToolbar()
toolBar.barStyle = UIBarStyle.Default
toolBar.translucent = true
toolBar.tintColor = UIColor(red: 81/255, green: 45/255, blue: 168/255, alpha: 1)
toolBar.sizeToFit()
let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Plain, target: self, action: "donePicker")
let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil)
toolBar.setItems([spaceButton, nextButton], animated: false)
toolBar.userInteractionEnabled = true
....... more misc code ...
}
// The selector function for the toolbar from where I want to notify the root controller
func donePicker(){
self.view.endEditing(true)
saveDataAction(self)
if delegate != nil {
delegate!.saveActionCompleted()
} else {
print("PageTurnerDelegate is nil")
}
}
...
} //End
Я получаю PageTurnerDelegate равен нулю. Я попробовал кучу обходных решений, но все напрасно. У меня возникает ощущение, что может быть лучший способ сделать это. Любые предложения или идеи приветствуются!
I не видите, где вы устанавливаете переменную tutorialOne в качестве первого контроллера представления. Вы можете показать 'viewControllerAtIndex'? – Paulw11
Я сделал редактирование. Вы можете увидеть 'viewControllerAtIndex' в фрагменте кода rootViewController – Jobs
Итак, в этом методе вы создаете новый контроллер представления, но никогда не устанавливаете делегат. Таким образом, у вас есть экземпляр диспетчера представлений 'tutorialOne', где вы устанавливаете делегат, но вы никогда не показываете этот экземпляр, тогда у вас будут другие экземпляры контроллера просмотра, возвращаемые' viewControllerAtIndex', где вы никогда не устанавливали делегат – Paulw11