2009-11-17 11 views
9

Postaram się zrobić to tak krótko, jak tylko mogę.Zagnieżdżanie niestandardowych klas/XIB-ów za pomocą konstruktora interfejsów

Napisałem niestandardową klasę, która rozszerza UIView z kilkoma właściwościami IBOutlet, i ma powiązany z nią XIB, z którym powiązane są IBOutlety.

Potem chcę wziąć tę klasę, osadzić ją w innym XIB (na przykład w komórce tabeli) i po prostu zadziałać.

Wygląda na to, że po osadzeniu tej niestandardowej klasy w nowym XIB nie rozpoznaje oryginalnego XIB, który jest z nią związany, więc prosi mnie o zresetowanie IBOutletów do elementów interfejsu na nowym XIB. To jest kiepskie.

Czy ktoś rozumie, co próbuję zrobić i mam dobre podejście?

Odpowiedz

8

Oto, jak udało mi się do tej pracy:

interfejs Builder
Otwórz zewnętrzną stalówkę i zrobić to:

  • Dodaj UIView do określenia miejsca, gdzie chcesz, aby Twój wewnętrzna stalówka do wyświetlenia.
  • Dodaj obiekt UIViewController z biblioteki, ustaw jego właściwość Nazwa końcówki do nazwy wewnętrznego pliku końcówki (bez rozszerzenia).
  • Utwórz IBOutlety dla tych dwóch elementów w zewnętrznym kontrolerze widoku i połącz je. (Będę odnosić się do nich jak innerView i innerViewController.)
  • Nie podłączać żadnych IBOutlets określonych w swoim wewnętrznym kontrolerem widoku do niczego w zewnętrznym pliku nib, po prostu zostawić je niepodłączone.

W Xcode
W viewDidLoad metody wasz zewnętrzny kontrolera widoku, dodaj te dwie linie:

[self.innerView addSubview:self.innerViewController.view]; 
self.innerViewController.view.frame = CGRectMake(0, 0, self.innerView.frame.size.width, self.innerView.frame.size.height); 

Jeśli zewnętrzna stalówka jest zwyczaj UITableViewCell, umieścić te linie w swoim awakeFromNib metoda zamiast tego.

Wykonaj & Uruchom!

+0

Działa to w taki sam sposób na OS X, wystarczy zastąpić klasy UI ich odpowiednikami NS. – Mark

1

Zakładam, że po prostu umieszczasz UIViews w stalówce do użycia przez UIViewController, który jest czysto w kodzie. Apple nazywa to detached nib file.

Skorzystaj z przewodnika, który podłączyłem, aby uzyskać szczegółowe informacje i przykład, jak to uruchomić.

Jeśli chodzi o osadzanie widoku wewnątrz innego w programie Interface Builder, musisz add a UIView element from the Library w widoku macierzystym i set its class in the Inspector. Po ustawieniu klasy widoku osadzonego twoje IBOutlety powinny być widoczne.

+1

To pierwsze zdanie nie jest tym, co robię. Sama klasa jest UIView i zawiera UIImageView i UIActivityIndicator. To ostatnie zdanie jest słuszne, ale niestety nie zachowuje się poprawnie. To podwaja IBOutlets. –

Powiązane problemy