2016-05-24 55 views
0

我有一個基於頁面的應用程序,由每個ViewController中的collectionViews組成。然後,我有一個viewController從頁面視圖barButton脫離,導致添加頁面供用戶添加他們的數據。我試圖找到一種方法來確定什麼是源視圖控制器,以便我可以追加並重新加載正確的ViewController。下面是我的UIPageView和AddSubject類:從pageViewController獲取ParentViewController

AddSubject.swift:

import UIKit 
import ChameleonFramework 


class AddSubjectView: UIViewController { 

    // collectionView 
    @IBOutlet var colourPicker: UICollectionView! 

    var source = UIViewController() 

    // source of colours to use in the colour collectionView 
    private var data = collectionViewColors.createColor() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // gesture recognizer to determine when the user has tapped anywhere but the text field 

     let tap: UIGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(AddSubjectView.dismissKeyboard)) 
     view.addGestureRecognizer(tap) 


    } 

    @IBAction func addPressed(sender: AnyObject) { 




    } 

    func addData() { 




    } 

    // dismiss keyboard when the user taps away from the text field (called above with #selector) 
    func dismissKeyboard() { 

     view.endEditing(true) 
    } 

// mandatory methods to display collectionView data in the collectionView 
} 
extension AddSubjectView: UICollectionViewDataSource { 

    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { 
     return 1 
    } 

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 

     return data.count 
    } 

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 

     let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! colourCell 



     cell.data = self.data[indexPath.item] 


     return cell 
    } 



    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 

     let cell = collectionView.cellForItemAtIndexPath(indexPath) 

    } 



} 

PageViewController.swift:

import UIKit 
import ChameleonFramework 

class PageViewController: UIPageViewController,UIPageViewControllerDelegate { 

    // created for use in the function which determines the title of the navigationBar 
    var arrayIndex: Int = 0 
    // reference for later function to determine title of navigationBar 
    var pageControl = UIPageControl.self 

    // NSUserDefaults 
    let defaults = NSUserDefaults.standardUserDefaults() 

    // set of viewControllers (based on their storyboard ID) 

    private(set) lazy var orderedViewControllers: [UIViewController] = { 
     return [self.newDayViewController("monday"), 
       self.newDayViewController("tuesday"), 
       self.newDayViewController("wednesday"), 
       self.newDayViewController("thursday"), 
       self.newDayViewController("friday"), 
       self.newDayViewController("saturday"), 
       self.newDayViewController("sunday") 
     ] 
    }() 


    override func viewDidLoad() { 
     super.viewDidLoad() 


     self.setNeedsStatusBarAppearanceUpdate() 
     // setting the datasource & Delegate of the UIPageViewController 
     dataSource = self 
     delegate = self 




     // set the first viewController for the pageView (monday as it is the first in the set) 

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


     } 

    } 





    // function to add view controllers 
    // function will only instantiateViewControllers which have a storyboard id containing 'day' e.g Monday, Tuesday, Wednesday 

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




    // set the navigationBar title to the dayViewController's title 
    // if the user is looking at orderedViewControllers[1], then the title of that day is "Tuesday" 

    func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { 
     if (!completed) { 
      return 
     } 


     if let firstViewController = viewControllers?.first, 
      let arrayIndex = orderedViewControllers.indexOf(firstViewController) { 
      switch arrayIndex { 
      case 0: 
       self.navigationController!.navigationBar.topItem!.title = "Monday" 
       self.navigationItem.title = "Monday" 
       break 

      case 1: 
       self.navigationController!.navigationBar.topItem!.title = "Tuesday" 
       self.navigationItem.title = "Tuesday" 
       break 

      case 2: 
       self.navigationController!.navigationBar.topItem!.title = "Wednesday" 
       self.navigationItem.title = "Wednesday" 
       break 

      case 3: 
       self.navigationController!.navigationBar.topItem!.title = "Thursday" 
       break 
      case 4: 
       self.navigationController!.navigationBar.topItem!.title = "Friday" 
       break 

      case 5: 
       self.navigationController!.navigationBar.topItem!.title = "Saturday" 
       break 

      case 6: 
       self.navigationController!.navigationBar.topItem!.title = "Sunday" 
       break 

      default: 
       self.navigationController!.navigationBar.topItem!.title = "Timetable" 


      } 
     } 
    } 
} 
// Mandatory functions and setup for the pageViewController to work 

