如何获取表视图数据到 detailsViewController
How to get tableview data to a detailsViewController
我目前正在开发一个将 API 数据放入表视图然后在 detailsViewController 中查看数据的应用程序。
我的代码看起来很合适,我开始怀疑是否所有信息都应该在表视图中以便我将数据传递给另一个控制器。是否可以将数据传递给另一个控制器而不必将所有信息都放在 tableview 单元格中?
编辑:如果我要从 fetchedSpell 数组中获取 detailsViewController 中的数据,我如何让 detailsViewController 知道根据单击的单元格显示哪些数据?
我已经尝试通过它,但是当我单击单元格时,详细信息控制器中没有显示任何内容。
Table 查看 Select
func tableView(_ tableView: UITableView, didSelectRowAt indexPath:
IndexPath) {
let storyBoard: UIStoryboard = UIStoryboard(name:"Main",
bundle: nil)
let SpellDetailsViewController =
storyBoard.instantiateViewController(withIdentifier:
"SpellDetailsViewController") as! SpellDetailsViewController
let detail = fetchedSpell[indexPath.row]
SpellDetailsViewController.spellText = detail.spell
SpellDetailsViewController.effectText = detail.effects
SpellDetailsViewController.typeText = detail.types
self.present(SpellDetailsViewController, animated: true,
completion: nil)
}
法术详细信息控制器
class SpellDetailsViewController: UIViewController,
UINavigationControllerDelegate {
@IBOutlet weak var spellLabel: UILabel!
@IBOutlet weak var typeLabel: UILabel!
@IBOutlet weak var effectLabel: UILabel!
var spellText: String!
var typeText: String!
var effectText : String!
override func viewDidLoad() {
super.viewDidLoad()
spellLabel.text = spellText
typeLabel.text = typeText
effectLabel.text = effectText
}
根据屏幕截图,您正在使用 segue,因此您不能实例化控制器。
- (重新)从 table 视图单元(而不是控制器)连接 segue 并将标识符设置为
"SpellDetailsViewController"
- 删除整个
didSelectRowAt
方法
实施prepare(for segue
。当用户点击一个单元格时,将调用 prepare(for segue
并将该单元格作为 sender
传递
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard segue.identifier == "SpellDetailsViewController",
let cell = sender as? UITableViewCell,
let indexPath = tableView.indexPath(for: cell) else { return }
let detail = fetchedSpell[indexPath.row]
let spellDetailsViewController = segue.destination as! SpellDetailsViewController
spellDetailsViewController.spellText = detail.spell
spellDetailsViewController.effectText = detail.effects
spellDetailsViewController.typeText = detail.types
}
并在详细视图控制器中将字符串属性声明为 non-optional 空字符串,例如
var spellText = ""
我目前正在开发一个将 API 数据放入表视图然后在 detailsViewController 中查看数据的应用程序。
我的代码看起来很合适,我开始怀疑是否所有信息都应该在表视图中以便我将数据传递给另一个控制器。是否可以将数据传递给另一个控制器而不必将所有信息都放在 tableview 单元格中?
编辑:如果我要从 fetchedSpell 数组中获取 detailsViewController 中的数据,我如何让 detailsViewController 知道根据单击的单元格显示哪些数据?
我已经尝试通过它,但是当我单击单元格时,详细信息控制器中没有显示任何内容。
Table 查看 Select
func tableView(_ tableView: UITableView, didSelectRowAt indexPath:
IndexPath) {
let storyBoard: UIStoryboard = UIStoryboard(name:"Main",
bundle: nil)
let SpellDetailsViewController =
storyBoard.instantiateViewController(withIdentifier:
"SpellDetailsViewController") as! SpellDetailsViewController
let detail = fetchedSpell[indexPath.row]
SpellDetailsViewController.spellText = detail.spell
SpellDetailsViewController.effectText = detail.effects
SpellDetailsViewController.typeText = detail.types
self.present(SpellDetailsViewController, animated: true,
completion: nil)
}
法术详细信息控制器
class SpellDetailsViewController: UIViewController,
UINavigationControllerDelegate {
@IBOutlet weak var spellLabel: UILabel!
@IBOutlet weak var typeLabel: UILabel!
@IBOutlet weak var effectLabel: UILabel!
var spellText: String!
var typeText: String!
var effectText : String!
override func viewDidLoad() {
super.viewDidLoad()
spellLabel.text = spellText
typeLabel.text = typeText
effectLabel.text = effectText
}
根据屏幕截图,您正在使用 segue,因此您不能实例化控制器。
- (重新)从 table 视图单元(而不是控制器)连接 segue 并将标识符设置为
"SpellDetailsViewController"
- 删除整个
didSelectRowAt
方法 实施
传递prepare(for segue
。当用户点击一个单元格时,将调用prepare(for segue
并将该单元格作为sender
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { guard segue.identifier == "SpellDetailsViewController", let cell = sender as? UITableViewCell, let indexPath = tableView.indexPath(for: cell) else { return } let detail = fetchedSpell[indexPath.row] let spellDetailsViewController = segue.destination as! SpellDetailsViewController spellDetailsViewController.spellText = detail.spell spellDetailsViewController.effectText = detail.effects spellDetailsViewController.typeText = detail.types }
并在详细视图控制器中将字符串属性声明为 non-optional 空字符串,例如
var spellText = ""