2014-02-10 52 views
1

我有几个UIProgressView可以读取连接到iOS设备的外部设备的电压。该视图将其从0-5伏缩放,我想知道是否有办法检索UIProgressView的当前进度/电压并将其与用户输入的阈值进行比较。一旦超过这个门槛,我写的一个方法应该被调用。从UIProgressView获取当前值,并在达到阈值时触发事件

问题不一定是比较部分或调用方法。我无法检索进度视图当前值的实时更新。

谢谢你的时间。

编辑第二部分:

所以,问题是我没有代码这一点,它是属于一个特定的产品代码叫Nanospark板。此主板是由各种iOS设备运行的工厂系统的输入/输出控制板。

我不能完全似乎找出以前的编码器这一类中所做的:

// 

// AnalogVC.m 

// NanosparkController 

// 



#import "AnalogVC.h" 

#import "AppDelegate.h" 



@interface InputItem : NSObject 

@property (weak,nonatomic) UISwitch *onSwitch; 

@property (weak,nonatomic) UIProgressView *progressView; 

@property (weak,nonatomic) UILabel *valueLabel; 

@end 



@implementation InputItem 

AppDelegate *appDelegate; 

+ (id)itemWithSwitch:(id)temp progress:(id)progress label:(id)label 

{ 


    InputItem *item = [[InputItem alloc] init]; 

    item.onSwitch = temp; 

    item.progressView = progress; 

    item.valueLabel = label; 

    return item; 

} 



- (void)setDisconnected 

{ 


    self.onSwitch.on = NO; 

    self.onSwitch.enabled = NO; 

    self.valueLabel.text = @"0.000 v"; 

    self.progressView.progress = 0; 



} 



- (void)setOn 

{ 



self.onSwitch.on = YES; 

    self.onSwitch.enabled = YES; 

    self.valueLabel.text = @"0.000 v"; 

    self.progressView.progress = 0; 

[appDelegate watchPins:@"testing ON"]; 

} 



- (void)setOff 

{ 


    self.onSwitch.on = NO; 

    self.onSwitch.enabled = YES; 

    self.valueLabel.text = @"0.000 v"; 

    self.progressView.progress = 0; 

[appDelegate watchPins:@"testing OFF"]; 

} 



- (void)setValue:(double)value 

{ 

    if (self.onSwitch.on) 

    { 

     self.valueLabel.text = [NSString stringWithFormat:@"%0.3f v",value]; 

     self.progressView.progress = value/5.0; 

if(value > 0.8){ 

[appDelegate watchPins:@"testing VALUE"]; 

} 

    } 

} 

@end 



@interface AnalogVC() 

{ 


    NSArray *_inputItems; 

    AppDelegate *appDelegate; 

    NSMutableArray *channel0Values; 



    UIColor *custom1; 

    UIColor *custom2; 

    UIColor *custom3; 

    UIColor *custom4; 

} 



@property (nonatomic) NCBoardManager *manager; 



@property (weak,nonatomic) IBOutlet UISwitch *inputSwitch0; 

@property (weak,nonatomic) IBOutlet UISwitch *inputSwitch1; 

@property (weak,nonatomic) IBOutlet UISwitch *inputSwitch2; 

@property (weak,nonatomic) IBOutlet UISwitch *inputSwitch3; 

@property (weak,nonatomic) IBOutlet UISwitch *inputSwitch4; 

@property (weak,nonatomic) IBOutlet UISwitch *inputSwitch5; 



@property (weak,nonatomic) IBOutlet UIProgressView *inputProgress0; 

@property (weak,nonatomic) IBOutlet UIProgressView *inputProgress1; 

@property (weak,nonatomic) IBOutlet UIProgressView *inputProgress2; 

@property (weak,nonatomic) IBOutlet UIProgressView *inputProgress3; 

@property (weak,nonatomic) IBOutlet UIProgressView *inputProgress4; 

@property (weak,nonatomic) IBOutlet UIProgressView *inputProgress5; 



@property (weak,nonatomic) IBOutlet UILabel *inputValue0; 

