使用NSStepper设置上限值而不是递增值

时间:2012-07-18 09:20:50

标签: objective-c cocoa

我正在使用NSStepperNSTextField。用户可以使用文本字段设置值,也可以使用NSStepper更改值。我将使用以下示例引用我的问题:
假设我的步进器的当前值是4并且步进器的增量值是2: enter image description here

单击NSStepper上的向上箭头后,该值变为:
enter image description here

现在假设当前值为4.5,即 enter image description here

使用向上箭头后,该值变为:
enter image description here

我要求的是当当前值为4.5时,在使用向上箭头后,该值变为 6 而不是6.5

非常感谢任何实现这一目标的想法!

2 个答案:

答案 0 :(得分:1)

  

我需要的是当当前值为4.5时,使用后   向上箭头,该值变为6而不是6.5

很难确切地说出你在问什么但是猜测:听起来你想要删除数字的小数部分并按你定义的步数增加(2)。您可以通过floor()功能执行此操作。 See here for other Objective-C math functions

  

double floor(double) - 删除参数的小数部分

NSLog(@"res: %.f", floor(3.000000000001)); 
//result 3 
NSLog(@"res:%.f", floor(3.9999999));
//result 3

答案 1 :(得分:0)

如果我理解你想要的东西,这段代码会给你下一个偶数(根据你点击的箭头向上或向下),但仍允许你在文本字段中输入非整数。 tf和stepper是IBOutlets,num是一个属性(浮点数),用于在单击箭头之前跟踪步进器的值,以便您可以与新数字进行比较,以查看是否单击了向上或向下箭头。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    self.num = 0;
    self.tf.intValue = 0; //the stepper is set to 0 in IB
}


-(IBAction)textFieldDidChange:(id)sender {
    self.num = self.stepper.floatValue = [sender floatValue];
}


-(IBAction)stepperDidChange:(id)sender {
    if (self.num < self.stepper.floatValue) { //determines whether the up or down arrow was clicked
        self.num = self.stepper.intValue = self.tf.intValue = [self nextLargerEven:self.num];
    }else{
        self.num = self.stepper.intValue = self.tf.intValue =[self nextSmallerEven:self.num];
    }
}

-(int)nextLargerEven:(float) previousValue {
    if ((int)previousValue % 2 == 0) {
        return (int)previousValue + 2;
    }else
        return (int)previousValue + 1;
}


-(int)nextSmallerEven:(float) previousValue {
    if ((int)previousValue % 2 == 0) {
        if ((int)previousValue == previousValue) {
            return (int)previousValue - 2;
        }else{
            return (int)previousValue;
        }
    }else
        return (int)previousValue - 1; 
}