2012-05-10 28 views
15

w jaki sposób używać UINibs do tworzenia instancji i użycia UITableViewCell do widoku table w iOS5.0. Wiem, że to registerNib: forCellReuseIdentifier: w iOS5.0 że musi również być używane, ale nie jestem pewien, jak go używaćJak używać UINib do tworzenia instancji i używania niestandardowych UITableViewCells

Z góry dziękuję za wszelką pomoc w tej

+1

Sprawdź ten link: http://useyourloaf.com/blog/2011/2/28/speeding-up-table-view-cell-loading -with-uinib.html To powinno zacząć! :) –

Odpowiedz

41
  1. Utwórz plik XIB z UITableViewCell jako obiektem najwyższego poziomu. Nazywa się to Cell.xib
  2. Utwórz obiekt UINib na podstawie tego pliku
  3. Zarejestruj UINib w widoku tabeli (zazwyczaj w viewDidLoad podklasy kontrolera widoku tabeli).

Kroki 2 i 3 można łączyć, więc można używać następujący wiersz w viewDidLoad:

[self.tableView registerNib:[UINib nibWithNibName:@"Cell" bundle:nil] forCellReuseIdentifier:@"Cell"]; 

Następnie w cellForRowAtIndexPath, jeśli chcesz jedną z komórek z stalówki, ty go rozkolejkowania :

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; 

Spowoduje to utworzenie nowej instancji z końcówki lub usunięcie bieżących komórek.

+2

Ja sam zaimplementowałem Identyfikator Komórki Reuse i działa całkiem nieźle! –

+1

Twoje rozwiązanie jest absolutnie poprawne, ale niestety jest błąd w iOS 5 (poprawiony w iOS 6) w połączeniu z VoiceOver: http://openradar.appspot.com/11549999 –

+0

Po załadowaniu komórki, chcę programowo dostosować kolor tła (ponieważ kolor bg jest obrazem wzoru). Czy to możliwe? – Satyam

1

Odpowiedź @jrturtons jest poprawna, ale niestety jest błąd w iOS 5 (poprawiony w iOS 6) w połączeniu z VoiceOver: rdar://11549999. Poniższa kategoria pod numerem UITableView rozwiązuje problem. Po prostu użyj -fixedDequeueReusableCellWithIdentifier: zamiast zwykłego dequeueReusableCellWithIdentifier:. Oczywiście NIB musi być zarejestrowany przy użyciu

[self.tableView registerNib:[UINib nibWithNibName:@"Cell" bundle:nil] forCellReuseIdentifier:@"Cell"]; 

przed (w -viewDidLoad).

UITableView + Workaround.m:

@implementation UITableView (Workaround) 
- (id)fixedDequeueReusableCellWithIdentifier:(NSString *)identifier { 
    id cell = [self dequeueReusableCellWithIdentifier:identifier]; 
    if (!cell) { 
     // fix for rdar://11549999 (registerNib… fails on iOS 5 if VoiceOver is enabled) 
     cell = [[[NSBundle mainBundle] loadNibNamed:identifier owner:self options:nil] objectAtIndex:0]; 
    } 
    return cell; 
} 
@end 
+0

Czytałem o tym błędzie kilka razy, ale nigdy go nie spotkałem - nawet na iOS 5.0 podczas korzystania z VoiceOver. Uważam, że faktyczny problem jest znacznie bardziej skomplikowany niż ten. –

+0

To powiedziawszy, podejrzewam, że twoje obejście zawsze działa: Świetnie! :) –

Powiązane problemy