extension PageViewController: UIPageViewControllerDataSource { 


    func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { 
     guard let viewControllerIndex = orderedViewControllers.indexOf(viewController) else { 
      return nil 
     } 
     let previousIndex = viewControllerIndex - 1 
     guard previousIndex >= 0 else { 
      return orderedViewControllers.last 
     } 
     guard orderedViewControllers.count > previousIndex else { 
      return nil 
     } 
     return orderedViewControllers[previousIndex] 
    } 

    func pageViewController(pageViewController: UIPageViewController, 
          viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { 
     guard let viewControllerIndex = orderedViewControllers.indexOf(viewController) else { 
      return nil 
     } 
     let nextIndex = viewControllerIndex + 1 
     let orderedViewControllersCount = orderedViewControllers.count 


     guard orderedViewControllersCount != nextIndex else { 
      return orderedViewControllers.first 
     } 
     guard orderedViewControllersCount > nextIndex else { 
      return nil 
     } 
     return orderedViewControllers[nextIndex] 
    } 
    // set number of viewControllers to be presented 
    func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int { 
     return orderedViewControllers.count 
    } 
    func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int { 
     guard let firstViewController = viewControllers?.first, 
      firstViewControllerIndex = orderedViewControllers.indexOf(firstViewController) else { 
       return 0 
     } 
     return firstViewControllerIndex 
    } 
} 

我在想,如果有使用一個addSubject視圖,而不是有辦法爲所有單獨的viewController創建barButton項並將它們鏈接到它們各自的viewController。

任何幫助將不勝感激!

+0

我不知道,我明白你的問題。你只是想要一種方式來確定哪個視圖控制器是你的pageViewController中的當前視圖控制器? –

+0

種類,我試圖確定什麼viewcontroller /頁面視圖索引用戶當他們按下添加按鈕,所以我可以告訴在哪裏存儲新的數據。我希望我剛纔說的更清楚一點 –

回答

1

要在UIPageViewController中獲取當前屏幕上的UIViewController,可以實現UIPageViewControllerDelegate協議方法「didFinishAnimating」。我在我的一個應用程序中使用以下示例來實現此目的。

func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { 

    let currentVC = pageViewController 
     .viewControllers![pageViewController.viewControllers!.count - 1] 
} 

如果您需要的指數,它是最容易與它的索引屬性創建自己的UIViewController子類。然後在你的「viewControllerBeforeViewController」和「viewControllerAfterViewController」的方法,可以返回的ViewController

例如之前分配指標:

func pageViewController(pageViewController: UIPageViewController,  viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { 

    let currentDetailVC: RAFeedDetailViewController = viewController as! RAFeedDetailViewController 

    return vcAtIndex(currentDetailVC.index - 1) 
} 

func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { 

    let currentDetailVC: RAFeedDetailViewController = viewController as! RAFeedDetailViewController 

    return vcAtIndex(currentDetailVC.index + 1) 
} 

func vcAtIndex(index: Int) -> RAFeedDetailViewController? { 

    guard index < self.dataSourceItems.count - 1 && index >= 0 else { return nil } 


    /* insert logic here to get the correct view controller */ 
    let detailVC: RAArticleDetailViewController = self.storyboard?.instantiateViewControllerWithIdentifier(String(RAArticleDetailViewController.self)) as! RAArticleDetailViewController 

    detailVC.index = index 

    return vc 
} 
+0

謝謝!我會給出一個去 –

+0

沒問題。我只是添加了一些更改,使其更具通用性,因爲我只是將它從我的項目中拉出來了。如果您有任何問題,請告訴我! –

+0

對不起,延遲響應,真棒,謝謝! –

相關問題