Subclasa UIView personalizat dintr-un fișier xib
Visualizări personalizate cu ieșiri & acțiuni
Deci modul corect de a încărca vizualizări personalizate din fișiere xib este cam așa:
În interiorul obiectului dvs. de vizualizare personalizată, instanțiați fișierul xib exact în același mod în care v-am spus chiar aici sus. 👆 Singura diferență este că nu trebuie să folosești matricea de obiecte returnată de metode, ci trebuie să conectezi obiectele de vizualizare prin intermediul constructorului de interfețe, folosind Proprietarul fișierului ca punct de referință, plus o ieșire de vizualizare container personalizată, care va conține tot ce ai nevoie. 🤨
// 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() }}
Deci, metoda initialize de aici nu face decât să încarce fișierul nib cu proprietarul self. După ce procesul de încărcare s-a terminat, indicatorii de ieșire vor fi completați cu valorile corespunzătoare din fișierul xib. Mai este un ultim lucru pe care trebuie să-l facem. Chiar și vizualizările din fișierul xib sunt conectate „programatic” la obiectul nostru de vizualizare personalizat, dar din punct de vedere vizual nu sunt. Așadar, trebuie să adăugăm vizualizarea noastră container în ierarhia vizualizărilor. 🤐
Dacă doriți să folosiți obiectul de vizualizare personalizat, trebuie doar să creați o nouă instanță din acesta – în interiorul unui controler de vizualizare – și, în cele din urmă, nu ezitați să îl adăugați ca subview!
Un singur cuvânt despre bounds, frames aka. springs și struts: f*ckng UGLY! Asta înseamnă două cuvinte. Ele sunt considerate o practică proastă, așa că vă rog să folosiți layout-ul automat, am un tutorial frumos despre ancore, sunt uimitoare și învățarea lor durează aproximativ 15 minute. 😅
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" }}
Așa este, acum aveți un obiect UIView personalizat complet funcțional, care încarcă un fișier xib pentru a utiliza conținutul acestuia. Nu a fost atât de rău, nu-i așa? 🤪
Încă un lucru în plus. Dacă nu vă place să gestionați vederile în mod programatic sau pur și simplu nu doriți să vă încurcați cu metoda loadView, pur și simplu eliminați-o complet. Apoi, puneți cuvântul cheie @IBOutlet chiar înainte de variabila dvs. de clasă de vizualizare personalizată. Deschideți storyboard-ul folosind IB, apoi trageți & drop un nou element UIView în controlerul dvs. și conectați priza de vizualizare personalizată. Ar trebui să funcționeze ca prin minune. 💫
Am promis outlets și acțiuni în titlul acestei secțiuni, așa că haideți să vorbim puțin despre IBActions. Acestea funcționează exact așa cum v-ați aștepta la ele cu controlorii. Puteți pur și simplu să conectați un buton la vizualizarea dvs. personalizată și să delegați acțiunea la clasa de vizualizare personalizată. Dacă doriți să transmiteți atingeri sau acțiuni specifice către un controler, ar trebui să folosiți modelul delegate sau să mergeți cu un bloc simplu. 😎