@property (weak,nonatomic) IBOutlet UILabel *inputValue1; 

@property (weak,nonatomic) IBOutlet UILabel *inputValue2; 

@property (weak,nonatomic) IBOutlet UILabel *inputValue3; 

@property (weak,nonatomic) IBOutlet UILabel *inputValue4; 

@property (weak,nonatomic) IBOutlet UILabel *inputValue5; 



@property (weak,nonatomic) IBOutlet UISlider *outputSlider0; 

@property (weak,nonatomic) IBOutlet UISlider *outputSlider1; 



@property (weak,nonatomic) IBOutlet UIStepper *outputStepper0; 

@property (weak,nonatomic) IBOutlet UIStepper *outputStepper1; 



@property (weak,nonatomic) IBOutlet UILabel *outputValue0; 

@property (weak,nonatomic) IBOutlet UILabel *outputValue1; 





- (IBAction)inputChannelChanged:(UISwitch *)sender; 

- (IBAction)outputSliderMoved:(UISlider *)sender; 

- (IBAction)outputSliderStopped:(UISlider *)sender; 

- (IBAction)outputStepperChanged:(UIStepper *)sender; 

@end 



@implementation AnalogVC{} 





////////////////////////////// 

#pragma mark View Lifecycle 

////////////////////////////// 





- (void)viewDidLoad 

{ 

    [super viewDidLoad]; 

     NSLog(@"Analog VC loaded"); 

    _inputItems = @[[InputItem itemWithSwitch:_inputSwitch0 progress:_inputProgress0 label:_inputValue0], 

        [InputItem itemWithSwitch:_inputSwitch1 progress:_inputProgress1 label:_inputValue1], 

        [InputItem itemWithSwitch:_inputSwitch2 progress:_inputProgress2 label:_inputValue2], 

        [InputItem itemWithSwitch:_inputSwitch3 progress:_inputProgress3 label:_inputValue3], 

        [InputItem itemWithSwitch:_inputSwitch4 progress:_inputProgress4 label:_inputValue4], 

        [InputItem itemWithSwitch:_inputSwitch5 progress:_inputProgress5 label:_inputValue5]]; 



    _manager = [NCBoardManager sharedBoardManager]; 



    __unsafe_unretained AnalogVC *vc = self; 

    [_manager setAnalogInputHandling:dispatch_get_main_queue() 

           filter:^(NCAnalogInputs *inputs){ return YES; } 

          handler:^(NCAnalogInputs *inputs){ [vc setAnalogInputs:inputs]; }]; 





    // Register for notifications 

    [[NSNotificationCenter defaultCenter] addObserver:self 

              selector:@selector(boardConnected:) 

               name:CONNECTED_NOTIFICATION 

               object:nil]; 



    [[NSNotificationCenter defaultCenter] addObserver:self 

              selector:@selector(boardDisconnected:) 

               name:DISCONNECTED_NOTIFICATION 

               object:nil]; 

} 



- (void)viewWillAppear:(BOOL)animated 

