将NSStepper与NSTextField集成

Car*_*osa 15 user-interface cocoa

我需要将NSTextField与NSStepper一起作为一个控件,以便我可以通过直接在文本字段上更改它或使用步进向上/向下箭头来编辑整数值.

在IB中,我添加了这两个控件,然后将NSStepper的takeIntValueFrom连接到NSTextField,这使得每次单击步进箭头时文本值都会更改.问题是,如果我编辑文本字段然后再次单击步进器,它将忘记我手动编辑的值并使用步进器的内部值.

每当文本字段值更改时,更新步进器值的最佳/最简单方法是什么?

Pet*_*sey 23

跳过takeIntValueFrom:方法.而是将两个视图绑定到控制器中的同一属性.您可能还想创建一个格式化程序并将文本字段的formatter出口连接到它.


mou*_*iel 15

我会有一个带有一个整数变量的模型,它表示两个控件的值.

在我的控制器中,我将使用一个连接到两个控件的IBAction和两个IBOutlet,每个控件一个.然后我会有一个从模型值更新出口的方法.

IBOutlet NSStepper * stepper;
IBOutlet NSTextField * textField;

- (IBAction) controlDidChange: (id) sender
{
    [model setValue:[sender integerValue]];
    [self updateControls];
}

- (void) updateControls
{
    [stepper setIntegerValue:[model value]];
    [textField setIntegerValue:[model value]];
}
Run Code Online (Sandbox Code Playgroud)

这是原则.正如Peter Hosey所说,格式化程序可能对您的文本字段很有用,至少要考虑步进器的最小值和最大值.


ami*_*tob 6

我发现简单的方法是将步进值绑定到输入和输入值到步进器

@property (strong) IBOutlet NSTextField *timeInput;
@property (strong) IBOutlet NSStepper *timeStepper;
Run Code Online (Sandbox Code Playgroud)

绑定输入值

绑定步进器值


jsb*_*box 6

如果要跟踪某个模型中字段的值(例如当前页码),则无需在步进控件中保留另一个副本.我只是将控件配置为初始值为0,范围从-1到1.在步进控件的IBAction方法中,对控件的任何单击(或自动重复)调用,请求它的当前值,如果单击向上箭头,则为1,向下箭头为-1.立即将控件的当前值重置为0,然后使用基于方向1或-1的新值更新模型和其他任何内容(关联的文本字段或新的页面视图等).例如,

- (IBAction) bumpPageNum:(id)sender
{
    int whichWay = [sender intValue];   // Either 1 or -1
    [sender setIntValue:0];             // Same behavior next time
    [model changePageBy:whichWay];
}
Run Code Online (Sandbox Code Playgroud)

这样,步进控件根本不必链接到模型中的任何值.

  • 如此简单,如此聪明,如此优雅的解决方案!谢谢.设置步进器的增量而不是1时也可以工作. (2认同)