Custom UIView subclass from a xib file
Custom views with outlets & actions
Więc właściwy sposób ładowania niestandardowych widoków z plików xib idzie coś takiego:
Wewnątrz twojego niestandardowego obiektu widoku, instancjonujesz plik xib dokładnie w taki sam sposób, jak powiedziałem ci tutaj. Jedyną różnicą jest to, że nie musisz używać tablicy obiektów zwracanej przez metody, ale musisz połączyć swoje obiekty widoku za pomocą konstruktora interfejsu, używając Właściciela pliku jako punktu odniesienia, plus niestandardowy widok kontenera, który będzie zawierał wszystko, czego potrzebujesz. 🤨
// 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() }}
Więc metoda initialize tutaj jest po prostu ładowaniem pliku nib z właścicielem self. Po zakończeniu procesu ładowania, twoje wskaźniki wylotu zostaną wypełnione odpowiednimi wartościami z pliku xib. Jest jeszcze jedna ostatnia rzecz, którą musimy zrobić. Nawet widoki z pliku xib są „programowo” połączone z naszym niestandardowym obiektem widoku, ale wizualnie nie są. Musimy więc dodać nasz widok kontenera do hierarchii widoków. 🤐
Jeśli chcesz użyć swojego niestandardowego obiektu widoku, musisz po prostu stworzyć jego nową instancję – wewnątrz kontrolera widoku – a na koniec nie krępuj się dodać go jako subview!
Jedno słowo o bounds, frames aka. springs i struts: f*ckng UGLY! To dwa słowa. Są one uważane za złą praktykę, więc proszę używać auto layout, mam fajny tutorial o anchorach, są niesamowite i nauka ich zajmuje około 15 minut. 😅
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" }}
To wszystko, teraz masz całkowicie działający niestandardowy obiekt UIView, który ładuje plik xib, aby użyć jego zawartości. Nie było tak źle, prawda? 🤪
Jeszcze jedna dodatkowa rzecz. Jeśli nie lubisz obsługiwać widoków programowo lub po prostu nie chcesz się męczyć z metodą loadView, po prostu usuń ją całkowicie. Następnie umieść słowo kluczowe @IBOutlet tuż przed zmienną klasy twojego niestandardowego widoku. Otwórz swój storyboard za pomocą IB, a następnie przeciągnij & upuść nowy element UIView do swojego kontrolera i podłącz niestandardowe wyjście widoku. To powinno działać jak magia. 💫
Obiecałem wyloty i akcje w nagłówku tej sekcji, więc porozmawiajmy trochę o IBActions. Działają one dokładnie tak samo, jak można by się ich spodziewać w kontrolerach. Możesz po prostu podłączyć przycisk do swojego niestandardowego widoku i delegować akcję do niestandardowej klasy widoku. Jeśli chcesz przekazać dotknięcia lub konkretne akcje do kontrolera, powinieneś użyć wzorca delegata lub pójść z prostym blokiem. 😎