我有一个TableView,当用户点击它时,需要显示一个详细视图,显示它所单击的行的名称。我使用Json调用填充tableView但我无法弄清楚我做错了什么。
这是我的ViewController代码
import UIKit
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
var valueToPass:String!
@IBOutlet weak var tableView: UITableView!
// Instantiate animals class
var items = [animalObject]()
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
addDummyData()
}
func addDummyData() {
RestManager.sharedInstance.getRandomUser(onCompletion: {(json) in
if let results = json.array {
for entry in results {
self.items.append(animalObject(json: entry))
}
DispatchQueue.main.sync{
self.tableView.reloadData()
}
}
})
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cellIdentifier") as! CustomTableViewCell!
let animal = self.items[indexPath.row]
cell?.label.text = animal.name
return cell! //4.
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print("You selected cell #\(indexPath.row)!")
// Get Cell Label
// let indexPath = tableView.indexPathForSelectedRow!
var currentCell = tableView.cellForRow(at: indexPath)! as UITableViewCell
print(currentCell.textLabel?.text)
valueToPass = currentCell.textLabel?.text
print(valueToPass)
performSegue(withIdentifier: "detailView", sender: indexPath)
}
func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){
if (segue.identifier == "detailView") {
// initialize new view controller and cast it as your view controller
let viewController = segue.destination as! DetailViewController
// your new view controller should have property that will store passed value
viewController.passedValue = valueToPass
}
}
}
我的detailView只有以下信息
@IBOutlet weak var tooPass: UILabel!
var passedValue: String!
override func viewDidLoad() {
super.viewDidLoad()
print("DETAILS")
print(passedValue)
tooPass.text = passedValue
}
我不确定preparedToSegue是否提前点火了,因为我的终端看起来像这样:
我用以下question作为参考,我们将不胜感激
答案 0 :(得分:1)
尝试使用didSelectRowAt
方法。
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
valueToPass = self.items[indexPath.row]
print(valueToPass)
performSegue(withIdentifier: "detailView", sender: indexPath)
}
只需传递items数组中的整个项目。
使DetailViewController传递类型为item的项目。然后只需访问item.whateverPropertyRequired
。
答案 1 :(得分:0)
问题在于,在cellForRow
方法中,您将单元格转换为CustomTableViewCell
类型,而在didSelectRow
中,您将其转换为UITableViewCell
。改变
var currentCell = tableView.cellForRow(at: indexPath)! as UITableViewCell
在didSelectRow
至
var currentCell = tableView.cellForRow(at: indexPath)! as CustomTableViewCell
答案 2 :(得分:0)
这里的好方法是使用视图模型。创建包含您的项目和与之关联的数据的模型。在segue传递您的数据模型。这是糟糕的编码,在didSelect方法上从单元格获取数据,除非某些ui在该单元格上工作