【发布时间】:2021-01-05 10:01:10
【问题描述】:
概述
我正在尝试了解应用程序组,以便我可以将数据和变量从我的主应用程序传递到我的扩展程序,反之亦然。
我发现了什么
我很难理解一些概念,因为我只能找到其他 SO 问题,这些问题仅说明了如何存储和检索数据。
我什至看过 this 教程(并在 medium 上阅读了更多内容),但我仍然感到困惑。
我在做什么
首先,我在容器应用和应用扩展中都启用了应用组,并将应用组名称设置为 group.grop。
我有 3 个文件:
- Shared.swift
- 键盘视图控制器
- 视图控制器
在我的 Shared.swift 文件中,我输入了以下代码:
let sharedUserdefaults = UserDefaults(suiteName: SharedDefault.suitName)
struct SharedDefault {
static let suitName = "group.grop"
struct Keys{
static let letters = "letters"
}
}
这里的结构包含我的 suitName 和密钥。
现在,我的键盘扩展如下所示:
在我的keyboardViewController中,视图确实加载了,我输入了以下代码:
var lept: [Int] = sharedUserdefaults?.array(forKey: SharedDefault.Keys.letters) ?? []
@IBOutlet weak var alabel: UILabel!
@IBOutlet weak var blabel: UILabel!
@IBOutlet weak var clabel: UILabel!
@IBOutlet weak var abtn: UIButton!
@IBOutlet weak var bbtn: UIButton!
@IBOutlet weak var cbtn: UIButton!
在我的 viewDidLoad 内部:
let nib = UINib(nibName: "keygrop", bundle: nil)
let objects = nib.instantiate(withOwner: self, options: nil)
view = objects[0] as? UIView
sharedUserdefaults?.set(lept, forKey: SharedDefault.Keys.letters)
guard let sharedWords = sharedUserdefaults?.array(forKey: SharedDefault.Keys.letters) else {return}
print ("My words: \(sharedWords)")
在我的 viewDidLoad 下方:
//I have one of these for every button.
@IBAction func aaction(_ sender: Any) {
lept.append(1)
sharedUserdefaults?.set(lept, forKey: SharedDefault.Keys.letters)
print(lept)
}
在我的 ViewController 中,我有另一个名为 dbutton 的按钮、两个标签和我的视图控制器内的这段代码:
guard let sharedWordss = sharedUserdefaults?.array(forKey: SharedDefault.Keys.letters) else {return}
print ("My words: \(sharedWordss)")
现在我想要发生的是:
- 用户按下键盘上的按钮。
- 一个数字被存储在一个数组中。
- 用户打开应用程序,如果他按下 d 按钮,另一个值将存储在数组中。
- 一个标签显示数组中的内容,另一个标签显示其中元素的数量。
但是使用这种方法我无法从我的 ViewController 访问 lept 变量。因此,我无法向数组中添加任何内容,也无法调用 lept.count。
问题
如何从另一个目标中的目标访问(获取值/添加项目/编辑...)变量?
如果你有什么我可以用来更好地研究这个主题的东西,请将链接发给我!
【问题讨论】:
-
你保存
Int的数组,然后尝试获取Strings的数组?您需要检索Int的数组。您的guard声明没有通过。 -
这是一个错字,我正在检索一个 int 数组
-
键盘扩展不与主机应用程序通信。键盘可能出现在不同的应用程序中,而您的应用程序甚至可能没有运行。它们彼此独立。这就是为什么让他们彼此“交谈”的唯一方法是通过保存的信息。
-
@matt 是的,我知道他们是独立的。我如何保存信息?核心数据?
-
matt 想告诉你,交流不会立即发生或反应性发生。您需要将它保存在一个地方,然后从另一个地方的 sharedDefaults 中获取它。它不是像委托那样的通信,也不是回调等。
标签: ios swift keyboard ios-app-extension ios-app-group