Уровень заряда батареи не будет обновляться

У меня небольшая проблема. Я новичок в программировании для iPhone, поэтому, пожалуйста, простите меня, если ответ очевиден.

Я нашел текущий заряд и хочу, чтобы он постоянно обновлялся во время работы моего приложения. Я пробовал это:

- (void) viewWillAppear:(BOOL)animated
{

 NSLog(@"viewWillAppear");
 double level = [self batteryLevel];
 currentCharge.text = [NSString stringWithFormat:@"%.2f %%", level];
 timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:selfselector:@selector(updateBatteryLevel:) userInfo:nil repeats:NO];
 [super viewWillAppear:animated];
}

Сначала я правильно получаю чтение, но оно не обновляется. Любая помощь приветствуется!

Большое спасибо,

Стюарт


person Stumf    schedule 03.11.2009    source источник


Ответы (1)


Почему вы ожидаете, что приведенный выше код будет постоянно обновляться? Вы устанавливаете значение один раз, когда появляется представление. Если вы хотите, чтобы он постоянно обновлялся, вам необходимо зарегистрироваться для получения обновлений состояния батареи и перерисовывать текст при его изменении.

Не видя кода ваших подпрограмм batteryLevel и updateBatteryLevel:, вы не сможете узнать, что вы делаете или почему они работают неправильно. Сказав это, я бы не стал использовать для этого событие таймера, это довольно неэффективно. Вместо этого вы хотите использовать KVO:

- (void) viewWillAppear:(BOOL)animated {
  UIDevice *device = [UIDevice currentDevice];
  device.batteryMonitoringEnabled = YES;
  currentCharge.text = [NSString stringWithFormat:@"%.2f", device.batteryLevel];
  [device addObserver:self forKeyPath:@"batteryLevel" options:0x0 context:nil];
  [super viewWillAppear:animated];
}

- (void) viewDidDisappear:(BOOL)animated {
  UIDevice *device = [UIDevice currentDevice];
  device.batteryMonitoringEnabled = NO;
  [device removeObserver:self forKeyPath:@"batteryLevel"];
  [super viewDidDisappear:animated];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
  UIDevice *device = [UIDevice currentDevice];
  if ([object isEqual:device] && [keyPath isEqual:@"batteryLevel"]) {
    currentCharge.text = [NSString stringWithFormat:@"%.2f", device.batteryLevel];
  }
}
person Louis Gerbarg    schedule 03.11.2009
comment
Сейчас работаю, так что большое спасибо, Луи. Как я уже сказал, я только учусь и теперь могу делать это правильно в будущем. Спасибо еще раз! - person Stumf; 03.11.2009