Ios 保存Pokedex的状态
我的目标是编写一段代码,如果我停止运行应用程序,然后再次运行,Pokédex将通过将状态保存到磁盘来记住哪些Pokémon被捕获,哪些没有被捕获。我写了一些代码,但在代码的“if UserDefaults.standard.bool(forKey:self.pokemon.name){”行中,我得到了一个错误“thread1:Fatal error:在隐式展开可选值时意外发现nil”。 这是我的密码 口袋妖怪控制器Ios 保存Pokedex的状态,ios,swift,Ios,Swift,我的目标是编写一段代码,如果我停止运行应用程序,然后再次运行,Pokédex将通过将状态保存到磁盘来记住哪些Pokémon被捕获,哪些没有被捕获。我写了一些代码,但在代码的“if UserDefaults.standard.bool(forKey:self.pokemon.name){”行中,我得到了一个错误“thread1:Fatal error:在隐式展开可选值时意外发现nil”。 这是我的密码 口袋妖怪控制器 import UIKit class PokemonViewControlle
import UIKit
class PokemonViewController: UIViewController {
var url: String!
var caught = false
var pokemon: PokemonListResult!
@IBOutlet var nameLabel: UILabel!
@IBOutlet var numberLabel: UILabel!
@IBOutlet var type1Label: UILabel!
@IBOutlet var type2Label: UILabel!
@IBOutlet var catchButton: UIButton!
func capitalize(text: String) -> String {
return text.prefix(1).uppercased() + text.dropFirst()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
nameLabel.text = ""
numberLabel.text = ""
type1Label.text = ""
type2Label.text = ""
loadPokemon()
}
func loadPokemon() {
URLSession.shared.dataTask(with: URL(string: url)!) { (data, response, error) in
guard let data = data else {
return
}
do {
let result = try JSONDecoder().decode(PokemonResult.self, from: data)
DispatchQueue.main.async {
self.navigationItem.title = self.capitalize(text: result.name)
self.nameLabel.text = self.capitalize(text: result.name)
self.numberLabel.text = String(format: "#%03d", result.id)
if UserDefaults.standard.bool(forKey: self.pokemon.name) {
self.caught = true
self.catchButton.setTitle("Release", for: [])
} else {
self.caught = false
self.catchButton.setTitle("Catch", for: [])
}
for typeEntry in result.types {
if typeEntry.slot == 1 {
self.type1Label.text = typeEntry.type.name
}
else if typeEntry.slot == 2 {
self.type2Label.text = typeEntry.type.name
}
}
}
}
catch let error {
print(error)
}
}.resume()
}
@IBAction func toggleCatch() {
caught = !caught
UserDefaults.standard.set(caught, forKey: pokemon.name)
if UserDefaults.standard.bool(forKey: pokemon.name) {
catchButton.setTitle("Release", for: [])
} else {
catchButton.setTitle("Catch", for: [])
}
}
}
口袋妖怪
import Foundation
struct PokemonListResults: Codable {
let results: [PokemonListResult]
}
struct PokemonListResult: Codable {
let name: String
let url: String
}
struct PokemonResult: Codable {
let id: Int
let name: String
let types: [PokemonTypeEntry]
}
struct PokemonTypeEntry: Codable {
let slot: Int
let type: PokemonType
}
struct PokemonType: Codable {
let name: String
}
实例变量
pokemon
是隐式展开的可选变量
这一行:
var pokemon: PokemonListResult!
如果您在存储值之前尝试引用变量pokemon,您将得到您描述的崩溃。您的代码正在尝试从pokemon读取值,但该值为零。(self.pokemon.name
)。不要这样做
(您发布的代码从不将值放入
pokemon
实例变量。)请帮助我修改代码,以便达到我的目标。这是你的应用程序。你知道它应该如何工作。实例变量pokemon
应该如何设置?当用户选择一个pokemon时,它应该设置该变量吗?