Cocoa touch 我如何使用相对日期,例如;“今天”;或;“明天”;在watchOS的复杂情况下?

Cocoa touch 我如何使用相对日期,例如;“今天”;或;“明天”;在watchOS的复杂情况下?,cocoa-touch,watchkit,watchos-3,Cocoa Touch,Watchkit,Watchos 3,我有一个watchOS的复杂情况,它显示了关于当前或未来某一天发生的事情的信息。与任何复杂情况一样,我使用各种方法设置了一个CLKComplicationDataSource,包括getCurrentTimeLineEntryforComplications:withHandler:和getTimeLineEntriesforComplications:afterDate:limit:withHandler:。调用这些方法时,我使用适合并发症类型的CLKComplicationTemplate子

我有一个watchOS的复杂情况,它显示了关于当前或未来某一天发生的事情的信息。与任何复杂情况一样,我使用各种方法设置了一个
CLKComplicationDataSource
,包括
getCurrentTimeLineEntryforComplications:withHandler:
getTimeLineEntriesforComplications:afterDate:limit:withHandler:
。调用这些方法时,我使用适合并发症类型的
CLKComplicationTemplate
子类创建
CLKComplicationTimelineEntry

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

template.headerTextProvider = [CLKRelativeDateTextProvider textProviderWithDate:date style:CLKRelativeDateStyleNatural units:NSCalendarUnitDay];
这并不完全符合我的要求,尽管它显示了“0天”或“1天”之类的内容。对于较小的复杂度来说,这是可以接受的,但对于模块化的大型系统来说,这看起来特别尴尬。不管有多大的额外空间,你甚至都不能在号码后面找到一个空格

我想我可以通过使用
NSDateFormatter
来生成字符串,然后使用
CLKSimpleTextProvider
来显示它来解决这个问题。看起来很简单:

NSDateFormatter *formatter = [NSDateFormatter new];
formatter.doesRelativeDateFormatting = YES;
formatter.dateStyle = NSDateFormatterShortStyle;
formatter.timeStyle = NSDateFormatterNoStyle;
NSString *string = [formatter stringFromDate:date];
但有一个问题:watchOS需要能够提供未来日期的数据。据我所知,
NSDateFormatter
无法告诉它您希望输出与哪个日期相对,它始终与当前日期相对。因此,如果并发症数据的日期是明天,并且调用了
getTimeLineEntriesforConcurrency:afterDate:limit:withHandler:
,那么我生成的所有时间线条目都将显示“明天”。这对今天来说是正确的,但当午夜来临时,就错了。它仍然会说“明天”,直到再次生成所有并发症数据

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

  • 我可以计算出离日期还有多少天,只要在适当的时候给
    CLKSimpleTextProvider
    字符串“今天”或“明天”。我主要关心的是,我在我的应用程序的其他地方使用了
    NSDateFormatter
    ,我希望与此保持一致。用各种语言来解释这一点并不简单。举一个简单的例子,法语中使用了“après-demain”,意思是“后天”,它没有真正的英语对应词

  • 我可以给
    NSDateFormatter
    错误的日期,迫使它给我想要的输出。假设日期是6月14日,现在是6月13日。当我的应用程序为当前日期创建时间线条目时,它会使用日期6月14日(“明天”)调用我的日期格式化程序。但当它需要创建超过午夜的时间线数据时,它会调用日期为6月13日(“今天”)的日期格式化程序。这似乎是一个可怕的想法,在某些情况下,如闰年或时间变化或其他情况下,它注定会被打破。除了
    CLKRelativeDateTextProvider
    ,我已经不喜欢使用任何东西了,但我真的不喜欢这样

也就是说,我不确定我还能做什么。我已经提交了一份雷达文件(),要求提供更多的日期格式选项。它已经有一年的历史了,没有任何迹象表明它会在watchOS 4中出现


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

我认为
NSDateFormatter
是这里的最佳选择。如果您尝试在午夜安排时间线刷新,那么您应该能够避免超过当前日期的问题。不保证跨越国际日期线旅行的人!:)

如果您按照计算离它还有多少天的路线,您可以使用a并根据该数字获得一个本地化字符串。对于英语,可以是:

<key>zero</key>
<string>Today</string>
<key>one</key>
<string>Tomorrow</string>
...
<key>other</key>
<string>%d days</string>
0
今天
一
明天
...
其他
%d天
然后对于其他语言,您可以添加特定的规则,比如法语的“après-demain”两个


感觉这是一个相当令人不满意的选择,因为您现在承担着管理每种语言和描述未来的每种可能方式的责任,但它可能会起作用。

我想到了这一点,但我不喜欢它打破了时间旅行,并为午夜后丢失数据留下了很好的可能性。也就是说,我刚刚意识到我仍然可以提供所有数据,只需使用
CLKRelativeDateTextProvider
即可获得午夜后数据的“0DAYS”显示。它仍然不完美,但我认为这是迄今为止最好的解决方案。在做了一些测试后,我确定我对这个解决方案不满意。作为一个午夜后仍然醒着的人,我不能接受显示“0天”的时段。好主意,谢谢。另一件我没有想到的事情是,我可以将今天/明天的显示限制在我的应用程序直接支持的语言上,而对于其他语言,我可以回到
CLKRelativeDateTextProvider
。我已经确定,像这样使用本地化字符串的简单方法是最实用的解决方案。我不希望自己管理本地化,但这很容易做到,而且目前它提供了最好的结果。