web-dev-qa-db-ja.com

Cocoaとストーリーボードで(NSApplication)から(NSNibExternalObjectPlaceholder)への(ストーリーボード)コンセントの接続に失敗しましたエラー

ストーリーボードに配置された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ベータ版を使用しています。そして、ストーリーボードをオンにしてテンプレートを開始しました。

12
Blaszard

上記の答えは、これがコンパイルの問題の理由ではないと正しく述べていますが、警告メッセージを完全に排除しようとしている人のために明確にしたいと思いました。これは私がこのページを見つけたときに私が探していたものでした。

アクションを作成しているときに、一部のアクションが変更されたり、ストーリーボードから削除されたりしても、アウトレットは残ります。以前の未使用のアクションがあったコントローラー/ウィンドウを選択すると、属性タブ内のストーリーボードのoutletsセグメントに引き続き表示されます。そこにある古いアクション/アウトレットを削除すると、警告が消えます。

ViewControllerとファイルの所有者の間で重複を探します。あるべきではないときに、一方または両方がこれらのオブジェクトを保持している可能性があります。それらを削除すると、これらのソフト警告が削除されます。

6
Jay Snayder
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の「ボックスタイプ」を「カスタム」に設定する必要があります。 enter image description here

以上です: enter image description here

5
two

私は正しい解決策を見つけたと思います。

enter image description here

1)オブジェクトをxibインターフェースにドラッグします。

enter image description here

2)ドラッグした左側のリストのオブジェクトをクリックします。

enter image description here

3)オブジェクトをカスタムクラスにバインドします(ここでは、私のクラスは例としてログインウィンドウコントローラーです)

enter image description here

4)Ctrlキーを押しながらボタンをソースコードにドラッグします。ポップアップウィンドウで、ファイルの所有者ではなく、クラス名(この例ではログインウィンドウコントローラー)を選択します。

これがお役に立てば幸いです。

2
ManuQiao

最近、コーディング中に別の簡単な解決策を見つけました。

これをチェックしてください。

enter image description here

1).xibファイルのドキュメントアウトラインでファイルの所有者を選択します。

enter image description here

2).xibファイルを接続するクラスを指定します。

enter image description here

3)コンセントをソースファイルに接続するときは、デフォルトのファイルの所有者を使用するだけです。はるかに簡単です。

enter image description hereenter image description here

4)今のところ十分ではないと思います。 'xxx'ペン先をロードしましたが、ビューアウトレットが設定されていませんでした 'と呼ばれる実行中に例外が発生しました。もっと何かをすべきです。

ドキュメントアウトラインでビューを選択します。新しい参照コンセントの円からドキュメントアウトラインのファイルの所有者にドラッグします。

了解しました。これが新しい簡単なソリューションです。追加のオブジェクトをxibに追加しないでください。それが機能しない場合は、以下にコメントを残してください。

2
ManuQiao