UIStepper. Узнайте, увеличилось или уменьшилось

Выясняя, была ли нажата кнопка плюс или минус в UIStepper, я использую этот метод:

- (void)stepperOneChanged:(UIStepper*)stepperOne

И я сравниваю stepperOne.value с глобальным значением, сохраненным в моем классе TableView.
Я не думаю, что это правильный путь.

Итак, чтобы уточнить, я покажу «плохой» код, который я использую:

- (void)stepperOneChanged:(UIStepper*)stepperOne
{
      BOOL PlusButtonPressed=NO;  
      if(stepperOne.value>globalValue)  
      {   
          PlusButtonPressed =YES;  
      }  
      globalValue=stepperOne.value;

    ////do what you need to do with the PlusButtonPressed boolean
}

Так как же правильно это сделать? (без сохранения глобальных переменных)


person M.C.    schedule 05.08.2012    source источник
comment
Я не думаю, что есть другой способ - по крайней мере, с использованием каких-либо общедоступных методов (я бы использовал свойство, а не глобальную переменную, но в основном это одно и то же).   -  person rdelmar    schedule 05.08.2012


Ответы (8)


Поэтому я подумал о подклассе для этого. Получается не так уж и плохо (кроме обернутых значений).

Использование подкласса

- (IBAction)stepperOneChanged:(UIStepper*)stepperOne
{
    if (stepperOne.plusMinusState == JLTStepperPlus) {
       // Plus button pressed
    }
    else if (stepperOne.plusMinusState == JLTStepperMinus) {
       // Minus button pressed
    } else {
       // Shouldn't happen unless value is set programmatically.
    }
}

JLTStepper.h

#import <UIKit/UIKit.h>

typedef enum JLTStepperPlusMinusState_ {
    JLTStepperMinus = -1,
    JLTStepperPlus  = 1,
    JLTStepperUnset = 0
} JLTStepperPlusMinusState;

@interface JLTStepper : UIStepper
@property (nonatomic) JLTStepperPlusMinusState plusMinusState;
@end

JLTStepper.m

#import "JLTStepper.h"

@implementation JLTStepper
- (void)setValue:(double)value
{
    BOOL isPlus  = self.value < value;
    BOOL isMinus = self.value > value;

    if (self.wraps) { // Handing wrapped values is tricky
        if (self.value > self.maximumValue - self.stepValue) {
            isPlus  = value < self.minimumValue + self.stepValue;
            isMinus = isMinus && !isPlus;
        } else if (self.value < self.minimumValue + self.stepValue) {
            isMinus = value > self.maximumValue - self.stepValue;
            isPlus  = isPlus && !isMinus;
        }
    }

    if (isPlus)
        self.plusMinusState = JLTStepperPlus;
    else if (isMinus)
        self.plusMinusState = JLTStepperMinus;

    [super setValue:value];
}
@end
person Jeffery Thomas    schedule 05.08.2012
comment
Я не знаком с обернутыми значениями, но, похоже, он делает именно то, что должен делать. Просто и чисто. Спасибо - person M.C.; 06.08.2012


Это простой и более короткий способ определить, нажат ли «+» или «-» в UIStepper.


//First You have to declare oldValue as an int (or long/float/NSInteger etc. etc.) in Header File 
//So that you can access globally to that particular implementation file

- (void)viewDidLoad
{
     [super viewDidLoad];
     oldValue=stepperObj.value;
}

- (IBAction)stepperStep:(id)sender 
{
        if (stepperObj.value>oldValue) {
             oldValue=oldValue+1;
             //Your Code You Wanted To Perform On Increment
        }
       else {
             oldValue=oldValue-1;
             //Your Code You Wanted To Perform On Decrement
        }
}
person Mubin Mall    schedule 07.04.2014

Сначала установите минимальное и максимальное значения степпера на 0 и 1 и убедитесь, что флажок Value Wraps не установлен.

введите описание изображения здесь