{ 

    [super viewWillAppear:animated]; 

    [self updateAnalogInputs]; 

    [self updateAnalogOutputs]; 



    custom1 = [UIColor whiteColor]; 

    custom2 = [UIColor darkGrayColor]; 

    custom3 = [UIColor blackColor]; 

    custom4 = [UIColor colorWithRed:.97 green:.97 blue:.588 alpha:1.0]; 



    CAGradientLayer *gradient = [CAGradientLayer layer]; 

    gradient.frame = self.view.bounds; 

    gradient.colors = [NSArray arrayWithObjects:(id)[custom2 CGColor], (id)[custom1 CGColor], (id)[custom2 CGColor], nil]; 

    gradient.startPoint = CGPointMake(0.5, 0); 

    gradient.endPoint = CGPointMake(0.5, 1.0); 

    gradient.locations = [NSArray arrayWithObjects: [NSNumber numberWithFloat:0.0], [NSNumber numberWithFloat:0.5], [NSNumber numberWithFloat:1.0], nil]; 

    [self.view.layer insertSublayer:gradient atIndex:0]; 



    [self.inputSwitch0 setOnTintColor:custom4]; 

    [self.inputSwitch1 setOnTintColor:custom4]; 

    [self.inputSwitch2 setOnTintColor:custom4]; 

    [self.inputSwitch3 setOnTintColor:custom4]; 

    [self.inputSwitch4 setOnTintColor:custom4]; 

    [self.inputSwitch5 setOnTintColor:custom4]; 



    [self.inputSwitch0 setTintColor:custom3]; 

    [self.inputSwitch1 setTintColor:custom3]; 

    [self.inputSwitch2 setTintColor:custom3]; 

    [self.inputSwitch3 setTintColor:custom3]; 

    [self.inputSwitch4 setTintColor:custom3]; 

    [self.inputSwitch5 setTintColor:custom3]; 



    self.inputProgress0.trackTintColor = custom3; 

    self.inputProgress1.trackTintColor = custom3; 

    self.inputProgress2.trackTintColor = custom3; 

    self.inputProgress3.trackTintColor = custom3; 

    self.inputProgress4.trackTintColor = custom3; 

    self.inputProgress5.trackTintColor = custom3; 



    self.inputProgress0.progressTintColor = custom4; 

    self.inputProgress1.progressTintColor = custom4; 

    self.inputProgress2.progressTintColor = custom4; 

    self.inputProgress3.progressTintColor = custom4; 

    self.inputProgress4.progressTintColor = custom4; 

    self.inputProgress5.progressTintColor = custom4; 



    self.outputSlider0.minimumTrackTintColor = custom4; 

    self.outputSlider1.minimumTrackTintColor = custom4; 

    self.outputSlider0.maximumTrackTintColor = custom3; 

    self.outputSlider1.maximumTrackTintColor = custom3; 



    self.outputSlider0.thumbTintColor = custom3; 

    self.outputSlider1.thumbTintColor = custom3; 



    if(_manager.isBoardConnected) 

    { 

     self.outputStepper0.tintColor = custom4; 

     self.outputStepper1.tintColor = custom4; 

     self.outputStepper0.enabled = TRUE; 

     self.outputStepper1.enabled = TRUE; 

     self.outputSlider0.enabled = TRUE; 

     self.outputSlider1.enabled = TRUE; 

    } 

    else 

    { 

     self.outputStepper0.tintColor = custom2; 

     self.outputStepper1.tintColor = custom2; 

     self.outputStepper0.enabled = FALSE; 

     self.outputStepper1.enabled = FALSE; 

     self.outputSlider0.enabled = FALSE; 

     self.outputSlider1.enabled = FALSE; 

    } 

} 





////////////////////////////// 

#pragma mark Rotation Calls 

////////////////////////////// 





- (NSUInteger)supportedInterfaceOrientations 

{ 

    return UIInterfaceOrientationPortrait; 

} 



- (BOOL)shouldAutorotate 

{ 

    return FALSE; 

} 





////////////////////////// 

#pragma mark Board Calls 

////////////////////////// 





- (void)boardConnected:(NSNotification *)notification 

{ 

    [self updateAnalogInputs]; 

    [self updateAnalogOutputs]; 



    self.outputStepper0.enabled = TRUE; 

    self.outputStepper1.enabled = TRUE; 

    self.outputSlider0.enabled = TRUE; 

    self.outputSlider1.enabled = TRUE; 



    self.outputStepper0.tintColor = custom4; 

    self.outputStepper1.tintColor = custom4; 

} 



- (void)boardDisconnected:(NSNotification *)notification 

{ 

    [self updateAnalogInputs]; 

    [self updateAnalogOutputs]; 



    self.outputStepper0.enabled = FALSE; 

    self.outputStepper1.enabled = FALSE; 

    self.outputSlider0.enabled = FALSE; 

    self.outputSlider1.enabled = FALSE; 



    self.outputStepper0.tintColor = custom2; 

    self.outputStepper1.tintColor = custom2; 

} 



- (void)updateAnalogInputs 

