首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环遍历描述按下键后屏幕上应该采取什么操作的实体。

循环遍历描述按下键后屏幕上应该采取什么操作的实体。
EN

Stack Overflow用户
提问于 2019-01-09 16:48:25
回答 1查看 51关注 0票数 0

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

我的主应用程序屏幕

我有一个核心数据应用程序,它存储一个名为Item的实体的有序列表。这些项目旨在描述活动中的一个步骤,该步骤描述了屏幕上应该发生的事情。如果您知道Mac应用程序QLab,那么每个项目就像QLab中的一个提示。

我创建了一个活动类,用于读取每一项以确定项目类型及其相关信息。一旦项目类型确定,活动类需要显示一个视图,其中包含与该特定项相关的信息,然后等待用户按下正确的箭头键,然后继续到Core数据存储中的下一个项,在那里进程重复,直到所有项被读取。每次在循环中读取新项时,用户每次按右箭头后,屏幕上的信息都会发生变化。

问题是,我不知道如何进行这方面的最佳方式,从程序上讲。我有一个以NSFetchRequest的形式检索条目数组的代码:

代码语言:javascript
复制
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)检索按键事件,还可以创建视图控制器在第二个屏幕上显示信息。我只是不知道我应该如何创建‘主循环’,也就是说,这样就可以显示信息,然后应用程序等待直到用户按下一个键才能继续.

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-10 11:22:54

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

您的NSPageController类必须符合NSPageControllerDelegate协议,并包含要显示的ViewControllers数组。

代码语言:javascript
复制
override func viewDidLoad() {
    super.viewDidLoad()
    delegate = self
    arrangedObjects = ["ViewControllerItem1", "ViewControllerItem2", "...","ViewControllerItemN" ]
}

请注意arrangedObjects文档中的NSPageController :包含显示在页面控制器视图中的对象的数组。

然后实现NSPageControllers viewControllerForIdentifier,以返回当前希望在ContainerView中显示的ViewController。

代码语言:javascript
复制
func pageController(_ pageController: NSPageController, viewControllerForIdentifier identifier: String) -> NSViewController {

switch identifier {
    case "ViewControllerItem1":
        return mainStoryboard().instantiateController(withIdentifier:"ViewControllerItem1") as? ViewControllerItem1
    case "...":
    default:
    }
}

在您实现的按键事件的操作处理程序中。

代码语言:javascript
复制
self.navigateForward(sender) or self.navigateBack(sender)

我也实现了这个方法,但我不记得是否需要它。

代码语言:javascript
复制
func pageControllerDidEndLiveTransition(_ pageController: NSPageController) {
    self.completeTransition()
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54114836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档