0

How to pass uiviewcontroller data to swiftui widget class i am unable to do it with app groups also write now i am sending it with userdefaults but unable to do it

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)
            
            
            }
pawello2222
  • 46,897
  • 22
  • 145
  • 209
Faraz Ahmed
  • 79
  • 10
  • Does this answer your question? [Share data between main App and Widget in SwiftUI for iOS 14](https://stackoverflow.com/questions/63922032/share-data-between-main-app-and-widget-in-swiftui-for-ios-14) – pawello2222 Oct 07 '20 at 10:30
  • @pawello2222 https://stackoverflow.com/a/64241574/12085999 I managed it to do it like this by using less code – Faraz Ahmed Oct 07 '20 at 10:35

2 Answers2

1

This solution is in swift 5.

In order to pass data between targets, you need to:

  1. create your sharedDefaults structure
  2. declare your global data variable
  3. change the variable's data from your target\viewcontroller using support variables.

First of all create a new .swift file. Go on inspector>file>target membership and select the targets you want to comunicate.

SharedDefaults helper

//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"
        
        
    }
}

Global data variable

//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 {
        
    }
}

So what's above is a get/set variable which stores and receives the data you save/get from your widget and your parent app.

Actually saving/retrieving stuff
Now to use this stuff either in your app or target, you have to

  1. Declare the support variables:
    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. Save stuff:
//Update both data and current data
  myData.append("ok")
  currentData.append("ok")
  sharedUserdefaults?.set(currentData, forKey: SharedDefault.Keys.Key)
            
  1. Delete stuff:
//Update both data and current data
  mydata.remove(at: 0)
  currentData.remove(at: 0)
  sharedUserdefaults?.set(currentData, forKey: SharedDefault.Keys.Key)

That's it!

  • Thank you so much for your guidance. I managed it by doing it something like this: extension UserDefaults { static let group = UserDefaults(suiteName: "group.com.your.domain")! } setting data: UserDefaults.group.set("objectToShare", forKey: "keyForTheObject") getting data: let object = UserDefaults.group.object(forKey: "keyForTheObject") – Faraz Ahmed Oct 07 '20 at 09:56
1

I managed it to do it like this and it worked

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

setting data:

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

getting data:

let object = UserDefaults.group.object(forKey: "keyForTheObject")
Faraz Ahmed
  • 79
  • 10