Не удалось подключить (раскадровку) выход из (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 here]()
![enter image description here]()
4) Догадываюсь, пока этого недостаточно. Я встретил исключение при запуске под названием "загрузил" xxx ", но выход для представления не был установлен". Мы должны сделать что-то еще.
Выберите представление в структуре документа. Перетащите из круга Новый реферирующий выход владельцу файла в структуре документа.
Хорошо, это новое более легкое решение. Никакие дополнительные объекты не должны добавляться в xib. Если это не сработает, оставьте комментарии ниже.
Ответ 4
В приведенном выше правильном правиле говорится, что это не является причиной проблем с компиляцией, я подумал, что я уточню для тех, кто просто пытается полностью исключить предупреждения. Это было то, что я искал, когда нашел эту страницу.
Когда вы создаете свои действия, а некоторые действия изменяются или удаляются в раскадровке, выходы остаются. Выберите контроллер/окно, где раньше использовались более старые неиспользуемые действия, и вы все равно увидите их в сегменте outlets
раскадровки на вкладке атрибутов. Удалите те старые действия/выходы там, а затем предупреждение исчезнет.
Найдите дубликаты между ViewController и File Owner. Один или оба могут держаться за эти объекты, когда их не должно быть. Удаление этих файлов приведет к удалению этих мягких предупреждений.