2017-06-13 7 views
1

私は現在の日または将来の日に起こっていることに関する情報を表示するwatchOSの問題を持っています。合併症の場合と同様に、私は、をgetCurrentTimelineEntryForComplication:withHandler:getTimelineEntriesForComplication:afterDate:limit:withHandler:などのさまざまな方法で設定しています。これらのメソッドが呼び出されると、CLKComplicationTemplateというサブクラスを使用して、CLKComplicationTimelineEntryを作成します。このサブクラスは複雑な型に適しています。watchOSの複雑な問題で「今日」や「明日」のような相対日付を使用するにはどうすればよいですか?

「モジュラーラージ」合併症タイプ(CLKComplicationFamilyModularLarge)は、私に最も困っているものです。このタイプでは、見出しが適切なときに「今日」または「明日」と言ってほしい。下には、その日の出来事についてのテキストがあります。現在、私はこのためCLKRelativeDateTextProviderを使用しています:

template.headerTextProvider = [CLKRelativeDateTextProvider textProviderWithDate:date style:CLKRelativeDateStyleNatural units:NSCalendarUnitDay]; 

これは非常に私がやりたいことはありませんけれども、それは「0DAYS」または「1DAY」のようなものを示しています。それはより小さな合併症のために受け入れられるが、モジュラーラージでは特に厄介なように見える。どれくらいの余分な部屋があっても、数字の後にスペースがありません。

NSDateFormatterを使用して文字列を生成し、次にそれを表示するためにCLKSimpleTextProviderを使用してこれを修正できると考えました。

NSDateFormatter *formatter = [NSDateFormatter new]; 
formatter.doesRelativeDateFormatting = YES; 
formatter.dateStyle = NSDateFormatterShortStyle; 
formatter.timeStyle = NSDateFormatterNoStyle; 
NSString *string = [formatter stringFromDate:date]; 

しかし、問題があります:十分に簡単なように見えたwatchOSの合併症は将来の日付のデータを供給できるようにする必要がありますが。私が言うことができる限り、NSDateFormatterには、出力を相対的にする日付をいつでも指定する方法がありません。常に現在の日付に相対的です。したがって、合併症データの日付が明日であり、getTimelineEntriesForComplication:afterDate:limit:withHandler:が呼び出された場合、生成するすべてのタイムラインエントリは「明日」と表示されます。それは今日の日には間に合うでしょうが、深夜になると間違っています。すべての複雑なデータが再び生成されるまで、「Tomorrow」と表示されます。

私はこの問題のカップルの解決策を考えることができましたし、彼らは両方の欠点を持っている:

  • 私が日付の日数離れて計算することができるとちょうどCLKSimpleTextProvider文字列与えるを "それが適切なときに「今日」または「明日」を選択します。私の主な関心事は、私がNSDateFormatterを私のアプリのどこかで使っていることです。私はそれと一貫していたいと思います。それを説明するための様々な言語があれば、それは自明ではありません。単純な例を挙げると、フランス語は "après-demain"を使用しています。これは "明日の日"を意味します。

  • 私はNSDateFormatterに間違った日付を与えて、私に必要な出力を与えてもらうことができます。合併症の日付が6月14日で、現在6月13日だとしましょう。私のアプリが現在の日のタイムラインエントリを作成しているとき、それは6月14日の日付( "明日")を使って私の日付フォーマッタを呼び出します。しかし、深夜のタイムラインデータを作成する必要があるときは、6月13日の日付フォーマッタ( "Today")を呼び出します。これは、うるう年や時間の変更など何らかの状況で壊れてしまう恐ろしいアイデアのようです。私はすでにCLKRelativeDateTextProvider以外のものを使用したくないですが、私はを好きではありません。

私は他に何ができるのか分かりません。私は既に日付形式設定のオプションを求めるレーダー(27267550: CLKRelativeDateTextProvider should offer more control)を提出しています。それは一歳であり、watchOS 4で対処される兆候は見られません。

これを解決する最も良い方法は何ですか?

答えて

1

ここではNSDateFormatterが最適です。深夜にタイムラインの更新をスケジュールしようとすると、その日の過去の日付の問題を回避できるはずです。国際日付の旅行者には保証はありません! :)

+0

これは私の心を邪魔しましたが、私はそれが好きではありませんでした。それはタイムトラベルを破り、真夜中以降にデータが失われる可能性があります。つまり、私は今もすべてのデータを提供できることに気づき、 'CLKRelativeDateTextProvider'を使って真夜中過ぎのデータの" 0DAYS "表示を取得するだけです。まだ完璧ではありませんが、これはこれまでのところ最高の解決策だと思います。 – robotspacer

1

距離を計算する経路がある場合は、localized .stringsdictを使用して、数値に基づいてローカライズされた文字列を取得できます。

<key>zero</key> 
<string>Today</string> 
<key>one</key> 
<string>Tomorrow</string> 
... 
<key>other</key> 
<string>%d days</string> 

をし、他の言語のために次の2つのフランスの「アフターdemain」のように、特定のルールを追加することができます。英語の場合、それは可能性があります。

あなたは今、あらゆる言語を管理し、将来の日を記述する可能性のある方法を取っているので、かなり不満足な選択肢のように感じますが、うまくいく可能性があります。

+0

良いアイデア、ありがとう。私が考えていなかったもう一つは、私のアプリケーションが直接サポートしている言語に今日/明日の表示を制限し、他の言語のための 'CLKRelativeDateTextProvider'にフォールバックするということです。 – robotspacer

関連する問題