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

问题描述:

因此,我对swift很陌生,并且从一个子类中学到了一些关于访问属性的知识。在这种情况下,我认为我的问题比这个更复杂。Swift - 从子类访问属性时遇到问题

我有一个tableview细节视图(BuyStats)。在“准备”方法中,我为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的子类的容器图。我还需要能够访问子类(BuyStatsTapPager)中的selectedPlayer,但它不起作用。

继承人故事板图片,以防我的设置有点混乱。

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所以我也试过了。

print(selectedPlayer.Name) 

我并没有与谷歌的任何运气和所有其他的解决方案,我一直都有点古怪,所以我想我最好问别人。

+0

这取决于如何创建'BuyStatsTabPager'实例并设置属性。 – vadian

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

    } 
} 
+0

谢谢,这帮助我弄明白了。当我应该在BuyStats类中使用第二次准备时,我试图使用类继承。 –