如何获取表视图数据到 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 = ""