遍历描述在按键后应在屏幕上采取什么操作的实体

时间:2019-01-09 16:48:25

标签: swift xcode macos loops onkeypress

如果我对这个问题的描述不太好,请原谅我,我是使用Swift编写MacOS应用程序的新手。我知道我的处理方式可能是错误的,我只需要有人告诉我正确的方法即可。

My main app screen

我有一个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事件,还可以创建视图控制器以在第二个屏幕上显示信息。可以这么说,我只是不知道该如何创建“主循环”,以便显示信息,然后该应用程序等待,直到用户按下按键才能继续...

如果需要更多信息,我可以共享我的项目代码,非常感谢能启发我的人...:)

1 个答案:

答案 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()
}