【问题标题】:CS193P - Adding cancel button to iOS calculatorCS193P - 向 iOS 计算器添加取消按钮
【发布时间】:2012-02-21 07:36:45
【问题描述】:

我最近开始在 iTunes U 上关注斯坦福大学关于 iPhone 开发的在线课程。

我现在正在为前几节课做家庭作业。我完成了构建基本计算器的演练,但现在我正在尝试第一个作业,但似乎无法解决。如下:

添加一个“C”按钮来清除所有内容(例如,视图中的显示、模型中的操作数堆栈、控制器中维护的任何状态等)。确保 3 7 C 5 导致 5 显示在显示屏上。您必须将 API 添加到您的模型以支持此功能。

我需要添加什么 API?

我试过这样的:

- (IBAction)CancelPressed {
    self.Display.text = 0;
}

我知道这是错误的。我需要一些指导。提前谢谢..对不起,如果这个问题很愚蠢..

【问题讨论】:

    标签: iphone objective-c cs193p


    【解决方案1】:

    我是这样做的:

    CalculatorViewController.m 中的代码:

    //********************************************************
    //
    //This method is called when the user presses the Clear
    //button (labeled "C").
    //
    //********************************************************
    
    - (IBAction)clearPressed {
        self.historyDisplay.text = @"";         //Clear history label
        self.display.text = @"0";               //Reset calculator display label to 0
        _userIsInTheMiddleOfTypingANumber = NO; //Reset the user tracking feature
        [self.brain clearStack];                //Calls method to "clear" the stack
    
        //The following line may not be needed depended on your implementation of the
        //decimal button. You may need something for your decimal implementation.
        _userAlreadyEnteredDecimal = NO;        //Reset the decimal boolean 
    }
    

    然后在 CalculatorBrain.m 中:

    //********************************************************
    //
    //"Clear" all values off of the stack.
    //
    //********************************************************
    - (void)clearStack
    {
        _operandStack = nil; //Deallocate instance of the stack
    }
    

    【讨论】:

      【解决方案2】:

      我也在 iTunesU 上浏览 2011 年秋季版本。这是我完成此操作的方法。

      - (IBAction)clearPressed {
          self.display.text = @"0";
          self.userIsInTheMiddleOfEnteringANumber = NO;
          self.brain = nil;
      }
      

      唯一的事情是我实际上不必将 API 添加到我的模型中。因为控制器有一个 CalculatorBrain 实例变量,所以我把它扔掉了,因为我们懒惰地实例化了我们的大脑吸气剂,所以下次我调用吸气剂时我会得到一个全新的(已经清除)。

      【讨论】:

        【解决方案3】:

        您基本上想要重置所有变量。假设您使用的是 UILabel,它将需要一个 NSString,因此您会更好:

        self.display.text = @"0";
        

        然后检查您拥有的所有其他属性和实例变量,然后将其设置为默认值。 任何作为对象的东西都想设置为零。因此,例如,如果您要存储任何字符串。以及您保留的任何数字,设置为 0。如果它们是浮点数,则设置为 0.0f。

        不确定这个计算器示例到底是什么,但希望这会让您朝着正确的方向前进。

        如果没有并且您需要更多帮助,请随时告诉我 :)

        【讨论】:

        • 非常感谢..这周我将尝试完成这项任务..当然,我会有问题...我会发布它们...希望您能帮助我...
        【解决方案4】:

        你也应该清除堆栈:

        - (IBAction)clearPressed {
            double result = [self.brain performOperation:@"C"];
        }
        

        并在performOperation中添加:

        else if ([operation isEqualToString:@"C"])
        {
            [self.operandStack removeAllObjects];
            result = 0;
        }
        

        【讨论】:

        • removeAllObjects 是 NSString 框架中的函数吗?
        • 不,它指的是你在CalculatorBrain中定义的堆栈。在演练中,这已被定义为 NSMutableArray。所以 removeAllObjects 会从这个 NSMutableArray 操作数栈中移除所有对象。
        【解决方案5】:

        我认为 cancelPressed 应该是这样的:

        - (IBAction)CancelPressed:(id)sender {
        
                double result = [self.brain performOperation:@"C"];
                NSString *resultString = [NSString stringWithFormat:@"%g",result];
                self.Display.text = resultString;
        
        }
        

        【讨论】:

          【解决方案6】:

          您的 CancelPressed:看起来不错。

          请注意,您可以删除通话中的 (id)sender。您不知道是哪个按钮发送了消息。

          你可以这样做(有点短):

          self.Display.text = @"";
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-10-29
            • 1970-01-01
            • 1970-01-01
            • 2021-03-23
            相关资源
            最近更新 更多