Как я могу установить VC в режиме Liveview на игровых площадках? - PullRequest
0 голосов
/ 27 декабря 2018

В настоящее время я работаю над небольшим проектом Playgrounds (для macOS) и пытаюсь установить свой собственный View Controller в качестве Live View.Следующая строка не работает.

PlaygroundPage.current.liveView = ViewController()

При выполнении этого я получаю следующую ошибку.

error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).

Я получаю ту же ошибку при использовании этого:

PlaygroundPage.current.liveView = ViewController(nibName: NSNib.Name("MyView"), bundle: Bundle.main)

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

Ваша ошибка связана с тем, что у вашего ViewController() нет просмотров.Здесь ссылка на документацию .

Если вы передадите nil для nibNameOrNil, то nibName вернет nil, а loadView выдаст исключение;в этом случае вы должны вызвать setView: перед вызовом view или переопределить loadView.

Одно из возможных исправлений:

let myVC = NSViewController()
myVC.view = NSView()

PlaygroundPage.current.liveView = myVC

Во втором случае вы указали владельца файлаВаш NIB к текущему контроллеру представления, как сказано в документации ?

В указанном файле nib обычно должен быть установлен класс владельца файла, равный NSViewController, или пользовательский подкласс срозетка вида, соединенная с видом.

0 голосов
/ 28 декабря 2018

Выберите «Файл»> «Создать»> «Playground» и начните с шаблона MacOS Playground под названием «Single View».Это даст вам представление в кончике.

Теперь измените код на игровой площадке следующим образом:

import AppKit
import PlaygroundSupport

class ViewController : NSViewController {}

let nibFile = NSNib.Name("MyView")
var topLevelObjects : NSArray?

Bundle.main.loadNibNamed(nibFile, owner:nil, topLevelObjects: &topLevelObjects)
let views = (topLevelObjects as! Array<Any>).filter { $0 is NSView }

let vc = ViewController()
vc.view = views[0] as! NSView
PlaygroundPage.current.liveView = vc

Запустите игровую площадку и посмотрите на панель Assistant Editor.Вы увидите это:

enter image description here


РЕДАКТИРОВАТЬ Мне кажется, что более приятный способ написать это (размещениерешение о том, где получить его представление в руках самого контроллера представления) будет следующим:

class ViewController : NSViewController {
    override func loadView() {
        let nibFile = NSNib.Name("MyView")
        var topLevelObjects : NSArray?
        Bundle.main.loadNibNamed(
            nibFile, owner:nil, topLevelObjects: &topLevelObjects)
        let views = (topLevelObjects as! Array<Any>).filter { $0 is NSView }
        self.view = views[0] as! NSView
    }
}
PlaygroundPage.current.liveView = ViewController()
0 голосов
/ 28 декабря 2018

Возможно, вы захотите включить следующее:

PlaygroundPage.current.liveView = ViewController()
PlaygroundPage.current.needsIndefiniteExecution = true

Я прилагаю ссылку на аналогичный вопрос: Как настроить ViewController в игровых площадках? Дайте мне знать, если это поможет!

...