2015-11-19 26 views
6

Ho creato una classe "DeletableImageView" (.swift + .xib) che utilizza il protocollo definito come "DeletableImageViewDelegate" tramite una proprietà che ho chiamato delegato.Come connettere un delegato dalla classe personalizzata in xib?

Esempio per motivi di chiarezza:

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

Il mio problema è che ora, quando cerco di usare la mia classe in un controllore dal file .xib associato (che significa che trascino una vista nel builder dell'interfaccia e assegni la classe DeletableImageView a questa vista) Non posso collegare la proprietà delegate (anche se dichiaro questa proprietà come IBOutlet).

Quello che voglio essere in grado di fare è direttamente collegamento presa delegato della vista al "Manuale di file" nella .xib

la stessa cosa che si fa quando si collega origine dati e delegato da un tabella direttamente nel file .xib.

Ma quando controllo-trascinamento non collegheranno insieme.

Qualcuno ha idea di cosa sta succedendo?

Grazie mille.

+0

Il proprietario del file è conforme al protocollo? – luk2302

+0

Sì, il proprietario del file è conforme al protocollo ... –

+0

Ecco un video che ho realizzato per aiutarti a capire il mio problema: https: // youtu.be/clYFj6dkaWk –

risposta

1

La prima cosa che dovete fare è aggiungere @objc da del vostro definizione di protocollo, in modo che assomiglia a:

@objc protocol DeletableImageViewDelegate { 
    ... 
} 

Si potrebbe chiedere perché avete bisogno di fare questo. È perché desideri aggiungere proprietà delegate allo storyboard e, per impostare alcune proprietà visibili tramite lo storyboard, deve avere il prefisso @IBOutlet e tale prefisso richiede che sia il protocollo Objective C.

Quindi la prossima cosa che vuoi fare è cambiare var delegate: DeletableImageViewDelegate? a

@IBOutlet var delegate: DeletableImageViewDelegate? 

Ora, se si fa clic destro sulla vista del costruttore di interfaccia si otterrà qualcosa di simile, il che significa che abbiamo esposto la nostra proprietà delegato al costruttore dell'interfaccia. Exposed property

Se si tenta di connettersi in un file proprietario (ad esempio UIViewController), non funzionerà perché il proprietario del file ancora non implementa quel protocollo. Per attuarla è necessario scrivere:

extension UIViewController : DeletableImageViewDelegate { 
    // Implementation 
} 

Dopo aver fatto questo, si dovrebbe essere in grado di connettersi proprietà delegato al controller della vista, ricevendo così messaggi metodo delegato. In ogni caso il proprietario del file deve implementare il protocollo.

+0

L'ho provato ma non funziona ancora, sto iniziando a chiedermi se questo potrebbe essere un bug di XCode perché la nuova versione ha un sacco di problemi con il mio .xib (s) o forse è giusto sul mio mac. .. Non è ancora possibile collegare la vista al file ower ... Mi piacerebbe precisare che I ** NON UTILIZZO STORYBOARD !!! **, forse questo è il motivo per cui non funziona? –

+0

Ecco un video che ho realizzato per aiutarti a capire il mio problema: https://youtu.be/clYFj6dkaWk –

+0

Ora vedo che la tua vista cancellabile è una sottoview della vista principale nello xib. Aggiungi l'estensione a 'UIView' e dovresti essere bravo. –

0

Ho creato una soluzione simile a quella dei commenti. Ma ho anche voluto non dover eseguire il cast delegato ogni volta e controllare l'implementazione del protocollo.

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