HMAccessoryDelegates не вызывает действие кнопки

Я работаю над приложением Homekit для iOS. У меня есть вопрос, что у меня есть аксессуар, и когда я изменяю значение его характеристики мощности с помощью HomeKit Simulator, делегаты HMAccessory выполняют калибровку, но в случае, если я изменяю значение характеристики powr программно (используя значение записи), методы делегата не вызываются, Пожалуйста, дайте мне знать любые идеи предложений.

Code 

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

HMAccessoryDelegate

- (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 ответ

Решение

В документации говорится, что метод делегата не вызывается при программной установке значения:

Этот метод вызывается в результате изменения значения, инициированного аксессуаром. Программные изменения, инициированные приложением, не приводят к вызову этого метода.

Если вы хотите что-то сделать после того, как записать значение признака успешно (или не удалось), вы можете сделать это в completionHandler: блок из writeValue:completionHandler: метод.

Другие вопросы по тегам