首页 > 解决方案 > 如何将 uiviewcontroller 数据传递给 swiftui 小部件类

问题描述

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

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)
            
            
            }

标签: swiftswiftuiios14widgetkit

解决方案


该解决方案在 swift 5 中。

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

  1. 创建你的 sharedDefaults 结构
  2. 声明你的全局数据变量
  3. 使用支持变量从 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 变量,它存储和接收您从小部件和父应用程序保存/获取的数据。

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

  1. 声明支持变量:
    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)
}
  1. 保存东西:
//Update both data and current data
  myData.append("ok")
  currentData.append("ok")
  sharedUserdefaults?.set(currentData, forKey: SharedDefault.Keys.Key)
            
  1. 删除东西:
//Update both data and current data
  mydata.remove(at: 0)
  currentData.remove(at: 0)
  sharedUserdefaults?.set(currentData, forKey: SharedDefault.Keys.Key)

而已!


推荐阅读