UIViewController、、およびを拡張するQuizViewControllerがあります。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 のストーリーボード ID はQuizPageViewControllerです。
QuizViewController は、ストーリーボードの左側のものです。
QuizViewController は、ストーリーボード ID QuizPageViewControllerを使用して PageViewController をインスタンス化します
これはこのブロックによって行われます
let pageController = self.storyboard!.instantiateViewControllerWithIdentifier("QuizPageViewController") as! UIPageViewController
pageController.dataSource = self
このインスタンス化が発生すると、QuizPageItem のフロント ページも作成されます。
QuizPageItem は Main.storyboard の右端のビューです。
したがって、2 つのモックアップが表示されている場合、それらは両方とも QuizPageItems です。
最初のモックアップの itemIndex は 0 にする必要があります。
2 番目のモックアップの itemIndex は 1 にする必要があります。
let CurrentQuizPageItem = self.storyboard!.instantiateViewControllerWithIdentifier("QuizPageItem") as! QuizPageItem
CurrentQuizPageItem.itemIndex = itemIndex
私が受け取った回答のほとんどは、QuizViewController別名 Main.storyboard の一番左のビューを介して解決することを提案しています。
ただし、ボタンは QuizPageItem にあり、QuizViewController 経由ではアクセスできません。
Main.storyboardのさまざまなビューを配線する方法が正しいと仮定して、QuizViewController で制御されるページネーションを実行するために QuizPageItem の戻る/次のボタンを接続する方法を知りたい
同時に、Main.storyboard のさまざまなビューを接続している現在の方法が理想的ではない可能性も許容します。
もしそうなら、別の方法を教えてください。
これは、私が現在いる場所に到達するために従うチュートリアルです。
http://shrikar.com/ios-swift-tutorial-uipageviewcontroller-as-user-onboarding-tool/
更新 2 議論しているように見えたことをお詫びします。私は本当にこれを行う方法を学びたいです。基本的な知識が不足していると確信しているため、Michael Dautermannの答えを理解できません。
QuizViewController には、ページめくりをトリガーする関数があると思います。
その機能が何であるかはわかりません。
これらは、ボタンが押されたときにトリガーされることがわかっている機能です。
QuizPageItem クラス内に次のものがあります
@IBAction func pageBackButton(sender: AnyObject) {
}
@IBAction func pageNextButton(sender: AnyObject) {
}
ただし、それらは QuizViewController クラスではなく、QuizPageItem クラスにあります。
QuizPageItem クラス内のこれら 2 つの関数に setViewController メソッドを配置することになっていますか?
その場合、QuizPageItem クラス内から QuizViewController インスタンスにアクセスするにはどうすればよいでしょうか?
更新 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)
}
}