Составление поставщиков текста с помощью CLKTextProvider.localizableTextProvider (withStringsFileFormatKey :, textProviders :) - PullRequest
1 голос
/ 16 марта 2019

Существуют ли официальные примеры настройки сложности с использованием localizableTextProvider (withStringsFileFormatKey :, textProviders :)? Я могу заставить поставщика текста заполнять при создании SampleTemplate, но всякий раз, когда я пытаюсь сгенерировать шаблон с использованием getTimelineEntries, поставщика текста, сгенерированного localizableTextProvider, результат всегда пуст, без текста.

Пример (поддерживается только .utilitarLarge):

func getCurrentTimelineEntry(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTimelineEntry?) -> Void) {  
    // Call the handler with the current timeline entry  
    let template = CLKComplicationTemplateUtilitarianLargeFlat()  

    template.textProvider = CLKTextProvider.localizableTextProvider(  
        withStringsFileFormatKey: "testComplication",  
        textProviders: [  
            CLKSimpleTextProvider(text: "Hello"),  
            CLKSimpleTextProvider(text: "World")  
        ]  
    )  

    handler(CLKComplicationTimelineEntry(date: Date(), complicationTemplate: template))  

}  

и sampleTemplate как

func getLocalizableSampleTemplate(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTemplate?) -> Void) {  
    // This method will be called once per supported complication, and the results will be cached  
    switch complication.family {  
    case .utilitarianLarge:  
        let template = CLKComplicationTemplateUtilitarianLargeFlat()  

        template.textProvider = CLKTextProvider.localizableTextProvider(  
            withStringsFileFormatKey: "testComplication",  
            textProviders: [  
                CLKSimpleTextProvider(text: "Hi"),  
                CLKSimpleTextProvider(text: "World")  
            ]  
        )  

        handler(template)  

    default:  
        handler(nil)  
    }  

}  

с ckcomplication.strings как

"testComplication" = "%@ %@";

Образец шаблона всегда будет отображать текст «Привет, мир», тогда как результат getCurrentTimelineEntry всегда будет отображать пустое усложнение.

Кому-нибудь повезло, составляя текстовые провайдеры таким образом?

1 Ответ

0 голосов
/ 22 марта 2019

Похоже, этот API просто сломан в Swift (по состоянию на 4.2).Я работал над этим с категорией Objective C.Откровенно украденный у здесь

CLKTextProvider + NNNCompoundTextProviding.h

@interface CLKTextProvider (NNNCompoundTextProviding)

+ (nonnull CLKTextProvider *)nnn_textProviderByJoiningProvider:(nonnull CLKTextProvider *)provider1 andProvider:(nonnull CLKTextProvider *)provider2 withString:(nullable NSString *)joinString;

@end

CLKTextProvider + NNNCompoundTextProviding.m

@implementation CLKTextProvider (NNNCompoundTextProviding)

+ (nonnull CLKTextProvider *)nnn_textProviderByJoiningProvider:(nonnull CLKTextProvider *)provider1 andProvider:(nonnull CLKTextProvider *)provider2 withString:(nullable NSString *)joinString
{
    NSString *textProviderToken = @"%@";

    NSString *formatString;

    if (joinString != nil) {
        formatString = [NSString stringWithFormat:@"%@%@%@",
                        textProviderToken,
                        joinString,
                        textProviderToken];
    }
    else {
        formatString = [NSString stringWithFormat:@"%@%@",
                        textProviderToken,
                        textProviderToken];
    }

    return [self textProviderWithFormat:formatString, provider1, provider2];
}

@end
...