JSON 到 TableView 的难度
Posted
技术标签:
【中文标题】JSON 到 TableView 的难度【英文标题】:JSON to TableView difficulty 【发布时间】:2015-04-07 22:17:07 【问题描述】:我在从 json 结果填充 tableview 时遇到困难。我的代码如下(抱歉,但它似乎不想将前两行作为代码:/):
导入 UIKit
类 ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource
override func viewDidLoad()
super.viewDidLoad()
let url = NSURL(string: "http://api.football-data.org/alpha/soccerseasons/354/teams")
let data = NSData(contentsOfURL: url!)
let json = NSJSONSerialization.JSONObjectWithData(data!, options: nil, error: nil) as NSDictionary
let teamsArray = json["teams"] as NSArray
print("Team List : \(teamsArray)")
for dic in teamsArray
let teamname = dic["name"] as NSString
let code = dic["code"] as NSString
println("Team Name, \(teamname) : Code, \(code)")
// self.tableViewObject.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
@IBOutlet weak var tableViewObject: UITableView!
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return teamsArray.count
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
let cell:UITableViewCell=UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "mycell")
cell.textLabel!.text = teamsArray[indexPath.row]
return cell
它两次抱怨“两次使用未解析的标识符'teamsArray'。首先在:
返回 teamsArray.count
然后在:
cell.textLabel!.text = teamsArray[indexPath.row]
有人可以帮我解决上面提到的错误或将我引向正确的方向,从而帮助我将我的 JSON 与我的 tableview 链接起来。
值得注意的是,当我在没有任何 tableview 提示的空白视图上使用代码时,我在控制台中得到了完美的结果:
let url = NSURL(string: "http://api.football-data.org/alpha/soccerseasons/354/teams")
let data = NSData(contentsOfURL: url!)
let json = NSJSONSerialization.JSONObjectWithData(data!, options: nil, error: nil) as NSDictionary
let teamsArray = json["teams"] as NSArray
print("Team List : \(teamsArray)")
for dic in teamsArray
let teamname = dic["name"] as NSString
let code = dic["code"] as NSString
println("Team Name, \(teamname) : Code, \(code)")
我是 *** 的新手,之前有人告诉我我的问题不够具体。如果这仍然太模糊,请告诉我,我会努力改进它。
非常感谢,艾伦。
【问题讨论】:
您需要了解scope
。您在viewDidLoad
中声明teamsArray
,但您在其他方法中使用它。通过在viewDidLoad
中声明它,您就是在告诉您的代码您只需要在viewDidLoad
中使用它。所以当你尝试在其他方法中引用它时,它并不知道它。可以这样想:如果你躲在家里,街上的人能看到你吗?这就是现在正在发生的事情。您需要将其声明更高一级才能正常工作。
我认为会是这样,但是当我将它提高一级时,代码本身根本不会运行:/
你是如何使用它的?尝试使用以下class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource var teamsArray : NSArray override func viewDidLoad() ....
。然后在viewDidLoad
里面,做self.teamsArray = json["teams"]
。我写的不是很快,所以它可能不是 100% 正确,但应该是正确的。
【参考方案1】:
这样做...
import UIKit
class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource
@IBOutlet weak var tableViewObject: UITableView!
var teamsArray = NSArray()
override func viewDidLoad()
super.viewDidLoad()
self.tableViewObject.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
let url = NSURL(string: "http://api.football-data.org/alpha/soccerseasons/354/teams")
let data = NSData(contentsOfURL: url!)
let json = NSJSONSerialization.JSONObjectWithData(data!, options: nil, error: nil) as NSDictionary
teamsArray = json["teams"] as NSArray
print("Team List : \(teamsArray)")
self.tableViewObject.reloadData()
for dic in teamsArray
let teamname = dic["name"] as NSString
let code = dic["code"] as NSString
println("Team Name, \(teamname) : Code, \(code)")
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return teamsArray.count
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
let cell:UITableViewCell=UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "mycell")
cell.textLabel!.text = self.teamsArray.objectAtIndex(indexPath.row).objectForKey("name") as? NSString
return cell
【讨论】:
您好,非常感谢您提供的代码。我确实将它复制了进去,我得到了一个成功的构建,但是它在运行时出错了。我会将错误图像添加到问题中,看看它是否有帮助。也许我错误地设置了我的视图控制器?如果你能提供一个拉链,那将是完美的,但我很感激我问这个问题很厚颜无耻。非常感谢,艾伦。 抱歉,在我获得 10 个声望点之前我无法上传图片。对不起。 你得到什么错误?因为我在我的 xcode 中实现了相同的代码并且工作完美。 忽略我,是我的输入文件导致问题不是您的代码 :) 非常感谢您的帮助。以上是关于JSON 到 TableView 的难度的主要内容,如果未能解决你的问题,请参考以下文章