2014-02-10 4 views
1

iOS 장치에 연결된 외부 장치의 전압을 읽는 여러 개의 UIProgressView이 있습니다. 이 뷰는 0-5V의 범위에서 크기를 조정하고 UIProgressView의 현재 진행/전압을 검색하여 사용자가 입력 한 임계 값과 비교하는 방법이 있는지 알고 싶습니다. 일단이 임계 값이 초과되면; 필자가 작성한 방법을 호출해야합니다.UIProgressView에서 현재 값 가져 오기 및 임계 값 충족시 이벤트 트리거

문제가 반드시 비교 부분이나 메서드를 호출하는 것은 아닙니다. progressview의 현재 값이 무엇인지 라이브 업데이트를 검색하는 데 문제가 있습니다.

감사합니다. PART II에 대한

편집 :

그래서 문제가 내가이 코딩하지 않았다되고는 특정 제품에 관련된 코드는 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 

오전 데 문제가 I가와에있는 UIProgressViews에서 값을하는 방법을 알아낼 수 없습니다 스토리 보드 (이것은 당신이 말한 것처럼 사소한 개념입니다). 그러나이 설정을 사용하면 다소 복잡합니다.

두 번째 문제점은 다음과 같습니다. 외부 장치 (nanospark 컨트롤러 보드)가 iPod에 연결되어있을 때만 응용 프로그램으로 디버깅 할 수있는 방법이 있는지 잘 모르겠습니다. 이 실행됩니다.

내가 마지막으로하는 마지막 문제는 IBAction InputChannelChanged가 호출되고 있다고 가정합니다 (응용 프로그램을 실행하기 위해 외부 장치가 필요하기 때문에 앞에서 설명한 중단 점을 사용하여이 디버그를 정기적으로 디버깅 할 수는 없습니다). 그러나 실행할 때 응용 프로그램은 필요한 모든 작업을 수행하며 버튼은 원래 소프트웨어 개발자가 코딩 한 것과 정확하게 반응합니다.

즉, [appDelegate watchPins @ "TEST"]를 추가하여 IBAction에 문자 메시지 메서드를 추가하면 텍스트를 사용자에게 보내지 않지만 단추는 여전히 수행해야 할 작업을 수행한다는 것을 의미합니다 이전 개발자의 열망과 일치합니다 .... 이것은 IBAction 메서드가 실제로 호출되고 있음을 의미하지만 그 다음 내 텍스트가 통과되지 않는 이유는 무엇입니까? 나는 그것을 알고있다 [appDelegate watchPins : @ "TEST"]; 다른 여러 수업에서 내가 사용한대로 작동해야합니다. 여기

는 AnalogVC.m의 UI를 표시하는 스크린 샷입니다 :

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

생각하지 마세요 그냥 내가 필요한 더 큰 문맥 세 가지를 모두 제공에 느낀이 모든 질문에 대답 할 의무가 문제의 TL에 감사 드리며 죄송합니다. DR.

편집 2 : 이미지를 업로드 하겠지만 필요한 최소한의 평판은 없습니다.

EDIT 3 : 버튼에 반응하는지 다른 IBAction을 추가하려고했습니다. 다른 작업 클래스의 정확한 코드를 복사하더라도 여전히 아무것도 없습니다.

답변

1

해결 방법 1 : 당신은 내가 그 사용이 진행보기를 업데이트하는 코드에서 어딘가에 setProgress: animated: 방법을 사용하는 가정합니다 UIProgressView를 업데이트 할 때 메소드를 호출 할 필요가

. 그렇다면, 당신은 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 위의 코드에서 주석 . 이런 경우에이 분명하지 않다, 당신이 할 것 매핑을 달성하기 위해 : 당신이 영업 이익에 말했듯이 장치의 입력 변수는 0-5의 값을해야

float myVoltageFromDevice = self.deviceInput/5.0; 

때문이다. 이것은 UIProgressView이 받아 들일 수있는 값의 범위 인 0.0-1.0의 값을 만듭니다.

해결 방법 2 : (당신이 정말로 할 수 있어야 함) 위를 해낼 수없는 경우

, 당신은 this apple developer doc에 자세히 설명되어 관찰 키 값 (KVO)를 사용합니다.

편집 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