2014-09-16 19 views
9

L'ereditarietà di Swift (1.0) mi sta facendo impazzire. Posso credere di dover chiedere qualcosa così semplice ma non riesco a capirlo. Ho la mia vista personalizzata che voglio essere in grado di creare a livello di codice con init (frame: CGRect) e caricarla da storyboard nel cui caso init (coder aDecoder: NSCoder) dovrebbe essere usato per l'inizializzazione. in entrambi i casi voglio chiamare il mio metodo di configurazione personalizzato. In questo modo:Come sovrascrivere l'inizializzatore UIView in Swift 1.0

import UIKit 

class CustomView: UIView { 

    override convenience init(frame: CGRect) { 
     super.init(frame: frame) 
     self.myCustomSetup() 
    } 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     self.myCustomSetup() 
    } 

    func myCustomSetup() { 
     self.backgroundColor = UIColor.redColor() 
    } 
} 

questo non sembra funzionare, dalla documentazione rapida Capisco che ci sia un solo inizializzatore designato per la classe che tutte le comodità inizializzatori chiamata. Nel caso UIView dovrebbe essere init (coder aDecoder: NSCoder). Tuttavia, non è possibile creare aDecoder: NSCoder in init(frame: CGRect) né passare nil perché non è facoltativo. Cosa dovrei fare ? Come posso ignorarli entrambi?

+1

'initWithFrame:' ​​è anche un inizializzatore designato. –

+0

Sì, funziona, grazie. La parola chiave Convenience è stata suggerita da Xcode :-(Ok quello che non capisco è.Dalla documentazione ci dovrebbe essere solo un inizializzatore designato per classe.Tutte le altre inizializzazioni dovrebbero chiamarlo.Perché posso inizializzare la mia classe (e UIView) con due separati. Separato in senso uno non chiama l'altro designato? Cosa mi sto sbagliando? – stringCode

+1

Ne sei sicuro? Non mi sembra giusto. Forse, come linea guida, dovresti sforzarti di avere un inizializzatori poco definiti possibili, ma non ha senso limitarsi a uno. 'initWithFrame:' ​​e 'initWithCoder:' sono diversi come possono essere. –

risposta

6

Una classe deve avere almeno un inizializzatore designato. Potrebbe avere più di uno.

Tutto ciò che dovete fare per far funzionare il vostro codice è rimuovere la parola chiave convenience da init(frame: CGRect).

+0

Sì che funziona , grazie. La parola chiave Convenience è stata suggerita da Xcode :-(Ok, quello che non capisco è: dalla documentazione dovrebbe esserci solo un inizializzatore designato per classe.Tutte le altre inizializzazioni dovrebbero chiamarlo. e posso inizializzare la mia classe (e UIView) con due separati. Separato nel senso uno non chiama l'altro designato? Cosa sto sbagliando? – stringCode

+2

Una classe deve avere almeno un inizializzatore designato. Potrebbe avere più di uno. –

+0

Ok questo è quello che non avevo realizzato. Grazie ! – stringCode

Problemi correlati