ストーリーボードに配置されたUIコンポーネントをIBOutlet
またはIBAction
としてViewController.Swift
に接続するサンプルCocoaアプリを作成しようとしました。ただし、ストーリーボード上のUIコンポーネント(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
}
}
}
OS X 10.10YosemiteでXcode6ベータ版を使用しています。そして、ストーリーボードをオンにしてテンプレートを開始しました。
上記の答えは、これがコンパイルの問題の理由ではないと正しく述べていますが、警告メッセージを完全に排除しようとしている人のために明確にしたいと思いました。これは私がこのページを見つけたときに私が探していたものでした。
アクションを作成しているときに、一部のアクションが変更されたり、ストーリーボードから削除されたりしても、アウトレットは残ります。以前の未使用のアクションがあったコントローラー/ウィンドウを選択すると、属性タブ内のストーリーボードのoutlets
セグメントに引き続き表示されます。そこにある古いアクション/アウトレットを削除すると、警告が消えます。
ViewControllerとファイルの所有者の間で重複を探します。あるべきではないときに、一方または両方がこれらのオブジェクトを保持している可能性があります。それらを削除すると、これらのソフト警告が削除されます。
Failed to connect (storyboard) outlet from (NSApplication) to (NSNibExternalObjectPlaceholder): missing setter or instance variable
IBActionメソッドは正常に機能します。Apple開発フォーラム:
"これは既知の問題です...メッセージは無害であり、コードに問題があることを示していません。"
Apple Dev Forums:OS Xストーリーボードの失敗
それがあなたのコードが機能しない理由ではありません、あなたは以下を修正する必要があります:
A)タイトルを設定するための作業コードは次のとおりです-self.titleの代わりにself.view.window.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の「ボックスタイプ」を「カスタム」に設定する必要があります。
以上です:
私は正しい解決策を見つけたと思います。
1)オブジェクトをxibインターフェースにドラッグします。
2)ドラッグした左側のリストのオブジェクトをクリックします。
3)オブジェクトをカスタムクラスにバインドします(ここでは、私のクラスは例としてログインウィンドウコントローラーです)
4)Ctrlキーを押しながらボタンをソースコードにドラッグします。ポップアップウィンドウで、ファイルの所有者ではなく、クラス名(この例ではログインウィンドウコントローラー)を選択します。
これがお役に立てば幸いです。
最近、コーディング中に別の簡単な解決策を見つけました。
これをチェックしてください。
1).xibファイルのドキュメントアウトラインでファイルの所有者を選択します。
2).xibファイルを接続するクラスを指定します。
3)コンセントをソースファイルに接続するときは、デフォルトのファイルの所有者を使用するだけです。はるかに簡単です。
4)今のところ十分ではないと思います。 'xxx'ペン先をロードしましたが、ビューアウトレットが設定されていませんでした 'と呼ばれる実行中に例外が発生しました。もっと何かをすべきです。
ドキュメントアウトラインでビューを選択します。新しい参照コンセントの円からドキュメントアウトラインのファイルの所有者にドラッグします。
了解しました。これが新しい簡単なソリューションです。追加のオブジェクトをxibに追加しないでください。それが機能しない場合は、以下にコメントを残してください。