{ 


    uint8_t channel = self.manager.analogInputChannels; 

    switch (self.manager.analogInputStatus) 

    { 

     case NCInputConnected: 

      // Check if channels we left on 

      if (channel) self.manager.analogInputChannels = 0; 

      [_inputItems makeObjectsPerformSelector:@selector(setOff)]; 

      break; 

     case NCInputDisconnected: 

      [_inputItems makeObjectsPerformSelector:@selector(setDisconnected)]; 

      break; 

     case NCInputLiveUpdating: 

      for (InputItem *item in _inputItems) 

      { 

       //if (channel & 1) [item setOn]; 

       //else    [item setOff]; 

       channel >>= 1; 

      } 

      break; 

     case NCInputSampling: 

      [_inputItems makeObjectsPerformSelector:@selector(setDisconnected)]; 

      break; 

     case NCInputTransfering: 

      [_inputItems makeObjectsPerformSelector:@selector(setDisconnected)]; 

      break; 

    } 



} 





- (void)setAnalogInputs:(NCAnalogInputs *)inputs 

{ 


    int i = 0; 

    uint8_t channels = inputs.channels; 

    for (InputItem *item in _inputItems) 

    { 

     if (channels & 1) 

     { 

      [item setValue:[inputs valueForChannel:i]]; 


     } 

     channels >>= 1; 

     i++; 

    } 

} 



- (void)updateAnalogOutputs 

{ 

    BOOL connected = [self.manager isBoardConnected]; 



    self.outputSlider0.value = self.manager.analogOutput0; 

    self.outputSlider0.enabled = connected; 

    self.outputStepper0.value = self.outputSlider0.value * 1000; 

    self.outputStepper0.enabled = connected; 

    self.outputValue0.text = [NSString stringWithFormat:@"%0.3f v",self.outputSlider0.value]; 



    self.outputSlider1.value = self.manager.analogOutput1; 

    self.outputSlider1.enabled = connected; 

    self.outputStepper1.value = self.outputSlider1.value * 1000; 

    self.outputStepper1.enabled = connected; 

    self.outputValue1.text = [NSString stringWithFormat:@"%0.3f v",self.outputSlider1.value]; 

} 





/////////////////////////////// 

#pragma mark IBAction Methods 

/////////////////////////////// 



- (IBAction)inputChannelChanged:(UISwitch *)sender 

{ 

NSLog(@"TEST"); 

InputItem *item = [_inputItems objectAtIndex:sender.tag]; 

    uint8_t channels = self.manager.analogInputChannels; 

    if (sender.on) 

    { 

     channels |= (1 << sender.tag); 

     [item setOn]; 



    } 

    else 

    { 

     channels &= ~(1 << sender.tag); 

     [item setOff]; 

    } 

    if (!self.manager.analogInputChannels) [self.manager startAnalogLiveUpdating]; 

    else if(!channels) [self.manager stopAnalogLiveUpdating]; 



    self.manager.analogInputChannels = channels; 

} 



- (IBAction)outputSliderMoved:(UISlider *)sender 

{ 

    if (!sender.tag) 

    { 

     self.manager.analogOutput0 = sender.value; 

     self.outputValue0.text = [NSString stringWithFormat:@"%0.3f v",sender.value]; 

    } 

    else 

    { 

     self.manager.analogOutput1 = sender.value; 

     self.outputValue1.text = [NSString stringWithFormat:@"%0.3f v",sender.value]; 

    } 

} 



- (IBAction)outputSliderStopped:(UISlider *)sender 

{ 

    if (!sender.tag) 

    { 

     self.manager.analogOutput0 = sender.value; 

     self.outputStepper0.value = round(sender.value * 1000.0); 

     self.outputValue0.text = [NSString stringWithFormat:@"%0.3f v",self.outputStepper0.value/1000.0]; 

    } 

    else 

    { 

     self.manager.analogOutput1 = sender.value; 

     self.outputStepper1.value = round(sender.value * 1000.0); 

     self.outputValue1.text = [NSString stringWithFormat:@"%0.3f v",self.outputStepper1.value/1000.0]; 

    } 

} 



