微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在目标之间传递数据和变量

如何解决在目标之间传递数据和变量

概述
我试图理解应用程序组,以便可以将数据和变量从主应用程序传递到扩展程序,反之亦然。

我发现的东西
我很难理解一些概念,因为我所能找到的只是其他SO问题,这些问题仅显示了如何存储和检索数据。
我什至看过this教程(并在媒体上阅读了更多内容),但我仍然感到困惑。

我在做什么
首先,我在容器应用程序和应用程序扩展中同时启用了应用程序组,并将应用程序组名称设置为group.grop

我有3个文件

  1. Shared.swift
  2. KeyboardViewController
  3. ViewController

在我的Shared.swift文件中,输入以下代码

let sharedUserdefaults = UserDefaults(suiteName: SharedDefault.suitName)
struct SharedDefault {
    static let suitName = "group.grop"
    struct Keys{
        static let letters = "letters"
    }
}

这里的结构包含我的suitName和密钥。

现在,我的键盘扩展名看起来像这样:

enter image description here

在我的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)")

现在我想发生的是:

  1. 用户按下键盘上的按钮。
  2. 数字存储在数组中。
  3. 用户打开应用程序,然后按d按钮,另一个值将存储在数组中。
  4. 标签显示数组内部的内容,另一个标签显示数组内部的元素数。

但是使用这种方法,我无法从ViewController访问lept变量。因此,例如,我无法向该数组添加任何内容,也无法调用lept.count。

问题
如何从另一个目标中的目标访问(获取值/添加项/编辑...)变量?
如果您有任何我可以用来更好地研究该主题的东西,请给我发送链接

解决方法

  1. 将您的lept修改为吸气剂,并始终从sharedDefaults获取最新值:
var lept: [Int] {
    return sharedUserdefaults?.array(forKey: SharedDefault.Keys.letters) as? [Int] ?? [Int]()
}
  1. viewDidLoad的键盘扩展名内,删除将lept数组保存到sharedDefaults的代码:

    sharedUserdefaults?.set(lept,forKey: SharedDefault.Keys.letters)

  2. 创建一个函数,该函数将对每个按钮执行相同的操作(下面,我将对所有这些代码进行一些优化):

func appendValue() {  
    var currentLept = self.lept
    currentLept.append(1)
    sharedUserdefaults?.set(currentLept,forKey: SharedDefault.Keys.letters)
   //print(currentLept) - you can print for debug purposes
}
  1. 每次按下按钮时调用该函数:
@IBAction func aaction(_ sender: Any) {
        
   appendValue()
}

这是从main targetextension发送数据的基本逻辑。

优化提示

您应该考虑使用UICollectionView来保存所有标签和按钮,并且每个单元格在方案中都将充当按钮或标签。这样,您将创建一个自定义UICollectionViewCell并仅实现一次所有操作,而不是分别处理每个按钮。

根据经验,如果您有重复至少两次的内容,则可以是tableView(仅需要垂直滚动),或者是collectionView(如果需要水平滚动)或仅占据单元格的单元屏幕宽度的一部分。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?