【问题标题】:Accessing WidgetCenter from Objective-C App从 Objective-C 应用程序访问 WidgetCenter
【发布时间】:2020-11-29 16:13:25
【问题描述】:

我有一个现有的 Objective-C 应用程序,并为它开发了一个 SwiftUI iOS 14 小部件。到目前为止,一切都很好。现在我正在尝试从我的 Objective-C 应用程序重新加载时间线。我知道没有用于访问 WidgetCenter 的 Objective-C api,所以我已经实现了 Apple 文档中概述的桥接步骤(至少我认为我有,因为我对 Swift 完全陌生)。我似乎无法在我的 Objective-C 应用程序中识别 Widget Center 或 WidgetCenter.shared.reloadAllTimelines()。我尝试了很多方法都没有成功,所以我一定做错了什么。任何帮助或建议将不胜感激。

【问题讨论】:

    标签: objective-c swiftui widget ios14


    【解决方案1】:

    我遇到了同样的问题。解决方案是创建一个 swift 文件,例如:WidgetKitHelper。如果它不是自动生成的,也可以使用它创建分配的 swift-objc 标头(桥接头文件),您可以手动添加它(搜索它)。 在 helper 对象中,您可以访问 widgetkit,如果您完成其余工作以从您的 objc 代码中查看 swift 代码,您可以将其用作包装器。

    提示:

    import WidgetKit
    
    @available(iOS 14.0, *)
    @objcMembers final class WidgetKitHelper: NSObject {
    
        class func reloadAllWidgets(){
    
            #if arch(arm64) || arch(i386) || arch(x86_64)
            WidgetCenter.shared.reloadAllTimelines()
            #endif
    
        }
    }
    

    obj-c 代码:

    首先导入swift代码,添加:

    #import "YourProjectName-Swift.h"
    

    那么你可以使用:

    [WidgetKitHelper reloadAllWidgets];
    

    【讨论】:

    • 这个解决方案效果很好 - 虽然你确实需要在类 func reloadAllWidgets() 之后打开“{”
    • 好的,我不知道我是否错过了某个地方,但我这样做了,并且在我的 OBJC 文件类方法 reloadAllWidgets not found 中收到警告
    • @grwilde 如果这解决了您的问题,请将其标记为答案
    • @user717452 您应该将此 widgetkithelper 添加到您的应用程序目标而不是扩展程序中,或者可能同时添加到两者中。如果这个助手类被添加到你想使用的所有目标中,它将是可见的
    • @stoutyhk 是的,如果未添加,您可以将其添加为“请勿嵌入框架”作为主项目的链接
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多