Custom UIView alosztály egy xib fájlból
Custom views with outlets & actions
Az egyéni nézetek xib fájlból történő betöltésének helyes módja tehát valahogy így néz ki:
Az egyéni nézetobjektumodban pontosan ugyanúgy instanciálod az xib fájlt, ahogy azt itt fentebb elmondtam. 👆 Az egyetlen különbség az, hogy nem kell használnod a metódusok által visszaadott objektumtömböt, hanem a nézetobjektumokat az interfész-építőn keresztül kell összekapcsolnod, a fájl Tulajdonosát használva referenciapontként, valamint egy egyéni konténer nézet kimenetet, amely tartalmazni fog mindent, amire szükséged van. 🤨
// 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() }}
Az initialize metódus itt tehát csak betölti a nib fájlt a self tulajdonosával. Miután a betöltési folyamat befejeződött, a kimeneti mutatóidat feltöltjük a megfelelő értékekkel az xib fájlból. Van még egy utolsó dolog, amit meg kell tennünk. Az xib fájlból származó nézetek is “programozottan” kapcsolódnak az egyéni nézetobjektumunkhoz, de vizuálisan nem. Tehát hozzá kell adnunk a konténernézetünket a nézethierarchiához. 🤐
Ha használni akarjuk az egyéni nézetobjektumunkat, akkor csak egy új példányt kell létrehoznunk belőle – egy nézetvezérlőn belül – és végül bátran hozzáadhatjuk alnézetként!
Egy szó a korlátokról, keretekről aka. springs és struts: f*ckng UGLY! Ez két szó. Rossz gyakorlatnak számítanak, ezért kérlek, használd az automatikus elrendezést, van egy szép tutorialom a horgonyokról, csodálatosak, és a megtanulásuk kb. 15 percet vesz igénybe. 😅
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" }}
Ez az, most már van egy teljesen működő egyéni UIView objektumod, amely betölt egy xib fájlt, hogy használhassa annak tartalmát. Nem is volt olyan rossz, igaz? 🤪
Még egy extra dolog. Ha nem szereted programozottan kezelni a nézeteket, vagy egyszerűen csak nem akarsz a loadView metódussal szórakozni, egyszerűen távolítsd el teljesen. Ezután tedd a @IBOutlet kulcsszót közvetlenül az egyéni nézet osztályváltozód elé. Nyisd meg a storyboardodat az IB segítségével, majd húzz & drop egy új UIView elemet a vezérlődre, és kösd hozzá az egyéni nézet kimenetet. Működnie kell, mint a varázslat. 💫
A fejezet címében outleteket és akciókat ígértem, ezért beszéljünk egy kicsit az IBActions-ről. Pontosan úgy működnek, ahogyan a vezérlőknél elvárható. Egyszerűen ráköthetsz egy gombot az egyéni nézetedre, és delegálhatod az akciót az egyéni nézet osztályra. Ha érintéseket vagy konkrét műveleteket akarsz továbbítani egy vezérlőnek, akkor használd a delegate mintát, vagy használj egy egyszerű blokkot. 😎