2014-04-06 10 views
5

Obecnie używam automatycznego układu z scenopisem do dynamicznej zmiany rozmiaru niestandardowych UITableViewCell. Wszystko działa tak, jak powinno, z wyjątkiem sytuacji, gdy podczas przewijania występuje przeciek pamięci.Załaduj niestandardowy obiekt UITableViewCell ze scenorysku

wiem, że problem jest z wywoływania

[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

od wewnątrz

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 

Moje pytanie brzmi, co byłoby najlepszym sposobem, aby stworzyć komórkę odniesienia? Jak załadować komórkę z storyboardu bez dequeueReusableCellWithIdentifier?

Czy można wywołać dequeueReusableCellWithIdentifier z viewDidLoad i utworzyć komórkę odniesienia jako właściwość?

Potrzebuję komórki referencyjnej do celów wymiarowych.

Dzięki za pomoc.

Odpowiedz

10

dotyczące sposobu tworzenia komórkę odniesienia (patrz oryginalne pytanie), istnieje kilka opcji, jak widzę:

  1. utworzenia komórki niestandardowego z XIB, wielki artykuł tutaj ->a link!

    • zostało to wskazane przez @smileyborg, dzięki!
  2. utwórz własną komórkę w kodzie wraz z ograniczeniami.

  3. stworzyć swój własny komórki w storyboard jako komórki prototypu

    • po tym są 2 opcje:
      • przeciągnij i upuść niestandardowe komórkę z widoku tabeli do serii ujęć sceny, jako najwyższego poziomu stalówki obiekt (nie będący częścią hierarchii widoku) i po prostu utwórz do niego ujście.
      • skopiuj niestandardową komórkę i wklej ją do sceny storyboardu. Gdy używasz go w ten sposób, nie ma potrzeby rejestrowania oryginalnej komórki z tabelą do usunięcia.
      • Mały problem z obydwoma podejściami polega na tym, że po przeciągnięciu i upuszczeniu komórki niestandardowej do sceny scenorysu nie będzie można jej zobaczyć wizualnie i rozmieścić interfejs użytkownika.
    • świetny artykuł tutaj ->a link!

Dzięki wszystkim za pomoc!

0

Można tylko dequeue komórkę raz i przechowywać wysokość:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSNumber *height; 

    if (!height) 
    { 
     UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"YourCustomCell"]; 
     height = @(cell.bounds.size.height); 
    } 

    return [height floatValue]; 
} 
1

I to jest ok, aby może wywołać dequeueReusableCellWithIdentifier z viewDidLoad i stworzyć komórkę odniesienia jako właściwość?

Tak, możesz to zrobić. Lub leniwy zainicjować właściwość:

- (UITableViewCell *)referenceCell 
{ 
    if (!_referenceCell) { 
     _referenceCell = [self.tableView dequeueReusableCellWithIdentifier:@"Cell"]; 
    } 
    return _referenceCell; 
} 
+0

Wygląda na to, że spowoduje to również wycieki. Testuję to teraz. – Iki

+0

Ostatniej nocy rozmawiałem z Tylerem Foxem (@smileyborg), który stworzył świetny przykład automatycznego układu i wysokości dynamicznego widoku tabeli [link] (http://stackoverflow.com/questions/18746929/using-auto- layout-in-uitableview-for-dynamic-cell-layouts-variable-row-heights/18746930 # 18746930), a także potwierdził, że użycie dequeueReusableCellWithIdentifier poza komórkąForRowAtIndexPath prawdopodobnie spowoduje powstanie nieszczelności. – Iki

+0

Ciekawe, dlaczego @smileyborg sądzi, że to wycieknie. Moje [TLIndexPathTools] (https://github.com/wtmoose/TLIndexPathTools) używa tej metody do automatycznego obliczania wysokości komórki, z której nikt nigdy nie zgłosił wycieku. Właśnie to przetestowałem. Jeśli masz scenariusz, w którym wycieknie, chciałbym rzucić okiem. –

Powiązane problemy