Swift - 从子类访问 属性 时遇到问题

Swift - Trouble Accessing Property from Subclass

所以我是 swift 的新手,我已经了解了一些关于从子class 访问属性的知识。在这种情况下,我认为我的问题比那更复杂。

我有一个表视图,它会转到详细信息视图 (BuyStats)。在 'prepare' 方法中,我为 BuyStats class 设置 属性 "selectedPlayer"。

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if segue.identifier == "BuyStats" {

        let buyStats =  segue.destination as! BuyStats

        if let indexPath = tableView.indexPathForSelectedRow {

            let player = players[indexPath.row]

            buyStats.selectedPlayer = player

        }
    }

selectedPlayer 在这里工作正常,我可以轻松访问它的 .Name 属性。

class BuyStats: UIViewController {

var selectedPlayer: Player! = nil

@IBOutlet weak var selectedPlayerNameLabel: UILabel!
@IBOutlet weak var spendAmount: UILabel!

override func viewDidLoad(){
    let rightBarButton = UIBarButtonItem(title: "Enter", style: UIBarButtonItemStyle.plain, target: self, action: #selector(myRightSideBarButtonItemTapped(_:)))
    self.title = "Buy Stats"
    self.navigationItem.rightBarButtonItem = rightBarButton

    selectedPlayerNameLabel.text = selectedPlayer.Name

}

但在详细视图中,我还有一个容器视图,其中包含一个导航控制器和一个 BuyStats 的子class。我还需要能够访问 subclass (BuyStatsTapPager) 中的 selectedPlayer,但它不起作用。

这是一个故事板图片,以防我的设置有点混乱。

这是我需要从超级 class 访问 selectedPlayer 属性 的地方。

class BuyStatsTabPager: BuyStats{

@IBOutlet var segmentedControl: UISegmentedControl!
@IBOutlet weak var scoreKey: UIBarButtonItem!
@IBOutlet weak var standings: UIBarButtonItem!

override func viewDidLoad() {

    navigationController?.navigationBar.barTintColor = UIColor(red: 27/255, green: 27/255, blue: 27/255, alpha: 1)

    scoreKey.setTitleTextAttributes([NSFontAttributeName: UIFont(name: "Helvetica", size: 13.0)!], for: UIControlState.normal)
    scoreKey.tintColor = UIColor.blue

    standings.setTitleTextAttributes([NSFontAttributeName: UIFont(name: "Helvetica", size: 13.0)!], for: UIControlState.normal)
    standings.tintColor = UIColor.blue

但是下面的打印语句给我一个 exc_bad_instruction 错误。如果它在 superclass 中成功设置,它不应该在 subclass 中可用吗?

  print(super.selectedPlayer.Name)

}

'selectedPlayer' 出现在 IDE 中而没有调用 super 所以我也试过了。

print(selectedPlayer.Name)

我对 google 没有任何好感,我一直在尝试的所有其他解决方案都有点古怪,所以我想我最好问问别人。

在你的情况下,你的故事板看起来像你的 segue 的目的地不是 BuyStats 而是导航控制器。在你的 prepare(for: sender:) 方法中,试试这个:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if segue.identifier == "BuyStats" {
        let nav = segue.destination as! UINavigationController
        let buyStats = nav.viewControllers[0] as! BuyStatsTabPager

        if let indexPath = tableView.indexPathForSelectedRow {

            let player = players[indexPath.row]
            buyStats.selectedPlayer = player

    }
}