4

ウォッチフェイスの開発を学んでいます。私は Pebble ガイドに厳密に従っているので、私のコードの 80% はサンプル コードと同じです。おそらく非常に小さな何かが欠けているのでしょうが、私の顔はタイム サービスに正しく登録されていないようです。

私は何を間違っていますか?

init()、私は持っています:

tick_timer_service_subscribe(MINUTE_UNIT, tick_handler);
tick_timer_service_subscribe(DAY_UNIT, tick_handler);

ここにありtick_handlerます:

static void tick_handler(struct tm *tick_time, TimeUnits units_changed) {
  update_time();
}

ここにありupdate_timeます:

static void update_time() {
  time_t temp = time(NULL); 
  struct tm *tick_time = localtime(&temp);

  static char time_buffer[] = "00:00";
  static char date_buffer[] = "00/00/00";

  if (clock_is_24h_style() == true) {
    strftime(time_buffer, sizeof(time_buffer), "%H:%M", tick_time);
  } else {
    strftime(time_buffer, sizeof(time_buffer), "%I:%M", tick_time);
  } 
  text_layer_set_text(s_time_layer, time_buffer);

  strftime(date_buffer, sizeof(date_buffer), "%D", tick_time);
  text_layer_set_text(s_date_layer, date_buffer);
}

フェイスは、( を呼び出してupdate_time) 最初に読み込まれた時刻のみを更新します。

4

1 に答える 1

9

TimeUnitsビットマスクです。マスクを設定してから、1 回呼び出しますtick_timer_service_subscribe。DAY_UNITS を使用した 2 回目の通話で、サブスクリプションが変更されています。両方のユニットをサブスクライブするには、マスク ビットをビットごとに次のように指定します。

tick_timer_service_subscribe(MINUTE_UNIT | DAY_UNIT, tick_handler);

tick ハンドラーに TimeUnits 引数があることに注意してください。その引数は、ハンドラーをトリガーしたユニットを示します。あなたの場合、常に時刻を更新したいのですが、DAY_UNIT は冗長に見えます。しかし、これを行うことができます:

static void tick_handler(struct tm *tick_time, TimeUnits units_changed) {
    if( (units_changed & MINUTE_UNIT) != 0 ) {
        /* Minutes changed */
    }

    if( (units_changed & DAY_UNIT) != 0 ) {
        /* Days changed */
    }
}
于 2014-11-18T21:48:35.203 に答える