我有一個基於頁面的應用程序,由每個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。
任何幫助將不勝感激!
我不知道,我明白你的問題。你只是想要一種方式來確定哪個視圖控制器是你的pageViewController中的當前視圖控制器? –
種類,我試圖確定什麼viewcontroller /頁面視圖索引用戶當他們按下添加按鈕,所以我可以告訴在哪裏存儲新的數據。我希望我剛纔說的更清楚一點 –