如何在 Swift 中的 类 之间正确发送值?
How can I properly send values between classes in Swift?
我一直在使用 Swift 开发基于文本的冒险游戏。但是,我似乎无法更改特定 classes 的默认值。
下面是 class 的代码,它允许我 select 我的播放器 class
import UIKit
class ClassSelectionController: UIViewController
{
//Default class values
var character = (0, 0, "", 0)
override func viewDidLoad()
{
super.viewDidLoad()
// Do any additional setup after loading the view.
}
//class button actions
@IBAction func fighterBtn(_ sender: Any)
{
character = (50, 60, "Steal Sword", 18)
performSegue(withIdentifier: "Character", sender: self)
}
@IBAction func wizerdBtn(_ sender: Any)
{
character = (25, 70, "Staff", 15)
performSegue(withIdentifier: "Character", sender: self)
}
@IBAction func thiefBtn(_ sender: Any)
{
character = (30, 60, "Dagger", 18)
performSegue(withIdentifier: "Character", sender: self)
}
@IBAction func archerBtn(_ sender: Any)
{
character = (50, 60, "Bow & Arrow", 16)
performSegue(withIdentifier: "Character", sender: self)
}
override func prepare(for segue: UIStoryboardSegue, sender: (Any)?)
{
//code for segue
var vc = segue.destination as! ViewController
vc.finalCharacter = self.character
}
}
而这是 class 接收播放器 class 的数据并显示它。
import UIKit
class ViewController: UIViewController
{
var finalCharacter = (0, 0, "", 0)
//****************************************
//Setup for outlets go between these lines
//****************************************
@IBOutlet weak var healthLabel: UILabel!
@IBOutlet weak var damageLabel: UILabel!
@IBOutlet weak var weaponLabel: UILabel!
@IBOutlet weak var armorLabel: UILabel!
@IBOutlet weak var storyLabel: UILabel!
@IBOutlet weak var actionButton: UIButton!
@IBOutlet weak var northBtn: UIButton!
@IBOutlet weak var southBtn: UIButton!
@IBOutlet weak var eastBtn: UIButton!
@IBOutlet weak var westBtn: UIButton!
//****************************************
//Setup for outlets go between these lines
//****************************************
override func viewDidLoad()
{
super.viewDidLoad()
// Do any additional setup after loading the view.
healthLabel.text = "Health: \(finalCharacter.0)"
damageLabel.text = "Damage: \(finalCharacter.1)"
weaponLabel.text = "Weapon: " + finalCharacter.2
armorLabel.text = "Armor : \(finalCharacter.3)"
}
//****************************************
//Setup for buttons go between these lines
//****************************************
@IBAction func actionButton(_ sender: Any)
{
}
@IBAction func northButton(_ sender: Any)
{
}
@IBAction func southButton(_ sender: Any)
{
}
@IBAction func eastButton(_ sender: Any)
{
}
@IBAction func westButton(_ sender: Any)
{
}
//****************************************
//Setup for buttons go between these lines
//****************************************
}
尽管我的代码目前没有显示它,但我确实在 class 按钮中放置了打印值,只是为了查看当我 select a class 和我时这些值是否发生了变化已经看到按下按钮时它们确实发生了变化。我还查看了 ViewController 并更改了 finalCharacter 值,只是想看看这是否影响了什么,但事实并非如此。所以我有根据的猜测是问题必须在 ClassSelectionController 中。
所以主要问题是我将点击巫师玩家 class,我希望巫师的 class 统计数据会弹出(即 25、70、"Staff", 15), 但我只会得到 ClassSelectionController (0, 0, "", 0) 中的默认值。
这里发生了什么,你有多个 UIStoryboardSegue
命名为 "Character" 链接到每个按钮
因此,当您按下按钮时,会在操作按钮之前调用 Segue,此外还会再次调用 UIStoryboardSegue
(如果在 viewDidLoad
中放置调试器,您会看到它去了那里两次)。
解决方案
- 从按钮中删除所有
UIStoryboardSegue
链接
- 从
ClassSelectionController
到下一个ViewController
新建一个UIStoryboardSegue
命名为'Character'
您无需更改代码中的任何内容,但应添加安全检查
override func prepare(for segue: UIStoryboardSegue, sender: (Any)?)
{
if (segue.identifier == "Character") {
let vc = segue.destination as! ViewController
vc.finalCharacter = self.character
}
}
我一直在使用 Swift 开发基于文本的冒险游戏。但是,我似乎无法更改特定 classes 的默认值。
下面是 class 的代码,它允许我 select 我的播放器 class
import UIKit
class ClassSelectionController: UIViewController
{
//Default class values
var character = (0, 0, "", 0)
override func viewDidLoad()
{
super.viewDidLoad()
// Do any additional setup after loading the view.
}
//class button actions
@IBAction func fighterBtn(_ sender: Any)
{
character = (50, 60, "Steal Sword", 18)
performSegue(withIdentifier: "Character", sender: self)
}
@IBAction func wizerdBtn(_ sender: Any)
{
character = (25, 70, "Staff", 15)
performSegue(withIdentifier: "Character", sender: self)
}
@IBAction func thiefBtn(_ sender: Any)
{
character = (30, 60, "Dagger", 18)
performSegue(withIdentifier: "Character", sender: self)
}
@IBAction func archerBtn(_ sender: Any)
{
character = (50, 60, "Bow & Arrow", 16)
performSegue(withIdentifier: "Character", sender: self)
}
override func prepare(for segue: UIStoryboardSegue, sender: (Any)?)
{
//code for segue
var vc = segue.destination as! ViewController
vc.finalCharacter = self.character
}
}
而这是 class 接收播放器 class 的数据并显示它。
import UIKit
class ViewController: UIViewController
{
var finalCharacter = (0, 0, "", 0)
//****************************************
//Setup for outlets go between these lines
//****************************************
@IBOutlet weak var healthLabel: UILabel!
@IBOutlet weak var damageLabel: UILabel!
@IBOutlet weak var weaponLabel: UILabel!
@IBOutlet weak var armorLabel: UILabel!
@IBOutlet weak var storyLabel: UILabel!
@IBOutlet weak var actionButton: UIButton!
@IBOutlet weak var northBtn: UIButton!
@IBOutlet weak var southBtn: UIButton!
@IBOutlet weak var eastBtn: UIButton!
@IBOutlet weak var westBtn: UIButton!
//****************************************
//Setup for outlets go between these lines
//****************************************
override func viewDidLoad()
{
super.viewDidLoad()
// Do any additional setup after loading the view.
healthLabel.text = "Health: \(finalCharacter.0)"
damageLabel.text = "Damage: \(finalCharacter.1)"
weaponLabel.text = "Weapon: " + finalCharacter.2
armorLabel.text = "Armor : \(finalCharacter.3)"
}
//****************************************
//Setup for buttons go between these lines
//****************************************
@IBAction func actionButton(_ sender: Any)
{
}
@IBAction func northButton(_ sender: Any)
{
}
@IBAction func southButton(_ sender: Any)
{
}
@IBAction func eastButton(_ sender: Any)
{
}
@IBAction func westButton(_ sender: Any)
{
}
//****************************************
//Setup for buttons go between these lines
//****************************************
}
尽管我的代码目前没有显示它,但我确实在 class 按钮中放置了打印值,只是为了查看当我 select a class 和我时这些值是否发生了变化已经看到按下按钮时它们确实发生了变化。我还查看了 ViewController 并更改了 finalCharacter 值,只是想看看这是否影响了什么,但事实并非如此。所以我有根据的猜测是问题必须在 ClassSelectionController 中。
所以主要问题是我将点击巫师玩家 class,我希望巫师的 class 统计数据会弹出(即 25、70、"Staff", 15), 但我只会得到 ClassSelectionController (0, 0, "", 0) 中的默认值。
这里发生了什么,你有多个 UIStoryboardSegue
命名为 "Character" 链接到每个按钮
因此,当您按下按钮时,会在操作按钮之前调用 Segue,此外还会再次调用 UIStoryboardSegue
(如果在 viewDidLoad
中放置调试器,您会看到它去了那里两次)。
解决方案
- 从按钮中删除所有
UIStoryboardSegue
链接 - 从
ClassSelectionController
到下一个ViewController
新建一个UIStoryboardSegue
命名为'Character'
您无需更改代码中的任何内容,但应添加安全检查
override func prepare(for segue: UIStoryboardSegue, sender: (Any)?)
{
if (segue.identifier == "Character") {
let vc = segue.destination as! ViewController
vc.finalCharacter = self.character
}
}