如何在watchOS复杂功能中使用“今天”或“明天”等相关日期?

时间:2017-06-13 09:57:08

标签: cocoa-touch watchkit watch-os-3

我有一个watchOS复杂功能,可以显示当天或未来某天发生的情况。与任何复杂功能一样,我设置CLKComplicationDataSource各种方法,包括getCurrentTimelineEntryForComplication:withHandler:getTimelineEntriesForComplication:afterDate:limit:withHandler:。调用这些方法时,我使用适合复杂类型的CLKComplicationTimelineEntry子类创建CLKComplicationTemplate

“模块化大”并发症类型(CLKComplicationFamilyModularLarge)是给我带来最大麻烦的一种。对于这种类型,我希望标题在适当时说“今天”或“明天”。下面是关于当天发生的事情的一些文字。目前我正在使用CLKRelativeDateTextProvider

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

这并不是我想做的事情 - 它显示的内容类似于“0DAYS”或“1DAY”。对于较小的并发症而言,这是可以接受的,但对于Modular Large,它看起来特别尴尬。无论有多少额外的空间,你甚至不会在号码后面留出空格。

我以为我可以通过使用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:,那么我生成的所有时间线条目都会显示“明天”。这对于当天来说是正确的,但是当午夜到来时,这将是错误的。在所有复杂数据再次生成之前,它仍然会说“明天”。

我只能想到这个问题的几个解决方案,它们都有缺点:

  • 我可以计算出日期的天数,并在合适的时候给CLKSimpleTextProvider字符串“今天”或“明天”。我主要担心的是我在我的应用程序的其他地方使用NSDateFormatter,我希望与此保持一致。使用各种语言来解释这不是微不足道的。举一个简单的例子,法语使用“après-demain”,意思是“后天”,没有真正的英语等价物。

  • 我可以给NSDateFormatter错误的日期,强迫它给我想要的输出。让我们说复杂的日期是6月14日,现在是6月13日。当我的应用程序正在创建当天的时间轴条目时,它会使用日期6月14日(“明天”)调用我的日期格式化程序。但是当它需要在午夜之后创建时间轴数据时,它会调用日期格式化程序,日期为6月13日(“今天”)。这似乎是一个可怕的想法,在某些情况下,如闰年或时间的变化或其他东西必然会破裂。我已经不喜欢使用除CLKRelativeDateTextProvider以外的任何内容,但我真的不喜欢这样。

那就是说,我不确定我还能做些什么。我已经提交了一个雷达(27267550: CLKRelativeDateTextProvider should offer more control),要求提供更多日期格式选项。它已经有一年了,并没有显示出在watchOS 4中得到解决的迹象。

解决这个问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

我认为NSDateFormatter是最好的选择。如果您尝试在午夜安排时间线刷新,那么您应该能够避免当天过去的日期问题。在国际日期线上旅行的人无法保证! :)

答案 1 :(得分:1)

如果您计算离开它的天数的路线,您可以使用localized .stringsdict并根据该数字获取本地化字符串。英语可能是:

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

然后对于其他语言,您可以添加特定规则,例如法语的“après-demain”两个。

感觉就像一个非常不满意的选择,因为你现在负责管理每种语言以及描述未来日子的每种可能方式,但它可以起作用。