将targetValue
放在 Label 上展示给用户
在前面的教程里,你已经解决了如何生成随机数,如何将它存入变量,下面我们来看如何把它呈现在 Label 上,然后展示给玩家看,不然玩家怎么知道自己应该将滑块大概移动到哪里呢?
在 storyboard 的设计里,你早已经将目标值的 Label 标签设计好了,但是你还要做两件事:
- 给 Label 创建一个 outlet ,以方便发送信息。
- 让Label 可以显示下一个数字。
这和之前做的会很相似,添加一个@IBOutlet
变量,然后你就可以在 view controller 里的任何地方调用它了。
- 在ViewController.swift中添加下面的语句。
@IBOutlet weak var targetLabel: UILabel!
-
在Main.storyboard中点击选中Label(那个在最上面一行写着 100 的标签)
-
在Connection inspector 中拖拽New Referenceing Outlet 到 View Controller
![](https://img.haomeiwen.com/i694607/569cb14dd60619ca.png)
-
在弹出来的选择框里选择targetValue,至此连接就已经完成啦。
-
然后在ViewController.swift中的
startNewRound()
方法下方新增加一个方法,方法内容如下语句:
func updateLabels() {
targetLabel.text = String(targetValue)
}
之所以要把这个逻辑放进一个方法里,是因为在后面的地方还要用到。合理的方法名称能让你对方法的作用一目了然,而这个方法恰恰是把目标值赋值给显式目标值的 Label 文本。
在updateLabels()
方法中的文本对你来说可能已经不会觉得意外和困惑,你大概也猜到了为什么代码不是下面的样子:
targetLabel.text = targetValue
原因就是这两者的数据类型不符合,targetLabel.text
是 String 类型,但是targetValue
是 Int 类型,所以要经过一个类型的转换,将 Int 类型转换为 String 类型。转换的方法就是: 将你想转换的类型放在括号里,括号前写你想转换的数据类型关键词。
当然发挥你的想象力,用我们之前的知识,这样的转换方式也 OK 哦
targetLabel.text = "\(targetValue)"
至于你喜欢那个类型,完全取决于你的喜好。
updateLabels()
是一个普通的方法,不涉及任何 UI 控件,也不涉及任何动作方法,所以不需要添加像 @IBAction
等任何类型的前缀。
需要调用此方法的地方应该是startNewRound()
方法之后,因为每一个新的轮次都要计算并显示出来新的目标值,所以将updateLabels()
方法至于viewDidLoad()
方法和showAlert()
方法中startNewRound()
方法之后。代码如下:
override func viewDidLoad() {
super.viewDidLoad()
startNewRound()
updateLabels() // add this line }
@IBAction func showAlert() {
. . .
startNewRound()
updateLabels() // add this line
}
你在写updateLabel()
方法时候,刚刚敲出upd的时候,整个方法的名称就已经全出现在智能感知的区域了,这时候只要方法的名称对,你完全可以直接按下回车键,就可以更加快捷的写代码了。
![](https://img.haomeiwen.com/i694607/72b35cc0db6f205f.png)
- 运行 App,这时候你就可以看到由随机数生成的目标值显示在屏幕上,基本可以算得上一个可玩的游戏啦。
![](https://img.haomeiwen.com/i694607/29e9d76b452de2a5.png)
Action 方法和普通方法
到底 Action 方法和普通方法有什么区别呢?抱歉,没啥区别。要说实在有啥区别的话,那可能就是多了一个 @IBAction
的标识符了,这个标识符是允许 Interface Builder 可以检查到这个方法,方便你和 按钮啊,Label 和 slider 等等方便的连接。
还有其它方法,比如viewDidLoad()
,也没有@IBAction
的标识。这是一件好事,因为并不是所有的方法都需要和按钮等 UI 控件挂钩。
这就是一个简单的 Action 方法的模型
@IBAction func shwoAlert()
你也可以添加参数,在参数变化的时候触发方法:
@IBAction func sliderMoved(_ slider: UISlider)
@IBAction func buttonTapped(_ button: UIButton)
但是下面的方法就不能在 Interface Builder 中被看到,也不能当做行动方法了。
这一节就到这里了,下一节我们将花很长的篇幅来讲计算分数的相关算法和想法。
网友评论