【问题标题】:UIPickerView Not Reloading with the Latest JSON DataUIPickerView 未使用最新的 JSON 数据重新加载
【发布时间】:2020-12-14 13:19:24
【问题描述】:

基本上我希望下面的 UIPickerView 显示来自 URL 的 JSON 提供的最新选项 - 似乎重新安装应用程序会获取最新数据,但之后它是相同的。有没有我没有做的事情来正确重新加载数据?

以下是我目前的代码:

struct Model : Decodable {
    let model : String
}

viewDidLoad

let url = URL(string: "https://www.test.com/test/test")!
let dataTask = URLSession.shared.dataTask(with: url) { data, _, error in
    if let error = error { print(error); return }
    do { 
        let result = try JSONDecoder().decode([Model].self, from: data!)
        self.models = result.map{$0.model}
        DispatchQueue.main.async {
          self.pickerview.reloadAllComponents()
        }
    } catch { print(error) }
}
dataTask.resume()

使用的选取器数据源方法:

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return models.count
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return models[row]
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    TextField.text = models[row]
}

我认为在 Viewdidload 中执行此操作会解决此问题,但如果在 URL 中更新 JSON,UIPickerView 列表仍会显示旧的选项列表。

DispatchQueue.main.async {
              self.pickerview.reloadAllComponents()
            }

【问题讨论】:

    标签: swift uipickerview


    【解决方案1】:

    这实际上取决于如何使用此视图。例如,如果此视图是您应用的主视图,则 viewDidLoad 将在该视图首次构建后显示,然后可能再也不会显示。

    如果这个视图是一个被重新创建的子视图(一个新的对象被初始化),那么viewDidLoad将被再次调用。

    如果您处于第一种情况,请尝试viewWillAppear 看看是否能满足您的需求。如果子视图覆盖了整个视图,它将在您从子视图返回时调用。如果您正在执行更复杂的操作,则必须使用其他触发器(计时器?或者可能是来自子视图的委托)来重新加载数据。

    如果这不是问题 - 检查以确保您的代码实际被调用并且您从 URL 获取更新的 JSON。如果代码被调用,并且你得到了旧的 JSON,它可能会被缓存。

    【讨论】:

    • 我已经尝试将代码添加到 viewWillAppear 中,结果相同。我知道 JSON 数据正在使用更多数据进行更新,但除非重新安装应用程序,否则它不会出现在 PickerView 中。这让我觉得它正在被缓存 - 是否可以清除缓存?
    • let result = try JSONDecoder().decode([Model].self, from: data!) 上放置一个断点,看看你是否一遍又一遍地获得相同的数据——如果是,在堆栈溢出时在搜索栏中输入“URLSession cache”——有很多关于它的问题(但首先要确保这是问题)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    相关资源
    最近更新 更多