2014-02-10 31 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

相關問題