Цикл по объектам, которые описывают, какие действия следует предпринять на экране после нажатия клавиш - PullRequest
0 голосов
/ 09 января 2019

Пожалуйста, прости меня, если я не слишком хорошо описываю этот вопрос, я новичок в программировании приложений MacOS с использованием Swift. Я знаю, что я поступаю по этому поводу, вероятно, неправильно, и мне просто нужно, чтобы кто-то сказал мне правильный путь.

Экран моего основного приложения

У меня есть приложение Core Data, которое хранит упорядоченный список объектов, называемых Предметами. Эти элементы предназначены для описания одного шага в упражнении, описывающего, что должно происходить на экране. Если вы знаете приложение Mac QLab, то каждый элемент в QLab похож на одну реплику.

Я создал класс Activity, который предназначен для чтения каждого элемента, чтобы определить тип элемента и связанную с ним информацию. Как только тип Элемента определен, классу Activity нужно представить представление с информацией, относящейся к этому конкретному элементу, а затем подождать, пока пользователь нажмет клавишу со стрелкой вправо, чтобы затем перейти к следующему элементу в хранилище основных данных, где процесс повторяется до все пункты были прочитаны. Каждый раз, когда новый элемент читается в цикле, информация на экране должна меняться после того, как пользователь каждый раз нажимает стрелку вправо.

Проблема в том, что я не знаю точно, как лучше всего говорить об этом с программной точки зрения. У меня есть код, который получает массив предметов в виде 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), и я также могу создавать View Controllers для отображения информации на втором экране. Я просто не знаю, как мне создать, так сказать, «основной цикл», чтобы отображалась информация, а затем приложение ждет, пока пользователь не нажмет клавишу для продолжения ...

Я могу поделиться своим кодом проекта, если потребуется дополнительная информация и большое спасибо всем, кто сможет меня просветить ...:)

1 Ответ

0 голосов
/ 10 января 2019

Вы можете попробовать использовать NSPageController . В вашем NSPageController вы добавляете ContainerView, который будет отображать ViewControllers, которые отображают информацию для каждого элемента. Каждому ViewController потребуется идентификатор раскадровки, например, ViewControllerItem1 .

Ваш класс NSPageController должен соответствовать протоколу NSPageControllerDelegate и содержит для отображения массив ViewController.

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

Замечание о ограммOOBjects из документации NSPageController: Массив, содержащий объекты, отображаемые в представлении контроллера страницы.

Затем вы реализуете NSPageControllers viewControllerForIdentifier, чтобы вернуть ViewController, который вы в данный момент хотите отобразить в ContainerView.

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()
}
...