如何将 uiviewcontroller 数据传递给 swiftui 小部件类

Posted

技术标签:

【中文标题】如何将 uiviewcontroller 数据传递给 swiftui 小部件类【英文标题】:How to pass uiviewcontroller data to swiftui widget class 【发布时间】:2020-10-07 08:44:51 【问题描述】:

,我无法使用应用程序组执行此操作,现在我也使用 userdefaults 发送它,但无法执行此操作

if let userDefaults = UserDefaults(suiteName: "group.com.soup.ios.app") 
            UserDefaults.standard.set(self.dat ?? "", forKey: "date")
            UserDefaults.standard.set(self.textData.text ?? "", forKey: "text")
        


if let userDefaults = UserDefaults(suiteName: "group.com.soup.ios.app") 

            let text = UserDefaults.standard.object(forKey: "text") as? String
            
            Text(text ?? "Add Data").lineLimit(2)
                .truncationMode(.middle)
            
            
            

【问题讨论】:

这能回答你的问题吗? Share data between main App and Widget in SwiftUI for iOS 14 @pawello2222 ***.com/a/64241574/12085999 我设法通过使用更少的代码来做到这一点 【参考方案1】:

我设法做到了,并且成功了

extension UserDefaults 
  static let group = UserDefaults(suiteName: "group.com.your.domain")!

设置数据:

UserDefaults.group.set("objectToShare", forKey: "keyForTheObject")

获取数据:

let object = UserDefaults.group.object(forKey: "keyForTheObject")

【讨论】:

【参考方案2】:

此解决方案在 swift 5 中。

为了在目标之间传递数据,您需要:

    创建您的 sharedDefaults 结构 声明您的全局数据变量 使用支持变量从您的 target\viewcontroller 更改变量的数据。

首先创建一个新的 .swift 文件。继续检查器>文件>目标成员并选择您要交流的目标。

SharedDefaults 助手

//This goes in your new swift file
let sharedUserdefaults = UserDefaults(suiteName: SharedDefault.suitName)

struct SharedDefault 
    static let suitName = "group.com.soup.ios.app"
    
    struct Keys
        static let Key = "text"
        
        
    

全局数据变量

//This goes in your new swift file
//This is an array of strings change the type by changing what's after "data:"
 var data: [String] 
    get 
     return sharedUserdefaults?.stringArray(forKey: Key) as? [String] ?? [String]()
     set 
        
    

所以上面是一个 get/set 变量,它存储和接收您从小部件和父应用程序保存/获取的数据。

实际保存/检索内容 现在要在您的应用程序或目标中使用这些东西,您必须

    声明支持变量:
    var myData: [String] = [] //This is not required but if you need to display contents in real time I'd suggest you use this. 

    var currentData = data //Helper variable to pass data to the sharedVariable

 override func viewDidLoad() 
        super.viewDidLoad()
    myData.append(contentsOf: data)

    保存资料:
//Update both data and current data
  myData.append("ok")
  currentData.append("ok")
  sharedUserdefaults?.set(currentData, forKey: SharedDefault.Keys.Key)
            
    删除内容:
//Update both data and current data
  mydata.remove(at: 0)
  currentData.remove(at: 0)
  sharedUserdefaults?.set(currentData, forKey: SharedDefault.Keys.Key)

就是这样!

【讨论】:

非常感谢您的指导。我通过这样做来管理它: extension UserDefaults static let group = UserDefaults(suiteName: "group.com.your.domain")! 设置数据:UserDefaults.group.set("objectToShare", forKey: "keyForTheObject") 获取数据:let object = UserDefaults.group.object(forKey: "keyForTheObject")

以上是关于如何将 uiviewcontroller 数据传递给 swiftui 小部件类的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据传递到 UIView 侧的嵌入式 UIViewController - Swift 5

如何在布局类似于分叉的 UIViewController 之间导航和传递数据?

如何在布局类似于fork的UIViewControllers之间导航和传递数据?

在 UIView 和 UIViewController 之间传递数据

将信息从 UINavigationController 传递到嵌入式 UIViewController

将数据从 UIViewController 传递到 UIView