菜鸟教程小白 发表于 2022-12-11 20:17:50

ios - Swift解析json和数据传输


                                            <p><p>我是 iOS 开发的初学者。
摆在我面前的任务是使用 api GitHub 来获取关于用户 Gist 描述的数据。</p>

<p>这个想法是这样的:
我在第一个 <code>viewcontroller</code> (<code>LoginViewController</code>) 的 <code>usernameTextField</code> 中输入用户名
然后你按下 <strong>searchTapped</strong>,segue 被触发并把你扔到第二个 ViewController (<code>GistsViewController</code>),在 <code>tableview</code> 中显示收到的描述来自 <code>json</code>
来自 json 的数据被解码并添加到 <em>gists</em> 数组中,然后通过 segue 传递到 <code>GistsViewController</code>。
但是该项目没有错误,但它不能正常工作..有人可以帮我编辑我的代码吗?</p>

<p>这是我的模型:</p>

<pre><code>struct Gists: Codable {
    let description: String?

    private enum CodingKeys: String, CodingKey {
      case description

    }
}
</code></pre>

<p>这是第一个 viewController:</p>

<pre><code>class LoginViewController: UIViewController {

    @IBOutlet weak var warningLabel: UILabel!
    @IBOutlet weak var usernameTextField: UITextField!

    var gists = ()
    var username: String?

    func displayWarningLabel(withText text: String) {
      warningLabel.text = text
      UIView.animate(withDuration: 3, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseInOut, animations: { in
            self?.warningLabel.alpha = 1
      }) { complete in
            self?.warningLabel.alpha = 0
      }
    }

    override func viewDidLoad() {
      super.viewDidLoad()
      warningLabel.alpha = 0
    }

    @IBAction func unwindToMainScreen(segue: UIStoryboardSegue) {
      usernameTextField.text = &#34;&#34;
    }

    @IBAction func searchTapped(_ sender: UIButton) {
      guard let username = usernameTextField.text, username != &#34;&#34; else {
            displayWarningLabel(withText: &#34;Information is incorrect&#34;)
            return
      }

      guard let gitUrl = URL(string: &#34;https://api.github.com/users/\(username)/gists&#34;) else { return }
      URLSession.shared.dataTask(with: gitUrl) { (data, response, error) in
            guard let data = data else { return }
            do {
                let decoder = JSONDecoder()
                let gitData = try decoder.decode(.self, from: data)

                DispatchQueue.main.sync {
                  self.gists.append(gitData.description)
                }
            } catch let err {
                print(&#34;Err&#34;, err)
            }
            }.resume()

      performSegue(withIdentifier: &#34;GistsSegue&#34;, sender: nil)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
      guard let dvc = segue.destination as? GistsViewController else { return }
      dvc.username = usernameTextField.text
      dvc.gists1 = gists
      }
}
</code></pre>

<p>这是第二个 viewController:</p>

<pre><code>class GistsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    var username: String!
    var gists1 = ()

    @IBOutlet weak var tableView: UITableView!

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -&gt; Int {
      return gists1.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -&gt; UITableViewCell {
      let cell = tableView.dequeueReusableCell(withIdentifier: &#34;Cell&#34;, for: indexPath)
      cell.backgroundColor = .clear
      cell.textLabel?.text = gists1
      self.tableView.reloadData()
      return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
      tableView.deselectRow(at: indexPath, animated: true)
    }

    override func viewDidLoad() {
      super.viewDidLoad()
      title = username
      tableView.tableFooterView = UIView(frame: .zero)
      tableView.dataSource = self
      tableView.delegate = self
      print(gists1)
    }

    @IBAction func addTapped(_ sender: UIBarButtonItem) {
    }   
}
</code></pre>

<p>非常感谢任何帮助!</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>对api的调用是异步的,所以在完成 block 里面插入<code>performSegue</code></p>

<pre><code>guard let gitUrl = URL(string: &#34;https://api.github.com/users/\(username)/gists&#34;) else { return }
URLSession.shared.dataTask(with: gitUrl) { (data, response, error) in
    guard let data = data else { return }
    do {
      let decoder = JSONDecoder()
      let gitData = try decoder.decode(.self, from: data)

      DispatchQueue.main.sync {
            self.gists.append(contentsOf:gitData)
            performSegue(withIdentifier: &#34;GistsSegue&#34;, sender: nil)
      }
    } catch let err {
      print(&#34;Err&#34;, err)
    }
    }.resume()
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - Swift解析json和数据传输,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/51080299/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/51080299/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - Swift解析json和数据传输