У меня есть QuizViewController, который расширяет UIViewController, UIPageControllerDelegate
и UIPageViewControllerDataSource
.
Внутри QuizViewController.swift
private var pageViewController: UIPageViewController?
private func createPageViewController() {
let pageController = self.storyboard!.instantiateViewControllerWithIdentifier("QuizPageViewController") as! UIPageViewController
pageController.dataSource = self
if pageInfo.count > 0 {
let firstController = getItemController(0)!
let startingViewControllers: NSArray = [firstController]
pageController.setViewControllers(startingViewControllers as? [UIViewController], direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil)
}
pageViewController = pageController
addChildViewController(pageViewController!)
self.view.addSubview(pageViewController!.view)
pageViewController!.didMoveToParentViewController(self)
}
private func getItemController(itemIndex: Int) -> QuizPageItem? {
if itemIndex < pageInfo.count {
let CurrentQuizPageItem = self.storyboard!.instantiateViewControllerWithIdentifier("QuizPageItem") as! QuizPageItem
CurrentQuizPageItem.itemIndex = itemIndex
CurrentQuizPageItem.thisPageInfo = pageInfo[itemIndex]
return CurrentQuizPageItem
}
return nil
}
/*
PageView Delegates
*/
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
let CurrentQuizPageItem = viewController as! QuizPageItem
if CurrentQuizPageItem.itemIndex > 0 {
return getItemController(CurrentQuizPageItem.itemIndex - 1)
}
return nil
}
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
let CurrentQuizPageItem = viewController as! QuizPageItem
if CurrentQuizPageItem.itemIndex + 1 < pageInfo.count {
return getItemController(CurrentQuizPageItem.itemIndex + 1)
}
return nil
}
Мой вопрос: как заставить кнопки «Далее» и «Назад» работать правильно?
Сейчас страницы можно менять свайпом. Я не хочу использовать свайп. Я хочу управлять с помощью кнопок «Далее» и «Назад».
ОБНОВЛЕНИЕ
Это на Main.storyboard
PageViewController — средний в раскадровке.
PageViewController имеет идентификатор раскадровки как QuizPageViewController.
QuizViewController — левый в раскадровке.
QuizViewController создает экземпляр PageViewController, используя идентификатор раскадровки QuizPageViewController.
что делает этот блок
let pageController = self.storyboard!.instantiateViewControllerWithIdentifier("QuizPageViewController") as! UIPageViewController
pageController.dataSource = self
При создании этого экземпляра также создается главная страница для QuizPageItem.
QuizPageItem — самый правый вид в Main.storyboard.
Итак, если вы видите 2 макета, они оба являются QuizPageItems.
Первый макет должен иметь itemIndex равный 0.
Второй макет должен иметь itemIndex равный 1.
let CurrentQuizPageItem = self.storyboard!.instantiateViewControllerWithIdentifier("QuizPageItem") as! QuizPageItem
CurrentQuizPageItem.itemIndex = itemIndex
Большинство ответов, которые я получил, предлагают решить это с помощью QuizViewController, также известного как самое левое представление в моей Main.storyboard.
Однако кнопки находятся в QuizPageItem и недоступны через QuizViewController.
Я хочу знать, как подключить кнопки «Назад/Далее» в QuizPageItem для выполнения разбивки на страницы, которая управляется в QuizViewController, при условии, что способ подключения различных представлений в Main.storyboard правильный
В то же время я допускаю возможность того, что текущий способ подключения различных представлений в Main.storyboard не идеален.
Если да, то посоветуйте альтернативный способ.
Это руководство, которому я следую, чтобы добраться туда, где я сейчас нахожусь.
http://shrikar.com/ios-swift-tutorial-uipageviewcontroller-as-user-onboarding-tool/
ОБНОВЛЕНИЕ 2 Приношу извинения за то, что я спорю. Я искренне хочу научиться этому. Я почти уверен, что мне не хватает некоторых фундаментальных знаний, поэтому я не могу понять ответ Майкла Даутерманна.
Я предполагаю, что в QuizViewController есть функция, которая запускает перелистывание страниц.
Я не уверен, что это за функция.
Я знаю, что эти функции будут запускаться при нажатии кнопок.
У меня есть следующее внутри класса QuizPageItem
@IBAction func pageBackButton(sender: AnyObject) {
}
@IBAction func pageNextButton(sender: AnyObject) {
}
Однако они находятся не в классе QuizViewController, а в классе QuizPageItem.
Должен ли я поместить метод setViewController в эти две функции внутри класса QuizPageItem?
И если да, то как мне вообще получить доступ к экземпляру QuizViewController из класса QuizPageItem?
ОБНОВЛЕНИЕ 3:
Моя файловая структура
- QuizViewController.swift
- QuizPageItem.swift
QuizViewController контролирует, какой QuizPageItem вы видите. QuizPageItem представляет другое представление, разработанное макетом.
ОБНОВЛЕНИЕ 4:
Ответ Мэтта очень помог мне понять этого FirstResponder, с которым я был совершенно незнаком.
Когда я попытался реализовать это, я столкнулся с этой ошибкой.
Я гуглил и пытался исправить это безрезультатно.
Я продолжал вызывать эту ошибку.
Прилагается фрагмент кода для QuizViewPageItemController.swift
import UIKit
class QuizPageItemViewController: UIViewController, CheckboxDelegate {
@IBOutlet weak var pageHeadingLabel: UILabel!
@IBOutlet weak var pageInstructionLabel: UILabel!
@IBOutlet weak var pageProgressView: UIProgressView!
@IBOutlet weak var pageQuestionLabel: UILabel!
@IBOutlet weak var pageAnswerView: UIView!
@IBOutlet weak var pageBackButton: UIButton!
@IBOutlet weak var pageNextButton: UIButton!
let pageNo: Int
let maxPageNo: Int
let thisPageInfo: [String]
let interestsList = [
"Blue Chips", "Small Caps", "Pharmaceuticals", "Agriculture",
"Telecommunications", "Manufacturing", "Finance", "Banks",
"Retail", "Travel", "Airlines", "Tourism"]
init(pageNo: Int, maxPageNo: Int, thisPageInfo: [String]) {
self.pageNo = pageNo
self.maxPageNo = maxPageNo
self.thisPageInfo = thisPageInfo
super.init(nibName: nil, bundle: nil)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
self.pageBackButton.hidden = pageNo == 0
self.pageNextButton.hidden = pageNo == maxPageNo
pageHeadingLabel.text = thisPageInfo[0]
pageInstructionLabel.text = thisPageInfo[1]
pageQuestionLabel.text = thisPageInfo[2]
if thisPageInfo[0] == "Welcome" {
createCheckboxes()
pageProgressView.setProgress(0.33, animated: true)
} else if thisPageInfo[0] == "Awesome!" {
createSlider()
pageProgressView.setProgress(0.67, animated: true)
} else if thisPageInfo[0] == "Almost there..." {
createSlider()
pageProgressView.setProgress(0.95, animated: true)
}
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func createCheckboxes() {
let fWidth = (self.view.frame.width - 40) / 2
var frame = CGRectMake(0, 0, fWidth, 40)
var contentSize = CGRectMake(0, 0, self.view.frame.width - 40, 0)
for (var counter = 0; counter < interestsList.count; counter++) {
let checkbox = Checkbox(frame: frame, title: interestsList[counter], selected: false)
checkbox.mDelegate = self
checkbox.tag = counter
checkbox.backgroundColor = UIColor.redColor()
if counter % 2 == 0 {
frame.origin.x += fWidth
} else{
frame.origin.x -= fWidth
frame.origin.y += frame.size.height
contentSize.size.height += frame.size.height
}
checkbox.titleLabel?.adjustsFontSizeToFitWidth = true
pageAnswerView.addSubview(checkbox)
}
}
func didSelectCheckbox(state: Bool, identifier: Int, title: String) {
print("checkbox '\(title)' has state \(state)")
}
func createSlider() {
let slider = UISlider(frame:CGRectMake(0, 20, self.view.frame.width - 40, 20))
slider.minimumValue = 0
slider.maximumValue = 10
slider.continuous = true
slider.tintColor = ChatQColours().chatQBlue
slider.value = 5
// slider.addTarget(self, action: "sliderValueDidChange:", forControlEvents: .ValueChanged)
pageAnswerView.addSubview(slider)
let leftlabel = UILabel(frame: CGRectMake(0, 40, 0, 0))
leftlabel.text = "Strongly Avoid"
leftlabel.sizeToFit()
pageAnswerView.addSubview(leftlabel)
let rightlabel = UILabel(frame: CGRectMake(0, 40, 0, 0))
rightlabel.text = "Strongly Prefer"
rightlabel.sizeToFit()
rightlabel.frame.origin.x = slider.frame.width - rightlabel.frame.width
pageAnswerView.addSubview(rightlabel)
}
}