《Swift iOS应用开发实战》——3.2Calculator项目中的控制器

简介:

本节书摘来自华章计算机《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所示。

image

本章我们会完成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所示。


image


步骤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中所有的实例变量进行重置,便于重新计算。
构建并运行应用程序,此时你可以使用这个计算器进行简单的运算。

相关文章
|
1月前
|
算法 计算机视觉 iOS开发
iOS 实时图像处理技术:使用 Core Image 和 Metal 进行高效滤镜应用
【4月更文挑战第8天】 在移动设备上实现高效的图像处理功能是现代应用程序开发中的一个关键需求。苹果的iOS平台提供了Core Image和Metal两大技术,它们为开发者提供了强大的工具来实现复杂的图像处理任务。本文将探讨如何使用Core Image进行基础图像处理,并结合Metal的性能优势,开发出一个自定义的实时图像滤镜。我们将通过创建一个能够动态调整参数并且具有实时反馈效果的滤镜来演示这一过程。
|
1月前
|
算法 计算机视觉 iOS开发
iOS 实时图像处理技术:Core Image 框架的应用
【4月更文挑战第8天】 在移动设备上实现高效的图像处理功能,对于提升用户体验和扩展应用程序能力至关重要。苹果公司的iOS平台提供了强大的Core Image框架,它允许开发者以高效和直观的方式执行复杂的图像处理任务。本文将深入探讨Core Image框架的关键特性,并通过实例演示如何在iOS应用中集成实时图像处理功能,不仅提高性能,同时保持了电池寿命的优化。我们将重点讨论面部识别、滤镜应用和性能优化等关键技术点,为读者提供一份全面的iOS图像处理指南。
|
13天前
|
存储 Swift iOS开发
使用Swift开发一个简单的iOS应用的详细步骤。
使用Swift开发iOS应用的步骤包括:创建Xcode项目,设计界面(Storyboard或代码),定义数据模型,实现业务逻辑,连接界面和逻辑,处理数据存储(如Core Data),添加网络请求(必要时),调试与测试,根据测试结果优化改进,最后提交至App Store或其它平台发布。
32 0
|
13天前
|
机器学习/深度学习 数据采集 TensorFlow
【Swift开发专栏】Swift与机器学习:构建智能应用
【4月更文挑战第30天】本文探讨了使用Swift开发机器学习应用,分为三个部分:机器学习基础(定义、类型及应用),Swift在机器学习中的作用(Swift for TensorFlow、Core ML及性能优势),以及实践技巧(数据预处理、特征工程、模型训练与部署、性能优化和用户界面集成)。通过学习,开发者能掌握构建智能应用的技能,利用Swift的性能和安全性提升应用效率。随着深入学习,开发者可探索更多高级特性和技术,如深度学习和复杂数据分析。
|
13天前
|
存储 API Swift
【Swift开发专栏】Swift函数与闭包的实战应用
【4月更文挑战第30天】本文介绍了 Swift 中函数和闭包的实战应用。首先,函数的基本使用包括定义、参数与返回值、函数类型以及高级技巧如嵌套函数。接着,讨论了闭包的语法,包括无名函数、作为函数参数、简写形式和尾随闭包。最后,展示了函数和闭包在实战中的应用,如排序过滤集合和处理异步任务的回调。
|
13天前
|
缓存 Swift UED
【Swift开发专栏】Swift应用的启动优化
【4月更文挑战第30天】本文介绍了Swift应用启动优化技巧,包括优化代码结构和资源加载。建议减少启动时加载的代码,采用延迟加载、分模块加载和懒加载策略;优化初始化代码,注意顺序、异步初始化和避免全局初始化。对于资源,压缩图片、使用矢量图和图片缓存可提升加载速度。文中还提供了实战案例,展示如何在代码中实施这些优化措施。
|
13天前
|
安全 Swift iOS开发
【Swift 开发专栏】Swift 与 UIKit:构建 iOS 应用界面
【4月更文挑战第30天】本文探讨了Swift和UIKit在构建iOS应用界面的关键技术和实践方法。Swift的简洁语法、类型安全和高效编程模型,加上与UIKit的紧密集成,使开发者能便捷地创建用户界面。UIKit提供视图、控制器、布局、动画和事件处理等功能,支持灵活的界面设计。实践中,遵循设计原则,合理组织视图层次,运用布局和动画,以及实现响应式设计,能提升界面质量和用户体验。文章通过登录、列表和详情界面的实际案例展示了Swift与UIKit的结合应用。
|
13天前
|
缓存 算法 Swift
【Swift 开发专栏】Swift 应用的性能优化技巧
【4月更文挑战第30天】本文探讨了Swift应用性能优化,强调理解性能瓶颈、针对性优化和平衡性能与代码质量的重要性。提出优化技巧,包括选择合适数据结构、避免不必要的对象创建、使用缓存、优化算法、减少计算、管理内存、利用多核处理、优化网络请求和界面渲染。通过实际案例分析证明了这些方法能有效提升应用性能和用户体验。开发者应持续关注新技术和方法,以适应不断提升的性能要求。
|
13天前
|
存储 安全 Swift
【Swift 开发专栏】使用 Swift 开发一个简单的 iOS 应用
【4月更文挑战第30天】本文介绍了使用 Swift 开发简单 iOS 待办事项应用的步骤。首先,阐述了 iOS 开发的吸引力及 Swift 语言的优势。接着,详细说明了应用的需求和设计,包括添加、查看和删除待办事项的功能。开发步骤包括创建项目、界面搭建、数据存储、功能实现,并提供了相关代码示例。最后,强调了实际开发中需注意的细节和优化,旨在帮助初学者掌握 Swift 和 iOS 开发基础。
|
20天前
|
搜索推荐 API iOS开发
利用SwiftUI构建动态iOS天气应用
【4月更文挑战第23天】 在本文中,我们将探讨如何使用SwiftUI框架实现一个动态的iOS天气应用程序。将重点介绍如何通过集成第三方天气API、设计响应式用户界面以及应用数据绑定技术来增强用户体验。我们的目标是创建一个能够根据当前位置实时更新天气信息的应用,并确保其界面简洁、易用且美观。
16 0