如何将TableView数据获取到detailsViewController

时间:2019-07-03 05:51:39

标签: ios json swift uitableview uiviewcontroller

我目前正在开发一个将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
}

Tablieview and Details Page

1 个答案:

答案 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 = ""