如果我对这个问题的描述不太好,请原谅我,我是使用Swift编写MacOS应用程序的新手。我知道我的处理方式可能是错误的,我只需要有人告诉我正确的方法即可。
我有一个Core Data应用程序,该应用程序存储一个称为Items的实体的有序列表。这些项目旨在描述活动中的单个步骤,该步骤描述了屏幕上应该发生的情况。如果您知道Mac应用程序QLab,则每个项都像QLab中的单个提示。
我创建了一个Activity类,该类旨在通读每个Item以确定Item类型及其相关信息。一旦确定了Item类型,Activity类就需要提供一个与该特定Item相关的信息的View,然后等待用户按下向右箭头键,然后继续进行Core Data存储中的下一个Item,在此重复该过程,直到所有项目均已阅读。每次在循环中读取新的项目时,用户每次按下向右箭头后,屏幕上的信息都应更改。
问题在于,我不确切地知道如何以编程的方式解决此问题的最佳方法。我有将项目数组检索为NSFetchRequest的代码:
let moc = (NSApplication.shared.mainWindow?.contentViewController?.representedObject as! NSPersistentDocument).managedObjectContext!
let fetchRequest : NSFetchRequest = Item.fetchRequest()
do {
let items = try moc.fetch(fetchRequest)
print("Found " + String(items.count) + " items to use in the activity.")
for item in items {
print(item.itemType)
// How do I pause this loop for a user keypress after using data from this Item to display?
}
} catch {
print("Error retrieving Items")
}
我可以使用NSEvent.addLocalMonitorForEvents(matching: .keyDown)
来检索keydown事件,还可以创建视图控制器以在第二个屏幕上显示信息。可以这么说,我只是不知道该如何创建“主循环”,以便显示信息,然后该应用程序等待,直到用户按下按键才能继续...
如果需要更多信息,我可以共享我的项目代码,非常感谢能启发我的人...:)
答案 0 :(得分:0)
您可以尝试使用NSPageController。在您的NSPageController中,添加一个ContainerView,它将显示显示每个项目信息的ViewController。每个ViewController将需要一个情节提要标识符,例如 ViewControllerItem1 。
您的NSPageController类必须符合NSPageControllerDelegate协议,并且包含要显示的ViewController数组。
override func viewDidLoad() {
super.viewDidLoad()
delegate = self
arrangedObjects = ["ViewControllerItem1", "ViewControllerItem2", "...","ViewControllerItemN" ]
}
NSPageController文档中有关 arrangedObjects 的说明:一个包含页面控制器视图中显示的对象的数组。
然后,您实现NSPageControllers viewControllerForIdentifier
以返回当前要在ContainerView中显示的ViewController。
func pageController(_ pageController: NSPageController, viewControllerForIdentifier identifier: String) -> NSViewController {
switch identifier {
case "ViewControllerItem1":
return mainStoryboard().instantiateController(withIdentifier:"ViewControllerItem1") as? ViewControllerItem1
case "...":
default:
}
}
在动作处理程序中,针对您实现的按键按下事件。
self.navigateForward(sender) or self.navigateBack(sender)
我也实现了这种方法,但是我不记得是否需要它。
func pageControllerDidEndLiveTransition(_ pageController: NSPageController) {
self.completeTransition()
}