Подтвердить что ты не робот

Интеграция NSStepper с NSTextField

Мне нужно, чтобы NSTextField работал с NSStepper как один элемент управления, чтобы я мог редактировать целочисленное значение, либо изменяя его прямо в текстовом поле, либо используя стрелки вверх/вниз.

В IB я добавил оба этих элемента управления, а затем подключил NSStepper takeIntValueFrom к NSTextField, и это делает текстовое значение изменяться всякий раз, когда я нажимаю стрелки шага. Проблема заключается в том, что если я отредактирую текстовое поле, то щелкните шагомер еще раз, он забудет о значении, которое я отредактировал вручную, и использую внутреннее значение шага.

Какой лучший/самый простой способ обновить значение шага при каждом изменении значения текстового поля?

4b9b3361

Ответ 1

Пропустить метод takeIntValueFrom:. Вместо этого привяжите оба представления к одному и тому же свойству в вашем контроллере. Вы также можете создать форматтер и подключить к нему текстовое поле formatter.

Ответ 2

У меня была бы модель с одной целочисленной переменной, которая представляет значение обоих элементов управления.

В моем контроллере я бы использовал один IBAction, связанный с обоими элементами управления, и два IBOutlets, по одному для каждого элемента управления. то у меня был бы метод для обновления выходов из значения модели.

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]];
}

Это принцип. Как сказал Peter Hosey, форматер может быть полезен в вашем текстовом поле, по крайней мере, чтобы принять во внимание минимальные и максимальные значения шага.

Ответ 3

Я сделал как Peter Hosey, предложив, как мне кажется, самый чистый подход. Создал свойство в моем контроллере:

int editValue_;
...
@property (nonatomic, readwrite) int editValue;
...
@synthesize editValue = editValue_;

то в IB для обоих элементов управления на вкладке Bindings я установил флажок "Привязать к:" и выбрал мой контроллер, а затем в поле "Путь к образцу ключа" задано "editValue" и voilá, это сработало! С помощью всего лишь 3 строк кода и редактирования некоторых IB. И если мне нужно изменить значение на моем контроллере, я использую setEditValue: и текстовое поле обновляется.

Ответ 4

Я нашел простой способ - привязать значение шага к входному и входному значению к шагу

@property (strong) IBOutlet NSTextField *timeInput;
@property (strong) IBOutlet NSStepper *timeStepper;

bind input value

bind stepper value

Ответ 5

Если отслеживать значение поля в одной модели, например номер текущей страницы, то нет необходимости хранить другую копию в шаговом управлении. Я просто настраиваю элемент управления на начальное значение 0 и диапазон от -1 до 1. В методе IBAction для шагового элемента управления, который вызывается для любого нажатия (или для автоматического повтора) на элементе управления, попросите его текущее значение, которое будет равно 1, если была нажата стрелка вверх, или -1 для стрелки вниз. Немедленно reset значение текущего значения управления равно 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];
}

Таким образом, шаговый элемент управления не обязательно должен быть связан с любыми значениями в модели.