本节书摘来自华章计算机《Swift iOS应用开发实战》一书中的第3章,第3.2节,作者:刘铭 著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
3.2Calculator项目中的控制器
在Calculator项目中,ViewController.swift文件中所定义的ViewController类就是一个视图控制器,与它关联的视图就是Main.storyboard文件中ViewController场景里面的View,如图3-2所示。如果我们选择故事板中ViewController场景中的控制器,然后按Command+Option+3快捷键切换到标识检视窗,就会看到Custom Class部分的Class被设置为ViewController,它代表与该视图关联的控制器是ViewController.swift中的ViewController类,如图3-3所示。
本章我们会完成ViewController视图控制器中的全部代码,这些代码用于实现基本的计算功能。在第2章中已经完成了故事板中视图对象的创建。接下来,主要关注控制器和数据模型方面。
3.2.1实现计算器运算符的相关代码
Calculator项目可以实现简单的加、减、乘、除运算,因为与数字按钮的实现功能不同,所以我们需要单独为这些运算按钮创建IBAction方法。但是,在此之前我们还需要对第2章的两个方法稍加改动。
步骤1修改ViewController类中的buttonTap方法如下面这样:
@IBAction func buttonTap(sender: UIButton) {
// labelResult中默认显示0,如果开始输入数字,则先清除0
if labelResult.text == "0" || (isSecond && secondOperand == 0.0) {
labelResult.text = ""
}
// 将用户录入的数添加到labelResult中
labelResult.text = labelResult.text! + sender.titleLabel!.text!
if isSecond {
secondOperand = NSString(string:labelResult.text!).doubleValue
}else {
// 将labelResult中的字符串转化为双精度数
firstOperand = NSString(string:labelResult.text!).doubleValue
}
}
修改了buttonTap方法以后,它可以根据isSecond变量来区分用户输入的是第一操作数还是第二操作数。
步骤2修改ViewController类中的decimalPointTap方法如下面这样:
@IBAction func decimalPointTap() {
// 如果没有输入小数点则执行下面的操作
if !decimalPointFlag {
labelResult.text = labelResult.text! + "."
if isSecond {
secondOperand = NSString(string:labelResult.text!).doubleValue
}else {
firstOperand = NSString(string:labelResult.text!).doubleValue
}
decimalPointFlag = !decimalPointFlag
}
}
步骤3在项目导航中选中Main.storyboard,然后将编辑区切换到助手编辑器模式,为ViewController场景中的加号按钮添加方法名为:operatorTap的IBAction方法。
步骤4在弹出的关联设置面板中,Connection设置为Action,Name设置为operatorTap,Type设置为UIButton,Event设置为Touch Up Inside,Arguments设置为Sender,如图3-4所示。
步骤5为operatorTap方法添加下面的代码:
@IBAction func operatorTap(sender: UIButton) {
if firstOperand != 0 {
isSecond = true
decimalPointFlag = false
switch sender.titleLabel!.text!{
case "+":
operatorFlag = "+"
case "-":
operatorFlag = "-"
case "?:
operatorFlag = "*"
case "?:
operatorFlag = "/"
default:
operatorFlag = ""
}
}
}
首先,operatorTap方法会让isSecond的值为真,代表用户后面再输入的数值是给第二操作数的,与此同时还会将decimalPointFlag的值设置为假。然后该方法根据用户点击的操作符来设置operatorFlag的值。
步骤6在助手编辑器模式下,将减号与operatorTap方法进行IBAction关联。在减号上按住鼠标右键,拖曳至ViewController类的operatorTap方法上面即可。以此类推,再将乘号和除号与operatorTap方法进行IBAction关联。
3.2.2实现计算结果的相关代码
接下来我们将为等号(=)按钮建立IBAction关联,该方法的主要功能就是当用户点击等号按钮以后,使用操作符计算两个操作数的结果。
步骤7在项目导航中选中Main.storyboard,然后将编辑区切换到助手编辑模式,为ViewController场景中的等号按钮添加方法名为:resultTap的IBAction方法。
步骤8在弹出的设置面板中,Connection设置为Action,Name设置为resultTap,Type设置为UIButton,Event设置为Touch Up Inside,Arguments设置为None。
步骤9为resultTap方法添加下面的代码:
@IBAction func resultTap() {
// 确保第二操作数有值
if isSecond {
// 除数不能为0
if operatorFlag == "/" && secondOperand == 0{
println("Error:除数不能为0.")
return
}
var result: Double = 0.0
switch operatorFlag {
case "+":
result = firstOperand + secondOperand
case "-":
result = firstOperand - secondOperand
case "*":
result = firstOperand * secondOperand
case "/":
result = firstOperand / secondOperand
default:
result = 0.0
}
labelResult.text = result.description
println("第一操作数:\(firstOperand)")
println("操作符:\(operatorFlag)")
println("第二操作数:\(secondOperand)")
println("结果:\(result)")
}
}
步骤10再为ViewController场景中的AC按钮添加IBAction方法。Connection设置为Action,Name设置为clear,Type设置为UIButton,Event设置为Touch Up Inside,Arguments设置为None。
步骤11为clear方法添加下面的代码:
@IBAction func clear() {
labelResult.text = "0" // Label对象显示0
firstOperand = 0.0 // 第一操作数清零
secondOperand = 0.0 // 第二操作数清零
decimalPointFlag = false // 小数点标记设置为假
isSecond = false // 第二操作数标记设置为假
operatorFlag = "" // 操作符清空
}
当用户点击AC按钮以后,clear方法会将ViewController中所有的实例变量进行重置,便于重新计算。
构建并运行应用程序,此时你可以使用这个计算器进行简单的运算。