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

Objective c 使用NSStepper设置上限值而不是递增值,objective-c,cocoa,Objective C,Cocoa,我正在使用NSStepper和NSTextField。用户可以使用文本字段设置值,也可以使用NSStepper更改值。我将用下面的例子引用我的问题: 假设我的步进器的当前值为4,步进器的增量值为2: 单击NSStepper上的向上箭头后,该值变为: 现在假设当前值为4.5,即: 使用向上箭头后,该值变为: 我需要的是,当当前值为4.5时,在使用向上箭头后,该值变为6,而不是6.5 我们高度赞赏任何实现这一目标的想法 如果我了解您想要什么,此代码将为您提供下一个偶数(向上或向下,取决于您单

我正在使用
NSStepper
NSTextField
。用户可以使用文本字段设置值,也可以使用NSStepper更改值。我将用下面的例子引用我的问题:
假设我的步进器的当前值为4,步进器的增量值为2:

单击NSStepper上的向上箭头后,该值变为:

现在假设当前值为4.5,即:

使用向上箭头后,该值变为:

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


我们高度赞赏任何实现这一目标的想法

如果我了解您想要什么,此代码将为您提供下一个偶数(向上或向下,取决于您单击的箭头),但仍允许您在文本字段中输入非整数。tf和stepper是IBOutlets,num是一个属性(float),在单击箭头之前跟踪stepper的值,以便与新数字进行比较,查看是否单击了向上或向下箭头

- (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; 
}
-(无效)应用程序设计完成启动:(NSNotification*)通知{
self.num=0;
self.tf.intValue=0;//步进器在IB中设置为0
}
-(iAction)textFieldDidChange:(id)发件人{
self.num=self.stepper.floatValue=[sender floatValue];
}
-(iAction)步进数据更改:(id)发送方{
if(self.num
我需要的是,当当前值为4.5时,使用 向上箭头,值变为6,而不是6.5

很难说清楚你在问什么,但是猜测一下:听起来好像你想删除数字的小数部分,然后按你定义的步长(2)递增。您可以通过
floor()
功能执行此操作

双楼层(双)-删除参数的小数部分


&@Skinytod很抱歉这个问题不清楚。我已经实现了同步b/w文本字段和步进器。问题是:如果
minvalue=0
maxValue=100和
increment=2
,则步进器的可能值为:0,2,4,6,….96,98100。但是,如果用户设置
textField=0.5`,步进器的值也会变为0.5(因为文本字段和步进器是同步的),因此单击步进器,将显示的值是:0.5、2.5、4.5、…、96.5、88.5这是我想要抑制的行为,我希望值变为0.5、2、4、…@etheory,我不明白这怎么会像你想的那样。您可以做的一件事是,当您将步进器同步到文本字段时,计算下一个较低的偶数,因此如果用户输入3.5,您可以将步进器设置为2。如果用户点击向上箭头得到4(这是我想你想要的),那么这就行了,但是如果他点击向下箭头,你会得到0,我想这不是你想要的——如果不了解用户的想法,就没有办法做到这一点。你有没有理由不想强迫用户在文本字段中输入偶数?实际上,我需要两种功能,标准功能和我在上面的评论中提到的功能。在我的应用程序中,我需要在一些地方使用标准实现,在另一些地方使用非标准实现。有什么方法可以扩展NSSlider并覆盖一些东西来实现这一点吗?我在上一篇评论中想说的是,使用绑定或takeDoubleValueFrom之类的东西来实现这一点并不容易,但这是可以做到的。请参阅我编辑的答案。
NSLog(@"res: %.f", floor(3.000000000001)); 
//result 3 
NSLog(@"res:%.f", floor(3.9999999));
//result 3