Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 保存Pokedex的状态_Ios_Swift - Fatal编程技术网

Ios 保存Pokedex的状态

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

我的目标是编写一段代码,如果我停止运行应用程序,然后再次运行,Pokédex将通过将状态保存到磁盘来记住哪些Pokémon被捕获,哪些没有被捕获。我写了一些代码,但在代码的“if UserDefaults.standard.bool(forKey:self.pokemon.name){”行中,我得到了一个错误“thread1:Fatal error:在隐式展开可选值时意外发现nil”。 这是我的密码

口袋妖怪控制器

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时,它应该设置该变量吗?