Il problema con sottoclasse UITextView (e UICollectionView) è che il costruttore designato è "initWithFrame". Ma nella vita reale, quando viene caricato dallo storyboard, viene chiamato initWithCoder.Swift: sottoclasse UITextView o UICollectionView e inizializzazione corretta
class BorderedTextView: UITextView {
//will be called
init(coder: NSCoder?){
//constant values here is not an option
super.init(frame: CGRectMake(0,0,100,100), textContainer: nil)
}
//will not be called
init(frame: CGRect, textContainer: NSTextContainer!) {
super.init(frame: frame, textContainer: textContainer)
}
}
Come risultato non posso chiamare qualsiasi codice di personalizzazione dell'interfaccia utente su init e fornire qualsiasi valore di inizializzazione delle variabili Swift, tranne le impostazioni predefinite.
Suppongo che il problema possa essere risolto temporaneamente estraendo la dimensione del frame da "coder", ma non ho trovato la chiave per esso.
Qualche idea migliore dei valori dei frame hardcode?
Mi aspetto che 'super.init (coder: coder)' funzioni - e per le sottoclassi di UIView o UILabel lo fa (almeno il compilatore non si lamenta). Ma per sottoclassi di 'UITextView' fallisce con un messaggio di errore" Deve chiamare l'inizializzatore designato ... ". Un bug di Swift? –
Una possibile soluzione potrebbe essere quella di eseguire l'inizializzazione in 'awakeFromNib'. –
Hai ragione, sembra che funzioni per UIView (ho una domanda aggiornata). Ma ho anche lo stesso problema con UICollectionView, quindi il problema non è solo con UITextView. –