2015-06-18 23 views
0

我正在開發Homekit iOS應用程序。我有一個問題,我有一個附件,當我使用HomeKit模擬器更改其功率特性值時,HMAccessory的代表正在調用,但如果我以編程方式更改powr特性值(使用writevalue),則不會調用委託方法。請讓我知道任何意見的建議。HMAccessoryDe​​legates not calling on按鈕動作

Code 

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    selectedDevice.delegate = self; 
} 

HMAccessoryDe​​legate

- (void)accessory:(HMAccessory *)accessory service:(HMService *)service didUpdateValueForCharacteristic:(HMCharacteristic *)characteristic; 
{ 
    NSLog(@"changed"); 
} 

寫功能

UISwitch *sw = [[UISwitch alloc] initWithFrame:CGRectMake(230, 5, 51, 31)]; 
[cell addSubview:sw]; 
sw.on = YES; 
[sw addTarget:self action:@selector(updateState:) forControlEvents:UIControlEventValueChanged]; 

-(void)updateState:(UISwitch*)sender 
{ 
HMCharacteristic *characteristic = self.selectedService.characteristics[tag]; 

[characteristic enableNotification:YES completionHandler:^(NSError *error) 
      { 
       if(!error) 
       { 

       } 
      }]; 
if([characteristic.characteristicType isEqualToString:HMCharacteristicTypePowerState]) 
     { 
     id val = characteristic.value; 
     NSString *str = [NSString stringWithFormat:@"%@",val]; 

     if([str isEqualToString:@"0"]) 
     { 
      id a = characteristic.value; 

      BOOL b = [a boolValue]; 

      NSNumber *c = [NSNumber numberWithBool:!b]; 

      AppDelegate *appDel = [[UIApplication sharedApplication] delegate]; 

      [characteristic writeValue:c completionHandler:^(NSError *error) { 
       if (error) { 
        UIAlertView *alertController = [[UIAlertView alloc] initWithTitle:@"Error" message:[appDel handleErrorCodes:error.code] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; 
        [alertController show]; 
        return; 
       } 
       else 
       { 
        [serviceCharacteristicsTableView reloadData]; 
       } 
      }]; 

     } 
} 

請讓我知道,如果我不明白

回答

1

documentation說,德爾當您以編程方式設置數值時,不會調用egate方法:

該方法被稱爲由 附件啓動的值更改的結果。在調用此方法時,應用程序啓動的程序化更改不會導致 。

如果你想要寫特徵的值之後做一些事情成功(或失敗),可以在writeValue:completionHandler:方法completionHandler:塊做到這一點。