- (IBAction)outputStepperChanged:(UIStepper *)sender 

{ 

    float value = sender.value/1000.0; 



    if (!sender.tag) 

    { 

     self.manager.analogOutput0 = value; 

     self.outputSlider0.value = value; 

     self.outputValue0.text = [NSString stringWithFormat:@"%0.3f v",value]; 

    } 

    else 

    { 

     self.manager.analogOutput1 = sender.value/1000.0; 

     self.outputSlider1.value = value; 

     self.outputValue1.text = [NSString stringWithFormat:@"%0.3f v",value]; 

    } 

} 



@end 

我遇到的问题是我无法弄清楚如何采取值,并从那些在该UIProgressViews故事板(就像你说的那样,一个简单的概念)。但是,这样做的结果相当复杂。

第二个问题是:我不确定是否有方法可以调试,因为应用程序仅在外部设备(nanospark控制器板)连接到iPod时才运行。

我最后一个但最终的问题是,我假设IBAction InputChannelChanged被调用(不能像上述那样定期调试这个断点,因为它需要外部设备来运行应用程序),但是当我运行应用程序会完成它应该做的所有事情,并且按钮对原始软件开发人员编码的内容做出正确反应。

这意味着如果我将我的短信方法添加到IBAction(通过添加[appDelegate watchPins @“TEST”]),它不会将文本发送给用户,但按钮仍然做他们应该做的事情与以前的开发人员的愿望相一致......这意味着IBAction方法确实被称为...但是为什么我的文本没有经过?我知道[appDelegate watchPins:@“TEST”];应该像我在其他几个班中使用过的那样工作。

这里是显示AnalogVC.m的UI截图:

http://i.stack.imgur.com/NNpZk.png

不要觉得有责任回答所有这些问题,它只是我觉得有必要给它提供的所有三个更大的范围内的问题。感谢并为TL感到遗憾; DR。

编辑2:我会上传图片,但我没有要求的最低声望。编辑3:我试图添加另一个IBAction来查看按钮是否对此作出反应;即使我复制了其他工作类的确切代码,也没有任何问题。

回答

1

解决方案1:

你需要调用你的方法,当你更新UIProgressView我认为使用的地方使用您的代码中setProgress: animated:方法来更新进度视图。如果是的话,尝试在这个方法中的代码,您更新UIProgressView

float myVoltageFromDevice = self.deviceInput/5.0; //this can be whatever your input is mapped to 0.0...1.0 

//the self.device input variable should be the input from the external device. 
if(myFloatFromDevice > myThreshold){ //set my threshold to whatever you would like. 
    [self doAction]; //do whatever you need to do when the value is surpassed 
}else{  
    [myProgressView setProgress:myVoltageFromDevice animated: NO]; 
} 

编辑: 我评论在上面的代码//this can be whatever your input is mapped to 0.0...1.0。以防万一,这是不明确的,实现映射你会怎么做:

float myVoltageFromDevice = self.deviceInput/5.0; 

,因为设备的输入变量应该是0-5的值,你在OP说。这使得值为0.0-1.0,这是UIProgressView将接受的值的范围。

解决方案2:

如果不能拉断上面(你真的应该能够做到),你应该使用它在this apple developer doc详细参数值观察(志愿)。

编辑2:

您发布的代码是相当复杂的,但我相信,你需要编辑的方法是- (void)setAnalogInputs:(NCAnalogInputs *)inputs尝试改变一些代码到这一点:

for (InputItem *item in _inputItems) 

{ 

    if (channels & 1) 

    { 
     if([inputs valueForChannel:i] > myThreshold){ 
      [self doAction]; //Do your action here. 
     }else{ 
      [item setValue:[inputs valueForChannel:i]]; 
     } 
    } 

    channels >>= 1; 

    i++; 

} 
+0

谢谢为伟大的资源!,优秀的帮助。 – Tukajo

+0

@Tukajo:没问题,我很乐意帮忙! – 68cherries

+0

@ 67cheries如果我发布一些代码,你是否有时间解决一个问题?我试图说你的话,但无济于事。 – Tukajo

相关问题