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
}
}
所以我是 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
}
}