草庐IT

ios - 从 JSON 加载信息

coder 2024-01-28 原文

我的 JSON 文件中有 3 行(问题)。当应用程序启动时,我想从 JSON 加载信息。在 title 中,我想从 question.number 中加载信息,在 textLabel.text 中,我想从 question.text<>,在 showAnswerLabel.text 中,我想从 question.answer 加载信息。当我在 textField 中写入 question.answer 的正确答案并按下键盘上的完成按钮时,我想看到 print("right")在控制台和我的设备中,我想查看下一个问题。但我有一个问题。当应用程序启动时,我从 JSON 加载第一行 ({"number": "1", "text": "1", "answer": "1"},)。在我的 showAnswerLabel.text answer = 1 中。但是当我在 textField 中写入 1 并按下完成按钮时,我在控制台中没有得到 print("right") 。但是如果我从第二行写 answer = 2 ({"number": "2", "text": "2", "answer": "2"},) 从 textField 中的 JSON 并按完成按钮我在控制台中得到 print("right")。但正确答案应该是 showAnswerLabel.text 中的数字,即 1。如何解决?

我的新代码:

{
    "questions" : [{"number": "1", "text": "1", "answer": "1"},
                   {"number": "2", "text": "2", "answer": "2"},
                   {"number": "3", "text": "3", "answer": "3"}]
}

struct Root : Decodable {
    let questions : [Question]
}

struct Question : Decodable {
    let number, text, answer : String
}

class ViewController: UIViewController, UITextFieldDelegate {

var counter = 0
var questions = [Question]()
@IBOutlet var textLabel: UILabel!
@IBOutlet var showAnswerLabel: UILabel!
@IBOutlet weak var textField: UITextField!

override func viewDidLoad() {
        super.viewDidLoad()

        let url = Bundle.main.url(forResource: "0", withExtension: "json")!
        let data = try! Data(contentsOf: url)
        let result = try! JSONDecoder().decode(Root.self, from: data)
        self.questions = result.questions

        textField.delegate = self
        textField.returnKeyType = .done
        _ = textFieldShouldReturn(textField)

    }

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()

        let question = questions[counter]
        title = question.number
        textLabel.text = question.text
        showAnswerLabel.text = question.answer
        counter = (counter + 1) % questions.count

        if textField.text == question.answer {
            print("right")

        }

        return true
    }

最佳答案

textFieldShouldReturn 中提取 UI 更新并绑定(bind)到 counter 的更改的可能修复:

class ViewController: UIViewController, UITextFieldDelegate 
{
    var questions = [Question]()
    @IBOutlet var textLabel: UILabel!
    @IBOutlet var showAnswerLabel: UILabel!
    @IBOutlet weak var textField: UITextField!

    var counter: Int = -1 {
       didSet {
           guard counter >= 0, counter < questions.count else { fatalError() }       
           let question = questions[counter] 
           updateUI(with: question)
       }
    }

    override func viewDidLoad() 
    {
        super.viewDidLoad()

        let url = Bundle.main.url(forResource: "0", withExtension: "json")!
        let data = try! Data(contentsOf: url)
        let result = try! JSONDecoder().decode(Root.self, from: data)
        self.questions = result.questions
        textField.delegate = self
        textField.returnKeyType = .done

        counter = 0 // will trigger `updateUI(with: questions[0])`
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()

        let question = questions[counter]        
        if textField.text == question.answer {
            print("right")
            // increment counter only answer is right
            // will trigger an UI update
            counter = (counter + 1) % questions.count 
        }

        return true
    }

    func updateUI(with question: Question) {
        title = question.number
        textLabel.text = question.text
        showAnswerLabel.text = question.answer
    }
}

我不会完全按照这个来做,但你明白了。

关于ios - 从 JSON 加载信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48183879/

有关ios - 从 JSON 加载信息的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  4. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  5. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  6. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  7. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  8. ruby-on-rails - 使用 config.threadsafe 时从 lib/加载模块/类的正确方法是什么!选项? - 2

    我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co

  9. ruby-on-rails - 如何使用 Rack 接收 JSON 对象 - 2

    我有一个非常简单的RubyRack服务器,例如:app=Proc.newdo|env|req=Rack::Request.new(env).paramspreq.inspect[200,{'Content-Type'=>'text/plain'},['Somebody']]endRack::Handler::Thin.run(app,:Port=>4001,:threaded=>true)每当我使用JSON对象向服务器发送POSTHTTP请求时:{"session":{"accountId":String,"callId":String,"from":Object,"headers":

  10. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

随机推荐