【问题标题】:Making memory functions buttons for a calculator app为计算器应用程序制作记忆功能按钮
【发布时间】:2012-11-26 22:39:03
【问题描述】:

我正在制作一个计算器应用程序,并想制作两个记忆功能按钮
(“添加到记忆”或“记住”和“显示记住的”或“告诉”)

我在主标签上获取当前值的方式是

double currentValue = [screenLabel.text doubleValue];    

基本上,我怎样才能获得某种可以让我制作的内存缓存

  • 第一个按钮,清除其缓存的特殊内存,读取标签并根据需要存储它,但不是永久的

  • 第二个按钮,从缓存中读取存储的值并显示它,如果没有存储值则显示 0

?

【问题讨论】:

  • 您的问题到底是什么?您几乎不希望我们编写您的代码。一定有一些特定的问题,或者可能是其中的一些问题。你不知道如何将按钮与方法关联起来,以便在按下按钮时执行一些代码吗?或者您不知道如何存储一些代表计算器内存值的数字?还是不知道如何设置标签的文字?
  • @ValKalinic - 你的问题还不清楚。你想要的东西在你的程序中存储一个值但不是永久的并且从零开始,double memoryValue = 0; 显然是这样做的,所以这可能不是你要问的。
  • 对不起,我仍然没有得到你想要的。因此,即使应用程序终止并稍后重新启动,您也在寻找能够保留其内容的持久存储?您要存储的只是这个数字?
  • @ValKalinic 顺便说一句,您问的是计算器上的“记忆”按钮:但是,如果您对此有疑问,我真的很想知道您如何处理一系列用户输入,例如“2 + 8 * 5”。正确答案是 42(因为您保存 2,乘以 8 乘以 5,然后将两者加回乘积)。从UILabel 获取值是行不通的。您需要丰富的模型结构来存储此类信息。如果你支持像“6 * (5 + (7 / (4.5 - 1)))”这样的计算,它会变得更加有趣,这很快就会需要像 nmock 的堆栈概念这样的东西。
  • @Rob,我猜 Val 正在尝试扩展他的第一个教程/示例代码并试图找到这种方式,尽管它没有理解一些 Objective-c 的基础知识。如果我是对的,那么您在下面的答案就是他正在寻找的答案,而 CRD 的答案也指向了正确的方向。 Life2Enjoy7 的答案太过分了(我的观点)。但是一个 NSDictionary 可以用作一些快速n-dirty的方式来使一个或手充满数据的持久性。我正在考虑 writeToFile 和 dictionaryWithContentsOfFile 方法。

标签: objective-c ios calculator


【解决方案1】:

正如其他人所建议的那样,您需要一些模型结构(例如一些类属性)来跟踪您在计算中的位置。但是,如果您需要跟踪计算器的内存寄存器,您可能有如下属性:

@property (nonatomic) double memoryValue;

因此,您只需获取该属性,例如memoryValue,根据用户是否点击 m+m- kbd>、mcmr。我个人什至会考虑使用NSNumber 属性,但我认为您不需要去那里。

也许我不明白你的问题。


我不得不承认,我更担心你从screenLabel.text 获取currentValue 的代码行。您确实想要从用户界面控件(如UILabel)检索应用程序操作所固有的数据,该控件专为信息呈现而设计。这意味着对如何设计 MVC 或 Model-View-Controller 应用程序存在根本性的混淆。驱动计算的值(例如当前值、内存值等)是 模型 的一部分(可能存储为某些model 对象的属性)。表示当前计算值的UILabel视图的一部分。

使用UILabel视图的一部分)来驱动计算并不是一个好主意。您的应用应该为应用的数据/操作维护一个 model,而 view 应该只是该 model 的呈现(而不是另一个方式)。

计算器应用程序是此处实际考虑的一个很好的例子。例如,您的计算器可能具有“科学/指数符号模式”(其中 1,200,000,000 可能显示为“1.2e9”)。或者它可能用逗号显示数值作为千位分隔符(其中一百万显示为“1,000,000.00”)。 UILabeltext 属性的格式可能由多种不同的因素驱动,当使用 double 值进行计算时,您真的不必担心字符串格式。

另一个很好的例子是显示的位数是应用程序是横向(我们有很多小数位的空间)还是纵向(更少的空间,因此显示的小数位更少)的函数。该应用程序不应该仅仅因为在纵向屏幕上显示它们的空间更少而记住更少的数字。底层 model 中的实际计算值不应随着 view 用户界面的变化而变化。而且,无论如何,model 可能总是会使用更多的“有效数字”,而这些“有效数字”是您希望在用户界面中呈现的。

但希望这些示例能够让您了解应用的模型视图之间的区别。简而言之,从UILabels 检索值是不明智的。在您的应用的模型中保留真实值(没有双关语)。

【讨论】:

    【解决方案2】:

    模型中的堆栈数据对象将能够将值保存在内存中。

    查看此类别: http://saturnboy.com/2011/02/stack-queue-nsmutablearray/

    【讨论】:

      【解决方案3】:

      仍在猜测您的问题到底是什么,这里是您所问问题的答案...

      你的计算器大概有一个加法按钮,加法需要两个操作数。您的问题表明其中一个以文本形式存储在 screenLabel 中,以数字形式存储在 currentValue 中。另一个在哪里?将您记忆的值存储在存储第二个值的同一对象中的变量中。

      例如你会有这样的东西:

      @implementation MyCalculator
      {
         double currentValue;
         double previousValue;
         double memoryValue;
         ...
      }
      
      ...
      
      @end
      

      【讨论】:

        【解决方案4】:

        使用 NSMutableDictionary,您的第一个按钮将设置ObjectForKey,另一个按钮将删除ObjectForKey。

        您还可以使用此字典的一个实例设置一个单例类,以使其可用于其他类。取决于你的结构。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-05-01
          • 1970-01-01
          • 2012-11-14
          • 1970-01-01
          • 2014-08-29
          • 1970-01-01
          • 2016-09-28
          • 1970-01-01
          相关资源
          最近更新 更多