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?
'initWithFrame:' è anche un inizializzatore designato. –
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
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. –