Не удалось подключить (раскадровку) выход из (NSApplication) к ошибке (NSNibExternalObjectPlaceholder) в Cocoa и раскадровке

Я попытался создать пример приложения Cocoa, на котором я хочу подключить компоненты пользовательского интерфейса, размещенные на раскадровке, до ViewController.swift как либо IBOutlet, так и IBAction. Однако, когда я попытался контролировать, перетащите компоненты пользовательского интерфейса на раскадровку (например, NSButton) на ViewController.swift и создайте метод @IBAction, а затем запустите приложение, результирующее приложение зарегистрирует следующее сообщение на консоли и конечно, приложение не реагирует на меня нажатием кнопки.

Failed to connect (storyboard) outlet from (NSApplication) to (NSNibExternalObjectPlaceholder): missing setter or instance variable

Как я могу правильно использовать метод IBAction?

Для информации здесь моя ViewController.swift:

import Cocoa

class ViewController: NSViewController {
    @IBOutlet var txtTitle : NSTextField
    @IBOutlet var boxColor : NSBox

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    func colorChanged(cp: NSColorPanel) {
        let c:NSColor = cp.color;
        self.boxColor.fillColor = c
    }

    @IBAction func btnSetColor(sender : AnyObject) {
        let cp:NSColorPanel = NSColorPanel.sharedColorPanel()
        cp.setTarget(self)
        cp.setAction("colorChanged:")
        cp.orderFront(nil)

    }

    @IBAction func btnSetWindowTitle(sender : AnyObject) {
        if self.txtTitle.stringValue != "" {
            println(self.title)
            println(self.txtTitle.stringValue)
            self.title = self.txtTitle.stringValue
        }
    }
}

Я использую Xcode 6 beta на OS X 10.10 Yosemite. И запустил шаблон с раскадрой.

Ответ 1

Failed to connect (storyboard) outlet from (NSApplication) to (NSNibExternalObjectPlaceholder): missing setter or instance variable

Методы IBAction, работающие как следует, см. в Apple Dev Forums:

"Это известная проблема... Сообщения безвредны и не укажите проблему с вашим кодом."

Форумы Apple Dev: отказ от раскадровки OS X

Вот почему ваш код не работает, вам нужно исправить следующее:

A) Вот мой рабочий код, чтобы установить заголовок - используя self.view.window.title вместо self.title:

@IBAction func btnSetWindowTitle(sender : AnyObject) {
    if self.txtTitle.stringValue != "" {
        println(self.view.window.title)
        println(self.txtTitle.stringValue)
        self.view.window.title = self.txtTitle.stringValue
    }
}

B) В Interface Builder вам нужно установить NSBox "Box Type" в "Custom": enter image description here

И что это: enter image description here

Ответ 2

Думаю, я понял правильное решение.

enter image description here

1) Перетащите объект в xib-интерфейс.

enter image description here

2) Щелкните объект в левом списке, который вы только что перетащили.

enter image description here

3) Привяжите объект к своему пользовательскому классу. (Здесь мой класс - это контроллер окна входа в систему)

enter image description here

4) Ctrl перетащите кнопку в исходный код. В всплывающем окне выберите имя своего класса (здесь в примере - контроллер окна входа), а не владелец файла.

Надеюсь, это поможет вам.

Ответ 3

В наше время я нашел еще одно упрощенное решение при кодировании.

Проверьте это.

enter image description here

1) Выберите File Owner в документе Outline в файле .xib.

enter image description here

2) Укажите класс, с которым хотите подключиться файл .xib.

enter image description here

3) Теперь, когда вы подключаете розетку к исходному файлу, просто используйте Default File Owner. Намного легче.

enter image description hereenter image description here

4) Догадываюсь, пока этого недостаточно. Я встретил исключение при запуске под названием "загрузил" xxx ", но выход для представления не был установлен". Мы должны сделать что-то еще.

Выберите представление в структуре документа. Перетащите из круга Новый реферирующий выход владельцу файла в структуре документа.

Хорошо, это новое более легкое решение. Никакие дополнительные объекты не должны добавляться в xib. Если это не сработает, оставьте комментарии ниже.

Ответ 4

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

Когда вы создаете свои действия, а некоторые действия изменяются или удаляются в раскадровке, выходы остаются. Выберите контроллер/окно, где раньше использовались более старые неиспользуемые действия, и вы все равно увидите их в сегменте outlets раскадровки на вкладке атрибутов. Удалите те старые действия/выходы там, а затем предупреждение исчезнет.

Найдите дубликаты между ViewController и File Owner. Один или оба могут держаться за эти объекты, когда их не должно быть. Удаление этих файлов приведет к удалению этих мягких предупреждений.