我是Swift的初学者,想为我的第一个应用程序提供一些帮助。我希望我能够很好地解释它。我正在开发和应用程序,它从JSON文件加载信息。您是否有人知道如何将此信息填充到UI表视图单元格中。我开发了3个视图控制器,在第一个我有一个按钮,用户必须按下,第二个Tableview控制器将被打开。我已经看过如何填充它的教程,但似乎它不起作用。第三个是Table View Cells.let我告诉你:
class TableViewController: UITableViewController {
@IBOutlet weak var Bar: UIToolbar!
var TableData:Array< String > = Array < String >()
let ImageList = ["",""]
var TitleList = ["",""]
let DescriptionList = ["",""]
我必须在单元格中显示图像,标题和描述。 这是JSON文件:
{
“fruits” : [
{
“Name” : “Fruit1”,
“Picture”:”http://www.starpropertiesindia.com/blog/wp- content/uploads/2016/08/kochi1.jpg”,
“Description”:””,
},
{
“Name” : “Fruit2”,
“Picture”:”http://www.starpropertiesindia.com/blog/wp-content/uploads/2016/08/kochi1.jpg”,
“Description”:””,
},
如果有人建议我如何继续,我会非常感激..
在新视图中准备segue:
@IBOutlet weak var CellDescription: UILabel!
@IBOutlet weak var CellImage: UIImageView!
@IBOutlet weak var CellTitle: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
答案 0 :(得分:7)
首先,不要为数据源使用多个数组。它们非常容易出错,因为您有责任保持项目数量的同步。
由于Swift是一种面向对象的语言,因此使用自定义结构作为模型
struct Fruit {
let name : String
let imageURL : NSURL
let description : String
}
声明一个Fruit
的空Swift数组作为数据源数组。基本上使用始终 Swift本机集合类型(而不是NSArray
和NSDictionary
),因为它们包含类型信息。
var fruits = [Fruit]()
创建一个解析JSON的函数并重新加载表视图。该代码假定JSON文件名为jsonFile.json
,位于应用程序包中。此外,它使用SwiftyJSON
库。
func parseFruits() {
guard let url = NSBundle.mainBundle().URLForResource("jsonFile", withExtension: "json"), jsonData = NSData(contentsOfURL: url) else {
print("Error finding JSON File")
return
}
let jsonObject = JSON(data: jsonData)
let fruitArray = jsonObject["fruits"].arrayValue
for aFruit in fruitArray {
let name = aFruit["Name"].stringValue
let imageURL = aFruit["Picture"].stringValue
let description = aFruit["Description"].stringValue
let fruit = Fruit(name: name, imageURL: NSURL(string:imageURL)!, description:description)
fruits.append(fruit)
}
self.tableView.reloadData()
}
在viewWillAppear
中调用解析函数
override func viewWillAppear() {
super.viewWillAppear()
parseFruits()
}
这些是表视图数据源委托方法,假设单元格的标识符为Cell
,单元格的样式为Right Detail
或Subtitle
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return fruits.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
let fruit = fruits[indexPath.row]
cell.textLabel!.text = fruit.name
cell.detailTextLabel?.text = fruit.description
// add code to download the image from fruit.imageURL
return cell
}
编辑:
在Swift 4中,一切都变得更短更方便。最重要的变化是放弃SwiftyJSON
并使用Decodable
struct Fruit : Decodable {
let name : String
let imageURL : URL
let description : String
}
func parseFruits() {
let url = Bundle.main.url(forResource:"jsonFile", withExtension: "json")!
let jsonData = try! Data(contentsOfURL: url)
self.fruits = try! JSONDecoder().decode([Fruit].self, from: jsonData)
self.tableView.reloadData()
}
答案 1 :(得分:0)
你有Json数据,只需要将它放在一个数组中并将它们加载到表视图中,如下所示:
var tableData:NSArray = []
self.tableData = json["fruits"] as! NSArray
// In the place of json put your json object
self.tableView.reloadData()
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.tableData.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell
let item = self.tableData[indexPath.row] as! [String : String]
cell.nameLabel?.text = item["Name"]
cell.descriptionLabel?.text = item["Description"]
return cell
}
答案 2 :(得分:0)
试试这会帮助你
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell", for: indexPath) as! TableViewCell
var dict = array[indexPath.row]
cell.lbl1.text = dict["Name"] as? String
cell.lbl2.text = dict["ad_created_date"] as? String
cell.lbl3.text = dict["phone_number"] as? String
cell.lbl4.text = dict["id"] as? String
cell.lbl5.text = dict["ad_zip"] as? String
let imageUrlString = dict["Picture"]
let imageUrl:URL = URL(string: imageUrlString as! String)!
let imageData:NSData = NSData(contentsOf: imageUrl)!
cell.img.image = UIImage(data: imageData as Data)
return cell
}