我嘗試在問答游戲中實作的功能如下所示:
這是SettingsViewController其中包含應用程式的設定,用戶可以在其中選擇difficulity游戲和sequence游戲使用的問題UISegmentedControl。
SettingsViewController包含這些用于實作此功能的方法:
@IBAction func didChooseDifficulty(_ sender: UISegmentedControl) {
difficulityDelegate?.didChooseDifficulity(
difficulity: selectedDifficulty)
UserDefaults.standard.set(
sender.selectedSegmentIndex,
forKey: "chosenDifficulity")
}
private var selectedDifficulty: Difficulty {
switch self.difficultyControl.selectedSegmentIndex {
case 0: return .easy
case 1: return .hard
case 2: return .insane
default: return .hard
}
}
@IBAction func didChooseSequence(_ sender: UISegmentedControl) {
sequenceDelegate?.didChooseSequence(
sequence: selectedSequence)
UserDefaults.standard.set(
sender.selectedSegmentIndex,
forKey: "chosenSequence")
}
private var selectedSequence: Sequence {
switch self.sequenceControl.selectedSegmentIndex {
case 0: return .sequentally
case 1: return .shuffled
default: return .sequentally
}
}
override func viewDidLoad() {
super.viewDidLoad()
setupQuestionsSequence()
setupDifficulty()
}
func setupQuestionsSequence() {
if let sequence = UserDefaults.standard.value(
forKey: "chosenSequence") {
let selectedIndex = sequence as! Int
sequenceControl.selectedSegmentIndex = selectedIndex
}
}
func setupDifficulty() {
if let difficulity = UserDefaults.standard.value(
forKey: "chosenDifficulity") {
let selectedIndex = difficulity as! Int
difficultyControl.selectedSegmentIndex = selectedIndex
}
}
我在這里使用DifficulityDelegateandChooseQuestionsSequenceDelegate協議:
protocol DifficulityDelegate: AnyObject {
func didChooseDifficulity(
difficulity: Difficulty)
}
protocol ChooseQuestionsSequenceDelegate: AnyObject {
func didChooseSequence(
sequence: Sequence)
}
這里也是GameDelegate協議,我使用的游戲的主要協議:
protocol GameDelegate: AnyObject {
func didEndGame(
difficulty: Difficulty,
withScore score: Int,
name: String,
removeTwoUsed: Bool,
callFriendUsed: Bool,
audienceHelpUsed: Bool)
}
這是GameSession用于游戲主要邏輯的類:
class GameSession {
var questionNumber: Int = 0
var callFriendUsed = false
var audienceHelpUsed = false
var removeTwoUsed = false
var difficulty: Difficulty = .hard
var sequence: Sequence = .sequentally
}
這是Question有問題的結構:
struct Question: Codable {
let question: String
let answers: [String]
let rightAnswer: Int
let difficulty: Difficulty
}
這是GameViewController游戲本身發生的主控制器。我需要了解為什么當我改變UISegmentedControl狀態時什么都沒有發生。游戲沒有任何變化,difficulty問題sequence的出現。
這是來自的一些代碼GameViewController:
weak var delegate: GameDelegate?
weak var sequenceDelegate: ChooseQuestionsSequenceDelegate?
weak var difficulityDelegate: DifficulityDelegate?
private var questions = [Question]()
var gameSession = GameSession()
var score = 0
var questionNumber = Observable<Int>(0)
var difficulty: Difficulty = .hard {
didSet {
gameSession.difficulty = difficulty
}
}
var sequence: Sequence = .sequentally {
didSet {
gameSession.sequence = sequence
}
}
private var chooseDifficultyStrategy: DiffilultyStrategy {
switch difficulty {
case .easy: return EasyModeStrategy()
case .hard: return HardModeStrategy()
case .insane: return InsaneModeStrategy()
}
}
private var setupSelectedSequence: SequenceStrategy {
switch sequence {
case .sequentally: return SequentiallyStrategy()
case .shuffled: return ShuffledStrategy()
}
}
func initialSetup() {
delegate = Game.instance
Game.instance.gameSession = gameSession
questions = chooseDifficultyStrategy.setupGame(
lifelineButtons: lifelineButtonsCollection)
questions = setupSelectedSequence.setupGame()
}
這可能很愚蠢,如果有人能幫助我理解我做錯了什么,我會很高興。謝謝!
uj5u.com熱心網友回復:
籠統地說,我想說協議和委托機制不是這里想要的。與用戶偏好互動的視圖控制器 GameViewController 和 SettingsViewController 不一定同時存在,因此它們無法相互通信。
更可能需要一些中央存盤庫,SettingsViewController 可以在其中寫下用戶的愿望,而 GameViewController 可以讀取它們。保存此類首選項的常見位置是 UserDefaults;它的優點是它會隨著時間的推移持續存在,即使在應用程式啟動之間也是如此,并且它是全球可用的(這意味著任何地方的任何代碼都可以與之互動)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/480106.html
下一篇:我無法訪問結構陣列上的欄位
