我目前正在开发一个将API数据放入表格视图,然后在detailsViewController中查看数据的应用程序。
我的代码看起来很合适,我开始怀疑也许所有信息都应该在表视图中,以便我将数据传递给另一个控制器。是否可以将数据传递到另一个控制器,而不必将所有信息放入表格单元格中?
编辑:如果我要从fetchedSpell数组中获取detailsViewController中的数据,我如何让detailsViewController基于单击的单元格显示哪些数据?
我已经尝试过将其传递,但是当我单击该单元格时,详细信息控制器中没有任何显示。
表视图选择
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
}
答案 0 :(得分:1)
根据屏幕截图,您正在使用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
}
然后在详细视图控制器中将字符串属性声明为非可选的空字符串,例如
var spellText = ""