009 将targetValue放在 Label 上展示给用户

上一节

targetValue放在 Label 上展示给用户


在前面的教程里,你已经解决了如何生成随机数,如何将它存入变量,下面我们来看如何把它呈现在 Label 上,然后展示给玩家看,不然玩家怎么知道自己应该将滑块大概移动到哪里呢?

在 storyboard 的设计里,你早已经将目标值的 Label 标签设计好了,但是你还要做两件事:

  1. 给 Label 创建一个 outlet ,以方便发送信息。
  2. 让Label 可以显示下一个数字。

这和之前做的会很相似,添加一个@IBOutlet变量,然后你就可以在 view controller 里的任何地方调用它了。

  • ViewController.swift中添加下面的语句。
@IBOutlet weak var targetLabel: UILabel!
  • Main.storyboard中点击选中Label(那个在最上面一行写着 100 的标签)

  • Connection inspector 中拖拽New Referenceing OutletView Controller

009 将targetValue放在 Label 上展示给用户_第1张图片
  • 在弹出来的选择框里选择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的时候,整个方法的名称就已经全出现在智能感知的区域了,这时候只要方法的名称对,你完全可以直接按下回车键,就可以更加快捷的写代码了。

009 将targetValue放在 Label 上展示给用户_第2张图片
  • 运行 App,这时候你就可以看到由随机数生成的目标值显示在屏幕上,基本可以算得上一个可玩的游戏啦。
009 将targetValue放在 Label 上展示给用户_第3张图片

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 中被看到,也不能当做行动方法了。

这一节就到这里了,下一节我们将花很长的篇幅来讲计算分数的相关算法和想法。

下一节

你可能感兴趣的:(009 将targetValue放在 Label 上展示给用户)