swift - 循环遍历描述按键后应在屏幕上执行哪些操作的实体

标签 swift xcode macos loops onkeypress

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

My main app screen

我有一个核心数据应用程序,用于存储名为“项目”的有序实体列表。这些项目旨在描述事件中的单个步骤,该事件描述了屏幕上应发生的情况。如果您了解 Mac 应用程序 QLab,每个项目就像 QLab 中的单个提示。

我创建了一个 Activity 类,旨在读取每个 Item 以确定 Item 类型及其相关信息。一旦确定了 Item 类型,Activity 类就需要呈现一个包含与该特定 Item 相关信息的 View ,然后等待用户按下右箭头键,然后继续处理核心数据存储中的下一个 Item,该过程会重复进行,直到所有项目均已阅读。每次在循环中读取新的 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 事件,并且我还可以创建 View Controller 以在第二个屏幕上显示信息。我只是不知道应该如何创建“主循环”,可以这么说,以便显示信息,然后应用程序等待用户按下某个键继续...

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

最佳答案

您可以尝试使用 NSPageController 。在您的 NSPageController 中,您添加一个 ContainerView,它将显示显示每个项目信息的 ViewController。每个 ViewController 都需要一个 Storyboard标识符,例如ViewControllerItem1

您的 NSPageController 类必须符合 NSPageControllerDelegate 协议(protocol)并包含要显示的 ViewController 数组。

override func viewDidLoad() {
    super.viewDidLoad()
    delegate = self
    arrangedObjects = ["ViewControllerItem1", "ViewControllerItem2", "...","ViewControllerItemN" ]
}

关于 NSPageController 文档中的 arrangedObjects 的注意事项:包含页面 Controller View 中显示的对象的数组。

然后,您实现 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()
}

关于swift - 循环遍历描述按键后应在屏幕上执行哪些操作的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54114836/

相关文章:

Xcode 7 beta swift 应用程序在运行时崩溃并出现 EXC_BAD_ACCESS 错误

ios - 激活搜索栏不会隐藏导航栏

ios - 我想编写一个 iOS 应用程序并在我自己的手机上严格运行它供我自己使用。可能的?

ios - dyld:未加载库:@rpath/libswiftAVFoundation.dylib 原因:找不到图像

ios - 使用 constraintsWithVisualFormat 的自动布局效果不佳

ios - 有没有办法测试涉及evaluatePolicy(:localizedReason:reply:)

ios - 在最新的 XCode 中合成

macos - 控制台错误 'Unable to clear quarantine' 是什么意思?

c++ - 在远程机器上编译的调试过程

ios - 我如何调用这个复杂的 NSURLSession?