2015-11-19 11 views
6

デリゲートと呼ばれるプロパティを使って "DeletableImageViewDelegate"と定義したプロトコルを使用するクラス "DeletableImageView"(.swift + .xib)を作成しました。明瞭にするためにxibのカスタムクラスからデリゲートを接続するには?

例:

DeletableImageView.swift

protocol DeletableImageViewDelegate { 
    func deleteImageWithTag(tag: Int!) -> (Bool) 
    func addImageOnViewWithTag(tag: Int!) -> (Bool) 
    ... 
} 

class DeletableImageView: UIView { 

    var view: UIView! 
    var delegate: DeletableImageViewDelegate? 

    // Some random methods + some use of the delegate protocol's methods 
    ... 
} 

私の問題は、今、私が(関連する.xibファイルからコントローラに私のクラスを使用しようとするとどの私はインターフェイスビルダーでビューをドラッグアンドドロップして、このビューにDeletableImageViewクラスを割り当てます)。(たとえこのプロパティをIBOutletとして宣言しても)デリゲートプロパティをリンクすることはできません。

は、私は何をすることができるようにしたいことはある.xibで「ファイルの所有者」への直接リンクビューのデリゲートアウトレットをする

あなたからデータソースとデリゲートをリンクする際にあなたがまったく同じことテーブルビューは.xibファイルに直接あります。

しかし、私がコントロールドラッグすると、リンクされません。

誰が何が起こっているのか分かりませんか?

ありがとうございました。これを実行する必要がありますなぜあなたは尋ねるかもしれません

@objc protocol DeletableImageViewDelegate { 
    ... 
} 

:あなたがする必要がある

+0

ファイル所有者はプロトコルに準拠していますか? – luk2302

+0

はいファイルの所有者がプロトコルに準拠しています... –

+0

私の問題を理解するために作成したビデオは次のとおりです:https:// youtu。be/clYFj6dkaWk –

答えて

1

まず最初は、それがどのように見えるように、あなたのプロトコル定義のからで@objcを追加することです。ストーリーボードにデリゲートプロパティを追加し、ストーリーボードで表示できるプロパティを設定するには、@IBOutletの接頭辞が必要です。その接頭辞はObjective Cプロトコルである必要があります。

だから、あなたがやりたい次の事はあなたが右の我々は、デリゲートのプロパティを公開することを意味し、あなたがこのような何かを取得するインタフェースビルダでビューをクリックすると今var delegate: DeletableImageViewDelegate?

@IBOutlet var delegate: DeletableImageViewDelegate? 

を変更でインターフェイスビルダーに送信します。あなたが所有者をファイルに接続しようとした場合、ファイルの所有者はまだそのプロトコルを実装していないため Exposed property

(たとえばUIViewControllerのために)、それは動作しません。あなたが書く必要があり、それを実装するには:

extension UIViewController : DeletableImageViewDelegate { 
    // Implementation 
} 

あなたがいることを実行した後、あなたは、このようにデリゲートメソッドメッセージを受信、ビューコントローラにデリゲートプロパティを接続することができます。いずれの場合も、ファイル所有者はプロトコルを実装する必要があります。

+0

私はそれを試しましたが、まだ動作していません、私はこれがXCodeのバグかもしれないのだろうかと思っています。新しいバージョンは私の.xib(または多分) .. まだビューをファイルにリンクすることはできません... 私は正確に私は**私はストーリーボードを使用しません!!! **、おそらくこれはなぜ動作していないのですか? –

+0

ここに私の問題を理解するのを助けるために作られたビデオがあります:https://youtu.be/clYFj6dkaWk –

+0

あなたの削除可能なビューは、xibのメインビューのサブビューです。 'UIView'に拡張機能を追加すると、良いものになるはずです。 –

0

私はコメントと同様のソリューションを作成しました。しかし、毎回代理人をキャストしてプロトコルの実装をチェックする必要もないようにしたいと思っています。

weak var delegate: MenuViewDelegate? 
@IBOutlet weak var _delegate: AnyObject? { 
    didSet { 
     if let d = _delegate { 
      if let d = (d as? MenuViewDelegate) { 
       delegate = d 
      } else { 
       print("ERROR: delegate does not implement \(d) MenuViewDelegate protocol") 

       d as! MenuViewDelegate 
      } 
     } 
    } 
} 
関連する問題