如何解决在目标之间传递数据和变量
概述
我试图理解应用程序组,以便可以将数据和变量从主应用程序传递到扩展程序,反之亦然。
我发现的东西
我很难理解一些概念,因为我所能找到的只是其他SO问题,这些问题仅显示了如何存储和检索数据。
我什至看过this教程(并在媒体上阅读了更多内容),但我仍然感到困惑。
我在做什么
首先,我在容器应用程序和应用程序扩展中同时启用了应用程序组,并将应用程序组名称设置为group.grop
。
- Shared.swift
- KeyboardViewController
- ViewController
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)")
现在我想发生的是:
但是使用这种方法,我无法从ViewController访问lept
变量。因此,例如,我无法向该数组添加任何内容,也无法调用lept.count。
问题
如何从另一个目标中的目标访问(获取值/添加项/编辑...)变量?
如果您有任何我可以用来更好地研究该主题的东西,请给我发送链接!
解决方法
- 将您的
lept
修改为吸气剂,并始终从sharedDefaults
获取最新值:
var lept: [Int] {
return sharedUserdefaults?.array(forKey: SharedDefault.Keys.letters) as? [Int] ?? [Int]()
}
-
在
viewDidLoad
的键盘扩展名内,删除将lept
数组保存到sharedDefaults
的代码:sharedUserdefaults?.set(lept,forKey: SharedDefault.Keys.letters)
-
创建一个函数,该函数将对每个按钮执行相同的操作(下面,我将对所有这些代码进行一些优化):
func appendValue() {
var currentLept = self.lept
currentLept.append(1)
sharedUserdefaults?.set(currentLept,forKey: SharedDefault.Keys.letters)
//print(currentLept) - you can print for debug purposes
}
- 每次按下按钮时调用该函数:
@IBAction func aaction(_ sender: Any) {
appendValue()
}
这是从main target
到extension
发送数据的基本逻辑。
优化提示
您应该考虑使用UICollectionView
来保存所有标签和按钮,并且每个单元格在方案中都将充当按钮或标签。这样,您将创建一个自定义UICollectionViewCell并仅实现一次所有操作,而不是分别处理每个按钮。
根据经验,如果您有重复至少两次的内容,则可以是tableView(仅需要垂直滚动),或者是collectionView(如果需要水平滚动)或仅占据单元格的单元屏幕宽度的一部分。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。