怎么更新表视图

本教程将介绍如何更新表视图的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

怎么更新表视图 教程 第1张

问题描述

我使用了搜索栏。它没有更新表视图。

struct ApiResults:Decodable {
 let resultCount: Int
 let results: [Music]
}

struct Music:Decodable {
 let trackName: String?
 let artistName: String?
 let artworkUrl60: String?
}

class ItunesDataViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UISearchBarDelegate {

 @IBOutlet weak var searchBar: UISearchBar!
 @IBOutlet weak var tableView: UITableView!
 var musicArray:[Music] = []
 var mArray:[Music] = []
 var filteredData:[Music] = []
 var isSearching = false

 override func viewDidLoad() {
  super.viewDidLoad()

  self.tableView.dataSource = self
  self.tableView.delegate = self

  self.searchBar.delegate = self
  searchBar.placeholder = "search"

 }
  func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String)
 {

  print("

searchText : (searchText)

")
  Search(searchTerm: "(searchText)")

  if searchBar.text == nil || searchBar.text == ""
  {
isSearching = false
view.endEditing(true)
self.tableView.reloadData()
  }
  else
  {
isSearching = true
filteredData = mArray.filter{$0.artistName == searchText}
self.tableView.reloadData()
  }

 }
 func Search(searchTerm: String)
 {

  guard let url = URL(string: "https://itunes.apple.com/search?term=(searchTerm)&attribute=actorTerm&attribute=languageTerm&attribute=allArtistTerm&attribute=tvEpisodeTerm&attribute=shortFilmTerm&attribute=directorTerm&attribute=releaseYearTerm&attribute=titleTerm&attribute=featureFilmTerm&attribute=ratingIndex&attribute=keywordsTerm&attribute=descriptionTerm&attribute=authorTerm&attribute=genreIndex&attribute=mixTerm&attribute=allTrackTerm&attribute=artistTerm&attribute=composerTerm&attribute=tvSeasonTerm&attribute=producerTerm&attribute=ratingTerm&attribute=songTerm&attribute=movieArtistTerm&attribute=showTerm&attribute=movieTerm&attribute=albumTerm") else {return}
  URLSession.shared.dataTask(with: url){(data, response, error) in
guard let data = data else {return}

do
{
 let apiressults = try JSONDecoder().decode(ApiResults.self, from: data)

 for item in apiressults.results
 {
  if let track_Name = item.trackName, let artist_Name = item.artistName, let artwork_Url60 = item.artworkUrl60
  {
let musics = Music(trackName: track_Name, artistName: artist_Name, artworkUrl60: artwork_Url60)
self.musicArray.append(musics)
print(musics.artistName!,"-", musics.trackName!)
  }
 } 
 DispatchQueue.main.async
  {
self.tableView.reloadData()
 }
}
catch let jsonError
{
 print("Error:", jsonError)
}
}.resume()
 }

 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  if isSearching
  {
return filteredData.count
  }
  else
  {
return mArray.count
  }
 }

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  let cell = tableView.dequeueReusableCell(withIdentifier: "musicCell", for: indexPath) as! ItunesDataTableViewCell

  if isSearching
  {
cell.lblDesc?.text = filteredData[indexPath.row].artistName
cell.lblSongDesc?.text = filteredData[indexPath.row].trackName
let imgString = filteredData[indexPath.row].artworkUrl60!

let imgUrl:URL = URL(string: imgString)!
DispatchQueue.global(qos: .userInitiated).async {

 let imageData:NSData = NSData(contentsOf: imgUrl)!

 DispatchQueue.main.async {
  let image = UIImage(data: imageData as Data)
  cell.imgArt?.image = image
 }
}
  }
  else
  {
cell.lblDesc?.text = mArray[indexPath.row].artistName
cell.lblSongDesc?.text = mArray[indexPath.row].trackName
let imgString = mArray[indexPath.row].artworkUrl60!

let imgUrl:URL = URL(string: imgString)!
DispatchQueue.global(qos: .userInitiated).async {

 let imageData:NSData = NSData(contentsOf: imgUrl)!

 DispatchQueue.main.async {
  let image = UIImage(data: imageData as Data)
  cell.imgArt?.image = image
 }
}
  }

  return cell
 }
}

推荐答案

请清理您的代码?:您有两个不同的数组mArraymusicArray

您正在Search中填充musicArray,但mArray用作数据源。

为什么要从Music个项目创建新的Music个项目?您可以将代码减少为

let apiressults = try JSONDecoder().decode(ApiResults.self, from: data)
self.mArray = apiressults.results
DispatchQueue.main.async {
self.tableView.reloadData()
}

好了关于怎么更新表视图的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。