gpt4 book ai didi

json - 尝试使用 didSelectRowAtIndexPath 更新标签

转载 作者:搜寻专家 更新时间:2023-10-31 22:22:47 25 4
gpt4 key购买 nike

我有一个 tableView,其中填充了来自 JSON 数组的信息。当我点击那个单元格时,它会转入一个 DetailsViewController 应该显示的地方

  1. 显示被点击单元格文本的标签(在我的例子中是标题或条目名称)
  2. 显示与该单元格标题对应的时间的标签
  3. 一个标签,显示与该单元格标题对应的 ID。所有这些信息(例如时间、ID)都来 self 的 JSON 数组。

我已经让#1 工作了,#2 是我需要帮助的地方(而且我确信在我弄清楚之后我可以轻松地制作 id 标签)。我正在使用 didSelectRowAtIndexPath 更新时间标签,程序运行正常,但时间标签未更新信息。标签甚至没有出现。

这是我在 tableViewController 文件中的代码:

class EarthTableViewController: UITableViewController {
var info = [AppModel]()



func getEarthquakeInfo(completion: (results : NSArray?) ->Void ){

DataManager.getEarthquakeDataFromFileWithSuccess {
(data) -> Void in

let json = JSON(data: data)


if let JsonArray = json.array {

for appDict in JsonArray {
var ids: String? = appDict["id"].stringValue
var title: String? = appDict["title"].stringValue
var time: String? = appDict["time"].stringValue
var information = AppModel(idEarth: ids, title: title, time: time)

self.info.append(information)
completion(results: self.info)
}


}

}



}


override func viewDidLoad() {
super.viewDidLoad()
getEarthquakeInfo { (info) in
self.tableView.reloadData()
}
}




override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) as UITableViewCell
let infoArray = self.info
cell.textLabel!.text = info[indexPath.row].title
return cell

}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {

if segue.identifier == "SEGUE" {
let vc = segue.destinationViewController as DetailsViewController
let cell = (sender as UITableViewCell)
let title = cell.textLabel!.text
vc.titleData = title

}
}




override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

let time = info[indexPath.row].time
let destinationVC = DetailsViewController()
destinationVC.timeData = time


}

我的 DetailsViewController 文件:

class DetailsViewController: UIViewController {


@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var idLabel: UILabel!

@IBOutlet weak var timeLabel: UILabel!
var titleData: String!
var idData: String!
var timeData: String!

override func viewDidLoad() {
super.viewDidLoad()
let earthInfo = EarthTableViewController()
titleLabel.text = titleData
idLabel.text = idData
timeLabel.text = timeData
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}



}

为了以防万一,这是我使用的 AppModel.swift 文件:

class AppModel: NSObject, Printable {
let idEarth: String
let title: String
let time: String


override var description: String {
return "ID: \(idEarth), TITLE: \(title), TIME: \(time), \n"
}

init(idEarth: String?, title: String?, time: String?) {
self.idEarth = idEarth ?? ""
self.title = title ?? ""
self.time = time ?? ""
}

}

如有任何帮助,我们将不胜感激。

更新答案:在下面人们评论的帮助下,我能够找出我自己问题的答案。事实证明,我什至不需要使用 didSelectRowAtIndexPath。我首先添加它的原因是因为当尝试在 prepareForSegue 中执行 let time = info[indexPath.row].time 它不起作用,因为我没有添加代码我需要这样做。现在所有的标签都可以正常显示信息了。

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {

if segue.identifier == "SEGUE" {
let vc = segue.destinationViewController as DetailsViewController
let cell = (sender as UITableViewCell)
let title = cell.textLabel!.text
vc.titleData = title

if let indexPath = self.tableView.indexPathForSelectedRow(){
let time = info[indexPath.row].time
println("\(time)")
vc.timeData = time
let id = info[indexPath.row].idEarth
vc.idData = id

}
}
}

最佳答案

关于如何在两个 View Controller 之间传递数据,这似乎是一个简单的错误。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if segue.identifier == "SEGUE" {
let vc = segue.destinationViewController as DetailsViewController
let cell = (sender as UITableViewCell)
let title = cell.textLabel!.text
vc.titleData = title
}
}

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let time = info[indexPath.row].time
let destinationVC = DetailsViewController()
destinationVC.timeData = time
}

问题在于您将信息发送到未显示的 UIViewController。在 didSelectRowAtIndexPath: 中,您正在初始化一个 View Controller 并正确地将数据发送给它,但从未显示该特定实例。要解决此问题,您有几种选择。您可以选择继续使用 Action Segue 并使用 performSegueWithIdentifier: & prepareForSegue: 在 segue 中传递数据,或者您可以选择使用 instantiateViewControllerWithIdentifier: 并手动呈现所述 View Controller 。

关于json - 尝试使用 didSelectRowAtIndexPath 更新标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29908080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com