2017-04-08 84 views
0

因此,我對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

回答

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 

    } 
} 
+0

謝謝,這幫助我弄明白了。當我應該在BuyStats類中使用第二次準備時,我試圖使用類繼承。 –