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

时间:2017-04-08 03:52:19

标签: swift xcode tableview subclass

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

我有一个tableview,它可以分割成详细视图(BuyStats)。在'prepare'方法中,我为BuyStats类设置了属性“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的子类。我还需要能够访问子类中的selectedPlayer(BuyStatsTapPager),但它无法正常工作。

如果我的设置有点令人困惑,请提供故事板图片。

enter image description here

这是我需要从超类访问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

但是下面的print语句给了我一个exc_bad_instruction错误。如果在超类中成功设置,它不应该在子类中可用吗?

  print(super.selectedPlayer.Name)

}

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

print(selectedPlayer.Name)

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

1 个答案:

答案 0 :(得分:0)

您的故事板在您的情况下看起来像您的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

    }
}