zoukankan      html  css  js  c++  java
  • 2015.12.29 iOS SimpleCalculator简单计算器

      这是开始写的第一个iOS程序。

    1.首先创建一个SingleViewApplication界面(iOS中),这个模式就是默认为我们提供了一个界面。

          

    2.更改项目的名称和icon图标

      ①info.plist文件—>bundle name—>填写自己工程的名字

      ②添加一张图片到这个位置,并且更名为icon.png这样app的图标就改好了。

          

      P.S. icon图标可以去https://www.iconfinder.com搜索相应地图标(不过有点还需要钱)。

    3.分析过程

      使用并得到UI(User Interface 用户界面)。

      ①实现点击功能:UIButton(按钮)

      ②实现显示内容功能:UILabel(文本标签)

      ③为什么能够显示相应的视图:UIWindow(窗口)

      ④界面(用户能够看到的画面):UIViewController

      ⑤如何实现上面的相应内容(画面版):storyboard

    4.如何实现

      △尺寸:iPhone5/5s: 320*568

          iPhone4/4s: 320*480

      ①设置背景颜色:Main.storyboard-->那个框框中,然后点击这个位置

           

      ②添加UILabel

        可以在右下角的这个地方搜索相应控件,直接拖拽到想要摆放的位置就可以。

          

          a.可以自由拖动,调整视图在界面上的大小

          b.改变alignment属性 设置居右对齐

          c.设置font属性 改变文字的显示大小

          d.background 设置背景颜色

          e.text 设置显示的文字

            

      ③添加用于与用户进行交互的按钮UIButton,同样是在右下角进行搜索Button。

      ④如何接收用户的点击事件

        .storyboard里面的每一个界面都应该有相应的控制器和它相关联一个界面就是一个UIViewController我们这个程序只有一个界面,storyboard里面的界面和viewController相关联

        .storyboard里面负责界面的布局viewController负责代码逻辑IBAction(IB interface builder)用于关联storyboard里面控件的事件

        .可以按住Ctrl进行拖拽。

            

      在关联中如何获取storyboard里面的UI对象(通俗点,怎么能通过代码来实现UI对象的功能)

        .IBOutlet 用于关联storyboard里面控件本身

        也可以按住Ctrl进行拖拽,将UILabel拖拽到ViewController.m中。(只用当"insert"提示显示出来的时候才是正确的)

            

      ⑥如何使用一个数字来区别每一个UI控件

        每一个UI控件都有一个tag属性值,默认值为0。

          

      当UI控件已经准备完毕之后开始写代码。是在ViewController.m中进行编写。

      

      1 #import "ViewController.h"
      2 
      3 typedef enum{
      4     kStatusNum,
      5     kStatusOperation
      6 }kStatus;
      7 
      8 typedef enum{
      9     kOperationTypeAdd = 1,
     10     kOperationTypeMinus,
     11     kOperationTypeMultiply,
     12     kOperationTypeDevide,
     13     kOperationTypeEqual,
     14     kOperationTypeNone,
     15     kOperationTypeSign = 11,
     16     kOperationTypePercent,
     17     kOperationTypePoint
     18 }kOperationType;
     19 
     20 @interface ViewController ()
     21 @property (weak, nonatomic) IBOutlet UILabel *resultLabel;
     22 @property (assign, nonatomic) double firstParameter;
     23 @property (assign, nonatomic) kOperationType lastOperation, isOtherOperation;
     24 @property (assign, nonatomic) kStatus status;
     25 @end
     26 
     27 @implementation ViewController
     28 
     29 - (void)viewDidLoad {
     30     [super viewDidLoad];
     31     // Do any additional setup after loading the view, typically from a nib.
     32     //赋初值
     33     self.lastOperation = kOperationTypeNone;
     34     self.status = kStatusNum;
     35     self.isOtherOperation = kOperationTypeNone;
     36 }
     37 
     38 - (void)didReceiveMemoryWarning {
     39     [super didReceiveMemoryWarning];
     40     // Dispose of any resources that can be recreated.
     41 }
     42 
     43 //数字键
     44 - (IBAction)numButtonDidClicked:(UIButton *)sender {
     45     
     46     NSMutableString *showNum = [NSMutableString stringWithCapacity:0];
     47     //进行判断,是输入数字并且上一次操作不是正负
     48     if (self.status == kStatusNum && self.isOtherOperation != kOperationTypeSign) {
     49         //进行显示的拼接
     50         [showNum appendFormat:@"%@%@", self.resultLabel.text, sender.titleLabel.text];
     51         //判断第一个字符是“0”切第二个字符不为“.”的情况
     52         BOOL compareResultA, compareResultB;
     53         
     54         compareResultA = [self comparationIsEqual:[showNum substringToIndex:1] anotherNSString:@"0"];
     55         compareResultB = [self comparationIsEqual:[showNum substringWithRange:NSMakeRange(1, 1)] anotherNSString:@"."];
     56         //这种情况需要删除开头的“0”
     57         if (compareResultA == YES && compareResultB == NO) {
     58             [showNum deleteCharactersInRange:NSMakeRange(0, 1)];
     59         }
     60         
     61     } else{
     62         [showNum appendFormat:@"%@", sender.titleLabel.text];
     63         self.status = kStatusNum;
     64         self.isOtherOperation = kOperationTypeNone;
     65     }
     66     
     67     //显示结果
     68     self.resultLabel.text = showNum;
     69 }
     70 
     71 - (BOOL)comparationIsEqual:(NSString *)StringA anotherNSString:(NSString *)StringB{
     72     if ([StringA isEqualToString:StringB]) {
     73         return YES;
     74     } else{
     75         return NO;
     76     }
     77 }
     78 
     79 //+ - * / = 键
     80 - (IBAction)operationButtonDidClicked:(UIButton *)sender {
     81     if (self.status != kStatusOperation) {
     82         self.status = kStatusOperation;
     83         
     84         //有两种情况
     85         //1.第一次按操作,只需要保存这次操作
     86         if (self.lastOperation != kOperationTypeNone) {
     87             //2.前面有操作需要计算,保存这次操作
     88             [self calculate];
     89         } else{
     90             //第一个参数输入完毕 保存
     91             self.firstParameter = [self.resultLabel.text doubleValue];
     92         }
     93     }
     94     
     95     //保存这一次操作
     96     if (sender.tag == kOperationTypeEqual) {
     97         self.lastOperation = kOperationTypeNone;
     98     } else{
     99         self.lastOperation = (kOperationType)sender.tag;
    100     }
    101 }
    102 
    103 //清零
    104 - (IBAction)clearButtonDidClicked:(UIButton *)sender {
    105     self.resultLabel.text = @"0";
    106     self.firstParameter = 0;
    107     self.lastOperation = kOperationTypeNone;
    108     self.status = kStatusNum;
    109     self.isOtherOperation = kOperationTypeNone;
    110 }
    111 
    112 //计算结果
    113 - (void)calculate{
    114     //获取第二个参数
    115     double secondParameter = [self.resultLabel.text doubleValue];
    116     double result;
    117     
    118     switch (self.lastOperation) {
    119         case kOperationTypeAdd:
    120             result = self.firstParameter + secondParameter;
    121             break;
    122         case kOperationTypeMinus:
    123             result = self.firstParameter - secondParameter;
    124             break;
    125         case kOperationTypeMultiply:
    126             result = self.firstParameter * secondParameter;
    127             break;
    128         case kOperationTypeDevide:
    129             result = self.firstParameter / secondParameter;
    130             break;
    131         default:
    132             break;
    133     }
    134     //显示最终结果
    135     self.resultLabel.text = [NSString stringWithFormat:@"%g", result];
    136     
    137     //当前结果就是写一次的参数值
    138     self.firstParameter = result;
    139     
    140     //更改操作符
    141     self.lastOperation = kOperationTypeNone;
    142 }
    143 
    144 //± % 键
    145 - (IBAction)otherOperationButtonDidClicked:(UIButton *)sender {
    146     double temp;
    147     //判断按键
    148     switch (sender.tag) {
    149         case kOperationTypeSign:
    150             temp = [self.resultLabel.text doubleValue];
    151             self.resultLabel.text = [NSString stringWithFormat:@"%g", temp * (-1)];
    152             self.firstParameter = [self.resultLabel.text doubleValue];
    153             self.isOtherOperation = kOperationTypeSign;
    154             break;
    155         case kOperationTypePercent:
    156             temp = [self.resultLabel.text doubleValue];
    157             self.resultLabel.text = [NSString stringWithFormat:@"%g", temp / 100];
    158             
    159             break;
    160         default:
    161             break;
    162     }
    163 }
    164 
    165 //. 键
    166 - (IBAction)pointButtonDidClicked:(UIButton *)sender {
    167     if (self.isOtherOperation != kOperationTypePoint) {
    168         self.resultLabel.text = [NSString stringWithFormat:@"%@.", self.resultLabel.text];
    169         self.isOtherOperation = kOperationTypePoint;
    170     }
    171     
    172 }
    173 
    174 
    175 @end
    SimpleCalculator

    请教一下各位大神,小数点的问题有什么更好地想法没有,我觉得自己的解决方案有些繁琐,并不是最简便的。谢谢。Orz~

          

  • 相关阅读:
    【第三章】DI的配置使用(一)
    【第二章】IoC的配置使用(一)
    【第二章】IoC的基础与详解(一)
    【第一章】 Spring概述(二)
    【第一章】 Spring概述(一)
    数据库分库分表思路
    Java的内存模型JVM
    Servlet 单例多线程详细解释
    三极管
    续流二极管
  • 原文地址:https://www.cnblogs.com/immustard/p/5087092.html
Copyright © 2011-2022 走看看