2015-11-19 14 views
6

Ich habe eine Klasse "DeletableImageView" (.swift + .xib) erstellt, die das Protokoll verwendet, das ich als "DeletableImageViewDelegate" durch eine Eigenschaft definiert habe, die ich Delegat nannte.Wie verbinden Delegaten von benutzerdefinierten Klasse in Xib?

Beispiel aus Gründen der Klarheit:

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 
    ... 
} 

Mein Problem ist, dass jetzt, wenn ich versuche, meine Klasse in einem Controller aus der zugehörigen .xib-Datei zu verwenden (die bedeutet, dass ich eine Ansicht in den Schnittstellen-Builder ziehen und ablegen und dieser Ansicht die DeletableImageView-Klasse zuweisen kann. Ich kann die Eigenschaft delegate nicht verknüpfen (auch wenn ich diese Eigenschaft als IBOutlet deklariere).

Was ich möchte in der Lage sein zu tun ist, um direkt Link des Delegierten-Buchse im Hinblick auf die „Datei Besitzer“ in der .xib

Genau das gleiche, was Sie tun, wenn Sie Datenquelle und delegieren Link von einer Tabellenansicht direkt in der .xib-Datei.

Aber wenn ich control-ziehen, werden sie nicht miteinander verknüpfen.

Hat jemand eine Idee von dem, was passiert?

Vielen Dank.

+0

Entspricht der Dateibesitzer dem Protokoll? – luk2302

+0

Ja, der Besitzer der Datei entspricht dem Protokoll ... –

+0

Hier ist ein Video, das ich gemacht habe, um Ihnen zu helfen, mein Problem zu verstehen: https: // youtu.be/clYFj6dkaWk –

Antwort

1

Das erste, was Sie tun müssen, ist @objc in aus Ihrer Protokolldefinition hinzufügen, so dass es wie folgt aussieht:

@objc protocol DeletableImageViewDelegate { 
    ... 
} 

Sie vielleicht fragen warum müssen Sie dies tun. Das liegt daran, dass Sie dem Storyboard eine Delegateneigenschaft hinzufügen möchten, und um eine Eigenschaft für das Storyboard sichtbar zu machen, muss sie das Präfix @IBOutlet haben, und dieses Präfix erfordert, dass es sich um das Ziel-C-Protokoll handelt.

Also das nächste, was Sie tun möchten, ist der Wandel var delegate: DeletableImageViewDelegate? zu

@IBOutlet var delegate: DeletableImageViewDelegate? 

Nun, wenn Sie direkt im Interface Builder auf die Ansicht, klicken Sie so etwas wie diese erhalten werden, was bedeutet, dass wir unsere Delegierten Eigentum ausgesetzt an den Schnittstellenersteller. Exposed property

Wenn Sie versuchen, es zu verbinden Besitzer in einer Datei (zum Beispiel UIViewController), wird es nicht funktionieren, weil die Dateien Besitzer immer noch nicht das Protokoll implementieren. Um es implementieren Sie schreiben müssen:

extension UIViewController : DeletableImageViewDelegate { 
    // Implementation 
} 

Nachdem Sie das tun, sollten Sie in der Lage sein, zu delegieren Eigenschaft auf den View-Controller zu verbinden, so Delegatmethode Empfangen von Nachrichten. In jedem Fall muss Ihr Dateibesitzer das Protokoll implementieren.

+0

Ich habe es versucht, aber es funktioniert immer noch nicht, ich beginne mich zu fragen, ob das ein Fehler von XCode sein könnte, weil die neue Version viele Probleme mit meinen .xib (s) hat oder vielleicht auf meinem Mac. .. Es ist immer noch nicht möglich, die Ansicht mit der Datei ower zu verknüpfen ... Ich würde gerne präzisieren, dass ich ** ** ** * STORYBOARDS NICHT VERWENDE, vielleicht ist das deshalb, warum es nicht funktioniert? –

+0

Hier ist ein Video, das ich gemacht habe, um Ihnen zu helfen, mein Problem zu verstehen: https://youtu.be/clYFj6dkaWk –

+0

Jetzt sehe ich, dass Ihre löschbare Ansicht eine Unteransicht der Hauptansicht in der XIB ist. Fügen Sie der 'UIView' Erweiterung hinzu und Sie sollten gut sein. –

0

Ich habe eine ähnliche Lösung wie in den Kommentaren erstellt. Aber ich wollte auch nicht jedes Mal Delegate werfen und auf Protokollimplementierung prüfen müssen.

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 
      } 
     } 
    } 
}