Затем вы можете использовать следующий код, чтобы проверить, какая стрелка была нажата

-(IBAction)stepperAction:(NSStepper *)sender {
    if ([sender intValue] == 0) {
        NSLog(@"up");
    } else {
        sender.intValue = 0;
        NSLog(@"down");
    }
}
person Bob Ueland    schedule 10.05.2016

Swift 3.0:

В своем шаговом действии убедитесь, что вы сбросили stepper.value до 0 после этого, это делает значение шагового двигателя -1 при отрицательном нажатии и 1 при положительном нажатии.

@IBAction func Stepper(_ sender: UIStepper) {
    if sender.value == 1.0{
        //positive side was pressed
    }else if sender.value == -1.0{
        //negative side was pressed
    }
    sender.value = 0  //resetting the stepper value so negative is -1 and positive is 1
}
person Haider Malik    schedule 03.09.2018

Установите минимальное значение 0, максимальное значение 2 и значение 1. Затем:

- (IBAction)stepperAction:(UIStepper *)sender // value changed
{
    if ( sender.value == 0) {
        NSLog(@"down");
    } else { // else up
        NSLog(@"up");
    }
    sender.value = 1; // reset
}

Если у вас более одного степпера, установите каждый тег по-разному, затем по-прежнему используйте этот метод, а также проверьте sender.tag.

person Jeff    schedule 19.12.2016

Один из способов — использовать свойство тега UISteppers. Итак, в viewDidLoad установите для тега значение. С этого момента в каждом методе действия вы можете сначала сравнить, а затем в конце метод обновляет значение.

person David H    schedule 05.08.2012
comment
не похоже на правильное решение, но, вероятно, это лучшее решение на данный момент. Может быть, нет правильного решения... - person M.C.; 05.08.2012
comment
Ну, проблема в том, что вы хотите, чтобы некоторые данные были помечены этим элементом управления. То, что я дал тебе, было решением. В противном случае можно было бы создать подкласс элемента управления, т. е. MyStepper, и добавить одно или несколько свойств в подкласс. Категории теперь не могут определять свойства, поэтому не могут идти по этому пути. У вас может быть ivar mutableDictionary, и вы можете использовать элемент управления в качестве ключа и NSNumber в качестве значения, и вы можете поддерживать множество таких ассоциаций в одном классе. Кроме того, вы сказали, что раньше использовали глобальную переменную, но наиболее распространенным решением будет использование ivar (т.е. NSInteger oldVal;) [PS спасибо, что предоставили мне чек!] - person David H; 05.08.2012

Свифт 2.0:

Декларации:

@IBOutlet weak var mapViewZoomStepper: UIStepper!
 var mapViewZoomStepperValue: Double = -1.0

При изменении значения:

    @IBAction func mapViewZoomStepperValueChanged(sender: AnyObject) {        

     if (mapViewZoomStepper.value  > mapViewZoomStepperValue)
      {
       print("increment")
       mapViewZoomStepperValue = mapViewZoomStepperValue + 1.0

      }
      else
      {
       print("decrement")
       mapViewZoomStepperValue = mapViewZoomStepper.value - 1.0 
      }

  print("compare //  stored Value :   \(mapViewZoomStepperValue)  && real time value : \(mapViewZoomStepper.value)")

     }

Другой вариант — ограничить максимальное значение до 1. Таким образом, uistepper будет иметь два состояния — 0 и 1.

Используйте оператор switch, чтобы различать:

switch (mapViewZoomStepper.value) {
  case 0:
    print("A")
    break;
case 1:
 print("B")
 break;

  default:
    break;
}
person A.G    schedule 29.03.2016

Свифт 5.0

var oldValue: Int!

override func viewDidLoad(){
    super.viewDidLoad()
    oldValue = Int(stepper.minimumValue)
}

@IBAction(){
if Int(sender.value) > oldValue{
  // Positive
}else{
   // Negative
}
oldValue = Int(sender.value)

 }
person manasshr    schedule 27.08.2019