Articles

Sottoclasse UIView personalizzata da un file xib

Viste personalizzate con uscite & azioni

Il modo corretto di caricare viste personalizzate da file xib è qualcosa del genere:

Nell’oggetto vista personalizzata, istanzi il file xib esattamente come ti ho detto qui sopra. 👆 L’unica differenza è che non hai bisogno di usare l’array di oggetti restituito dai metodi, ma devi collegare i tuoi oggetti vista attraverso il costruttore di interfacce, usando il Proprietario del file come punto di riferimento, più un’uscita vista contenitore personalizzata, che conterrà tutto ciò di cui hai bisogno. 🤨

// note: view object is from my previous tutorial, with autoresizing masks disabledclass CustomView: View { // this is going to be our container object @IBOutlet weak var containerView: UIView! // other usual outlets @IBOutlet weak var textLabel: UILabel! override func initialize() { super.initialize() // first: load the view hierarchy to get proper outlets let name = String(describing: type(of: self)) let nib = UINib(nibName: name, bundle: .main) nib.instantiate(withOwner: self, options: nil) // next: append the container to our view self.addSubview(self.containerView) self.containerView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate() }}

Quindi il metodo initialize qui sta solo caricando il file nib con il proprietario di self. Dopo che il processo di caricamento è finito, i vostri puntatori di uscita saranno riempiti con i valori appropriati dal file xib. C’è un’ultima cosa che dobbiamo fare. Anche le viste dal file xib sono collegate “programmaticamente” al nostro oggetto vista personalizzato, ma visivamente non lo sono. Quindi dobbiamo aggiungere la nostra vista contenitore nella gerarchia delle viste. 🤐

Se vuoi usare il tuo oggetto vista personalizzato, devi solo creare una nuova istanza da esso – all’interno di un controller di vista – e infine sentirti libero di aggiungerlo come sottoview!

Una parola su bounds, frames aka. springs e struts: f*ckng UGLY! Sono due parole. Sono considerati una cattiva pratica, quindi per favore usate l’auto layout, ho un bel tutorial sulle ancore, sono incredibili e impararle richiede circa 15 minuti. 😅

class ViewController: UIViewController { weak var customView: CustomView! override func loadView() { super.loadView() let customView = CustomView() self.view.addSubview(customView) NSLayoutConstraint.activate() self.customView = customView } override func viewDidLoad() { super.viewDidLoad() self.customView.textLabel.text = "Lorem ipsum" }}

Ecco, ora hai un oggetto UIView personalizzato completamente funzionante che carica un file xib per usarne il contenuto. Non è stato così male, vero? 🤪

Un’altra cosa in più. Se non ti piace gestire le viste programmaticamente o semplicemente non vuoi pasticciare con il metodo loadView, rimuovilo completamente. Poi mettete la parola chiave @IBOutlet proprio prima della vostra variabile di classe della vista personalizzata. Aprite il vostro storyboard usando IB, poi trascinate & un nuovo elemento UIView nel vostro controller e collegate l’uscita della vista personalizzata. Dovrebbe funzionare come per magia. 💫

Ho promesso outlet e azioni nel titolo di questa sezione, quindi parliamo un po’ di IBActions. Funzionano esattamente come ci si aspetta con i controller. Potete semplicemente agganciare un pulsante alla vostra vista personalizzata e delegare l’azione alla classe della vista personalizzata. Se vuoi inoltrare tocchi o azioni specifiche a un controller, dovresti usare il pattern di delega o andare con un semplice blocco. 😎