我對Xcode和Swift很新穎。我試圖在TableView中按字母順序顯示數據(餐廳名稱)。我有一個JSON文件,將每個餐廳分類到正確的鄰域中。代碼在視圖控制器中完美工作,我可以在部分中顯示鄰域的名稱,並在行中顯示餐廳的名稱。我的問題是,我試圖在不同的視圖控制器中的所有餐館名稱進行排序,其中各個部分顯示字母(A,B,C ...),並且我嘗試按照字母順序顯示餐館側。類似於iPhone上的聯繫人應用程序,但我需要顯示餐廳名稱的聯繫人名稱。希望我有道理。 我的代碼如下所示:在Swift的表視圖中按字母順序顯示JSON數據
class BarsViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, SWRevealViewControllerDelegate, UISearchBarDelegate {
@IBOutlet var btnMenuButton: UIBarButtonItem!
@IBOutlet var tableView: UITableView!
@IBOutlet var searchButton: UIBarButtonItem!
var noDataLabel = UILabel()
let urlString = "http://barhoppersf.com/json/neighborhoods.json"
var restaurantArray = Array<Restaurant>()
var filteredRestaurants = [Restaurant]()
var shouldShowSearchResults = false
var searchBar = UISearchBar()
var logoImageView: UIImageView!
let restaurantsName = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","#"]
let indexName = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","#"]
let voidIndex = [""]
var restSections = [String]()
var restDictionary = [String : [String]]()
override func viewDidLoad() {
super.viewDidLoad()
self.downloadJsonWithURL() // This loads tableview with data from url
tableView.reloadData()
}
**//JSON FUNC**
func downloadJsonWithURL() {
let url = NSURL(string: urlString)
URLSession.shared.dataTask(with: (url as URL?)!, completionHandler: {(data, response, error) -> Void in
if let error = error {
print(error.localizedDescription)
return
}
if let data = data {
guard let json = try? JSONSerialization.jsonObject(with: data) else { return }
guard let dict = json as? Dictionary<String,Dictionary<String,Dictionary<String,Array<Dictionary<String,String>>>>> else { return }
guard let hoods = dict["hoods"] else { return }
guard let names = hoods["neighborhoodNames"] else { return }
for (key, value) in names {
let neighborhood = NeighborhoodRestaurants(name: key, data: value)
self.tableData.append(neighborhood)
self.tableData.sort { $0.name < $1.name }
self.filteredRestaurants = self.tableData
}
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}).resume()
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.restaurantArray[section].restaurants.count
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return self.restaurantArray[section].name
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
tableView.rowHeight = 40
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! RestaurantsTableViewCell
cell.barLabel.text = self.restaurantArray[indexPath.section].restaurants[indexPath.row].name
return cell
}
我有所有的結構中的獨立快捷文件的JSON
struct Restaurant {
var name: String
var cuisine: String
var hours: String
var description: String
var address: String
var phone: String
var website: String
var sports: String
var image: String
init?(dict:Dictionary<String,String>) {
guard
let name = dict["name"],
let cuisine = dict["cuisine"],
let hours = dict["hours"],
let description = dict["description"],
let address = dict["address"],
let phone = dict["phone"],
let website = dict["website"],
let sports = dict["sports"],
let image = dict["image"]
else {
return nil
}
self.name = name
self.cuisine = cuisine
self.hours = hours
self.description = description
self.address = address
self.phone = phone
self.website = website
self.sports = sports
self.image = image
}
//MARK: Function for the data from ViewControler
}
struct NeighborhoodRestaurants {
var name: String
var restaurants: Array<Restaurant>
init(name:String, data:Array<Dictionary<String,String>>) {
self.name = name
self.restaurants = Array<Restaurant>()
for dict in data {
if let restaurant = Restaurant(dict: dict) {
self.restaurants.append(restaurant)
self.restaurants.sort { $0.name < $1.name }
}
}
}
}
這是JSON文件:http://barhoppersf.com/json/neighborhoods.json
這是一個image社區視圖控制器,效果很好。你可以明白這個主意! 再次提前致謝!
拉詹,感謝您的幫助。我正試圖用我所擁有的實現你的代碼。我有一個DetailViewController顯示餐館的細節。這是來自我在單獨的swift文件中的結構的調用。看來代碼現在剎車,但我正在嘗試修復它。另外,有沒有辦法在Z之後加上「#」號。我喜歡用A開始。我一直在試圖找到一個函數,但沒有運氣。再次感謝。我讚賞 – Dian
如果你在不同的文件中有你的結構,無所謂。喲只需將餐廳的模型從TableView didSelect委託傳遞給您的detailController。您可以在第一個索引處抓取完整的對象,該索引是'#'並最後附加它。通過這種方式,你可以使#最後的Z –
你如何在第一個索引處獲取完整的對象?我嘗試了幾種不同的方法,但它不工作!有沒有可以告訴我的功能?對不起,我還在學習。我試圖使用:self.tableData.sort {$ 0.name <$ 1.name}謝謝你。 – Dian