gpt4 book ai didi

swift - 将数据间接传递给不相关的 NSViewController

转载 作者:行者123 更新时间:2023-11-28 07:32:32 26 4
gpt4 key购买 nike

  • 我是 macOS 开发的新手,我正在使用 Xcode 10 和 Swift 4.2 为 macOS 开发一个项目。
  • 该项目主要包含 3 个 View Controller 。
  • 首先,ViewController(将其他两个分开的主要欢迎屏幕)有两个按钮分别调用另外两个。
  • 其次,MakeEntry View Controller 创建一个字符串数组 数据变量,使用由以下组成的表单类型结构 TextView 和保存按钮等,最终只是将所有输入数据保存到名为 carrierArray
  • 字符串数据变量数组
  • 第三,有一个 Split View Controller ,用于显示两个 subview Controller ,即EntryList>入口详情
  • EntryList(左 Pane ) 包含一个 TableView 以显示条目的标题,EntryDetail(右 Pane ) 将包含标题条目的描述(有点像macOS默认的笔记应用)

  • 我想实现一个简单的功能,即能够访问读取 那个字符串数组 名为 的变量carrierArray 是在 MakeEntry View Controller 将其保存到一个在其自己的类文件中定义的全局变量时创建的,但我想在任何地方访问该字符串数组并且以后随时。

  • 不能使用委托(delegate)和协议(protocol)、闭包、转场或 Storyboard 标识符来携带该数据,因为我不会直接导航到 Split View Controller ,也因为我想存储该数据在 Split View Controller 的右 Pane 中显示之前对其进行进一步操作(EntryDetail)
  • 我无法弄清楚是否可以使用 NSUserDefaults 或 CoreData 实现此功能。
  • 因此,我尝试在存储字符串数组字典后使用通知中心,即notifDictionary 包含一个名为 carryData 的键,将被存储为 数据对象通知中心 并且经过一些研究和一些试验和错误但没有任何运气导致无法在 Split View Controller 左 Pane 类文件即 (EntryDetail) 中获取该数据。
  • 代码片段如下,非常感谢您的帮助。

在 MakeEntry View Controller 中:

 notifDictionary = ["carryData": carrierArray]

NotificationCenter.default.post(name: NSNotification.Name(rawValue: "dataCarrier") , object: nil, userInfo: notifDictionary)

在 EntryList View Controller 中:(尝试一次使用两种类型的选择器方法,甚至一起使用它们,但都没有运气!请帮忙!)变量 datumDictdatumArray 以及 carrierArraynotifDictionary 的复制接收器

var datumDict: [String:[String]] = [:]
var datumArray: [String] = []


override func viewDidLoad() {
super.viewDidLoad()



NotificationCenter.default.addObserver(self, selector: #selector(self.getThatDict(_:)), name: NSNotification.Name(rawValue: "dataCarrier") , object: nil)

NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: "dataCarrier") , object: nil, queue: nil, using: catchNotification)

//datumArray = datumDict["carryData"]!

}




@objc func onNotification(notification:Notification)
{
print(notification.userInfo!)
}

func catchNotification(notification: Notification) -> Void
{
let theDict = notification.object as! NSDictionary
datumDict = theDict as! [String: [String]]
guard let theData = notification.userInfo!["carryData"] as? [String:[String]] else { return }
datumDict = theData
}


@objc func getThatDict(_ notification: NSNotification)
{
print(notification.userInfo ?? "")
if let dict = notification.userInfo as NSDictionary?
{
if let thatDict = dict["carryData"] as? [String: [String]]
{
datumDict = thatDict
}
}
}

最佳答案

请注意“应避免使用全局变量和单例变量”,听起来它们非常适合您要尝试做的事情。当您对 Cocoa 越来越熟悉时,您可以采用更复杂的方法来完成此操作(依赖注入(inject))。当您对 Cocoa 越来越熟悉时,请研究这一点。

创建一个简单的单例类型:

// AppState.swift

class AppState {
// Basic singleton setup:
static let shared = AppState()
private init() {} // private prevents instantiating it elsewhere

// Shared state:
var carrierArray: [String] = []
}

从您的 View Controller 访问它:

// YourViewController.swift:

@IBAction func doSomething(_ sender: Any) {
AppState.shared.carrierArray = ...
}

如果您需要在共享状态更改时更新其他 View Controller ,通知是一个很好的工具。您可以使用 carrierArray 上的 didSet 来执行此操作,或者只是手动触发通知。

关于swift - 将数据间接传递给不相关的 NSViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54274771/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com