2016-07-12 4 views
0

У меня есть 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 равен нулю. Я попробовал кучу обходных решений, но все напрасно. У меня возникает ощущение, что может быть лучший способ сделать это. Любые предложения или идеи приветствуются!

+0

I не видите, где вы устанавливаете переменную tutorialOne в качестве первого контроллера представления. Вы можете показать 'viewControllerAtIndex'? – Paulw11

+0

Я сделал редактирование. Вы можете увидеть 'viewControllerAtIndex' в фрагменте кода rootViewController – Jobs

+0

Итак, в этом методе вы создаете новый контроллер представления, но никогда не устанавливаете делегат. Таким образом, у вас есть экземпляр диспетчера представлений 'tutorialOne', где вы устанавливаете делегат, но вы никогда не показываете этот экземпляр, тогда у вас будут другие экземпляры контроллера просмотра, возвращаемые' viewControllerAtIndex', где вы никогда не устанавливали делегат – Paulw11

ответ

2

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

func viewControllerAtIndex(index: Int) -> UIViewController? { 

    let vc = storyboard?.instantiateViewControllerWithIdentifier(pages[index]) 
    if index == 0 { 
      let userInputViewController =vc as! userInputViewController 
      userInputViewController.delegate = self 
    } 
    return vc 
} 

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

+0

Конечно, я буду помнить об этом. Большое спасибо за совет. Протокол работает сейчас. – Jobs

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