将数据间接传递给不相关的 NSViewController
Passing Data Indirectly to an Unrelated NSViewController
- 我是 macOS 开发的新手,我正在使用 Xcode 10 和 Swift 4.2 开发一个 macOS 项目。
- 该项目主要包含 3 个视图控制器。
- 首先,ViewController(将另外两个分开的主欢迎屏幕)有两个按钮可以调用另一个分别两个。
- 其次,MakeEntry 视图控制器创建一个字符串数组 数据变量使用由文本视图和保存按钮等组成的表单类型结构,最终将所有输入数据保存到一个字符串数组数据变量中,称为carrierArray
- 第三,有一个split view controller用于显示两个children view controller 即 EntryList 和 EntryDetail
EntryList(左窗格) 包含一个 Table 视图以显示条目的标题和 EntryDetail(右窗格)会包含标题条目的描述(有点像macOS默认的笔记app)
我想实现能够访问或读取的简单功能名为 carrierArray 的字符串数组 是在 MakeEntry 视图控制器将其保存到 全局变量时创建的在其自己的 class 文件中定义 但我想以后随时随地访问该字符串数组。
- 我不能使用委托和协议、闭包、转场或故事板标识符来携带该数据,因为我没有导航到拆分直接查看控制器,还因为我想 存储该数据
进一步操作,然后在拆分视图控制器的右窗格中显示它(EntryDetail)。
- 我无法弄清楚是否可以使用 NSUserDefaults 或 CoreData 实现此功能。
- 因此,在 存储 字符串数组 之后,我尝试使用 通知中心 Dictionary 即 notifDictionary 包含一个名为 carryData 将被存储为 通知中心 的 数据 object 并且经过一些研究和试验错误但没有任何运气导致无法在拆分视图控制器左窗格 class 文件中获取该数据,即 (EntryDetail).
- 代码片段如下,非常感谢您的帮助。
在 MakeEntry 视图控制器中:
notifDictionary = ["carryData": carrierArray]
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "dataCarrier") , object: nil, userInfo: notifDictionary)
在 EntryList 视图控制器中:
(尝试一次使用两种类型的选择器方法,甚至一起使用它们,但都没有运气!请帮忙!)
变量 datumDict 和 datumArray 以及 carrierArray 和 notifDictionary[ 的复制接收器。 =77=]
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
}
}
}
需要注意的是 "globals and singletons should be avoided," 听起来它们非常适合您的尝试。当您对 Cocoa 越来越熟悉时,您可以采用更复杂的方法来完成此操作(依赖注入)。当您对 Cocoa.
越来越熟悉时,请查看此内容
创建一个简单的单例类型:
// AppState.swift
class AppState {
// Basic singleton setup:
static let shared = AppState()
private init() {} // private prevents instantiating it elsewhere
// Shared state:
var carrierArray: [String] = []
}
从您的视图控制器访问它:
// YourViewController.swift:
@IBAction func doSomething(_ sender: Any) {
AppState.shared.carrierArray = ...
}
如果您需要在共享状态更改时更新其他视图控制器,通知是一个很好的工具。您可以在 carrierArray
上使用 didSet
来执行此操作,或者只需手动触发通知。
- 我是 macOS 开发的新手,我正在使用 Xcode 10 和 Swift 4.2 开发一个 macOS 项目。
- 该项目主要包含 3 个视图控制器。
- 首先,ViewController(将另外两个分开的主欢迎屏幕)有两个按钮可以调用另一个分别两个。
- 其次,MakeEntry 视图控制器创建一个字符串数组 数据变量使用由文本视图和保存按钮等组成的表单类型结构,最终将所有输入数据保存到一个字符串数组数据变量中,称为carrierArray
- 第三,有一个split view controller用于显示两个children view controller 即 EntryList 和 EntryDetail
EntryList(左窗格) 包含一个 Table 视图以显示条目的标题和 EntryDetail(右窗格)会包含标题条目的描述(有点像macOS默认的笔记app)
我想实现能够访问或读取的简单功能名为 carrierArray 的字符串数组 是在 MakeEntry 视图控制器将其保存到 全局变量时创建的在其自己的 class 文件中定义 但我想以后随时随地访问该字符串数组。
- 我不能使用委托和协议、闭包、转场或故事板标识符来携带该数据,因为我没有导航到拆分直接查看控制器,还因为我想 存储该数据 进一步操作,然后在拆分视图控制器的右窗格中显示它(EntryDetail)。
- 我无法弄清楚是否可以使用 NSUserDefaults 或 CoreData 实现此功能。
- 因此,在 存储 字符串数组 之后,我尝试使用 通知中心 Dictionary 即 notifDictionary 包含一个名为 carryData 将被存储为 通知中心 的 数据 object 并且经过一些研究和试验错误但没有任何运气导致无法在拆分视图控制器左窗格 class 文件中获取该数据,即 (EntryDetail).
- 代码片段如下,非常感谢您的帮助。
在 MakeEntry 视图控制器中:
notifDictionary = ["carryData": carrierArray]
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "dataCarrier") , object: nil, userInfo: notifDictionary)
在 EntryList 视图控制器中: (尝试一次使用两种类型的选择器方法,甚至一起使用它们,但都没有运气!请帮忙!) 变量 datumDict 和 datumArray 以及 carrierArray 和 notifDictionary[ 的复制接收器。 =77=]
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
}
}
}
需要注意的是 "globals and singletons should be avoided," 听起来它们非常适合您的尝试。当您对 Cocoa 越来越熟悉时,您可以采用更复杂的方法来完成此操作(依赖注入)。当您对 Cocoa.
越来越熟悉时,请查看此内容创建一个简单的单例类型:
// AppState.swift
class AppState {
// Basic singleton setup:
static let shared = AppState()
private init() {} // private prevents instantiating it elsewhere
// Shared state:
var carrierArray: [String] = []
}
从您的视图控制器访问它:
// YourViewController.swift:
@IBAction func doSomething(_ sender: Any) {
AppState.shared.carrierArray = ...
}
如果您需要在共享状态更改时更新其他视图控制器,通知是一个很好的工具。您可以在 carrierArray
上使用 didSet
来执行此操作,或者只需手动触发通知。