2013-05-05 24 views
19

Używam niestandardowego UITableViewCell w moim UITableView, ale problem jest, że komórka nigdy nie jest nil podczas wywoływania dequeueReusableCellWithIdentifier. Dlaczego to ?dequeueReusableCellWithIdentifier nigdy nie zwraca zero

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    UINib *nib = [UINib nibWithNibName:@"PHResultTableViewCell" bundle: nil]; 
    [[self tableView] registerNib:nib forCellReuseIdentifier:@"MyCell"]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath  *)indexPath 
{ 
    PHResultTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell"]; 
    if (cell == nil) 
    { 
     PackageHolidayItem *obj=[[PackageHolidayItem alloc]init]; 
     obj= [totalArray objectAtIndex:indexPath.row]; 
     cell.packageHolidayItem = obj; 
     [cell loadRow]; 

    } 
    return cell; 
}  
+1

używasz storyboardy? –

+0

Nawet jeśli nie zarejestrowałeś stalówki i piszczy, ReusableCellWithIdentifier może zwrócić zero, konfigurowanie komórki tylko w przypadku 'if (cell == zero) {...}' byłoby błędne. –

Odpowiedz

0

Nie wierzę, że ma wrócić do zera. Dlaczego tego chcesz?

Metoda dequeueReusableCellWithIdentifier zwraca komórkę, która ma zostać wyświetlona, ​​więc rzeczywiście dobrze, że nie jest pusta - w ten sposób można ją zmodyfikować w razie potrzeby.

14

Nie zwraca wartości zerowej, ponieważ zarejestrowałeś stalówkę do ponownego użycia komórki ([[self tableView] registerNib:nib forCellReuseIdentifier:@"MyCell"];).

jeśli dequeueReusableCellWithIdentifier: nie może znaleźć komórki w kolejce ponownego wykorzystania wyświetleń, to utworzy nowy plik z podanego nibu.

+0

Może, ale faktycznie zarejestrował stalówkę w 'viewDidLoad', a zarejestrowane stalówki mają pierwszeństwo przed komórkami prototypowymi. Stalówka nie może być zerowa, w przeciwnym razie nadpisałby prototyp komórki, a usunięcie nie zwróciłoby komórki. Domyślam się, że wewnętrzna prototypowa komórka jest przechowywana w taki sam sposób jak zarejestrowana stalówka. Podsumowując: faktyczne wywołanie funkcji 'registerNib: forCellReuseIdentifier:' powoduje, że moduł usuwa kolejkę, ale może również istnieć prototypowa komórka. Jedynym sposobem, aby się tego dowiedzieć, jest usunięcie wywołania 'registerNib ::'. Bez obrazy, skończyłem chwytać :-) –

+0

Podczas gdy doceniam wyczerpującą odpowiedź, kiedy zerknąłem na oryginalną próbkę kodu, po prostu nie zauważyłem jego rejestracji NIB (co jest zabawne, ponieważ wyczyściłem jego kod źródłowy). Zareagowałem wyłącznie na jego pytanie o "usunięcie" ... "zwracające" zero ". Jak wiemy, dzieje się tak zarówno podczas rejestracji NIB, jak i podczas korzystania z prototypów komórek. Ale masz całkowitą rację, ponieważ rejestruje NIB w swojej próbce kodu, co powoduje, że 'dequeue ...' nigdy nie zwraca 'nil'. – Rob

2

Jak inni zwrócili uwagę, jeśli masz zarejestrowany stalówka do ponownego użycia tableViewCell masz gwarancję, że otrzymasz wystąpienie komórki. Jeśli chcesz ustawić pewną wartość w komórce. Można spróbować modyfikowania kodu jak ten

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 

     PHResultTableViewCell *cell = (PHResultTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"MyCell" 
                           forIndexPath:indexPath];]; 

     cell.packageHolidayItem = totalArray[indexPath.row];; 
     [cell loadRow]; 

     return cell; 
    }  
+0

Tak Używam storyboardów –

+0

@TrineHaalsMadsen Sprawdź, czy identyfikator cellIdentifier podany w serii scenariuszy jest poprawny. I zaktualizowałem swoją odpowiedź. – Anupdas

22

Uruchamianie w iOS 5 podczas korzystania storyboardy i Twój identyfikator ponowne mecze prototyp w serii ujęć, nie dostanie nic wrócił z dequeueReusableCellWithIdentifier.

od Apple Doc:

Table View Programming Guide for iOS

Tworzenie i konfigurowanie Table View

wypełniania Dynamic widoku tabeli z danymi

Jeśli metoda dequeueReusableCellWithIdentifier: prosi o komórkę zdefiniowany w storyboardie, metoda zawsze zwraca poprawną komórkę . Jeśli nie ma zregenerowanej komórki oczekującej na ponowne wykorzystanie, metoda ta tworzy nową przy użyciu informacji zawartych w samym scenorysie. Ten eliminuje konieczność sprawdzania wartości zwracanej dla zer i tworzenia komórki ręcznie .

Możesz zalogować się adres komórki udowodnić siebie są one ponownie wykorzystywane. Ale nie wysyłaj z logowaniem, to naprawdę spowolni twój stół.

NSLog(@"Deque Cell %p", cell); 

Lepiej używać punktu przerwania, aby go zarejestrować.

enter image description here

$25 = 0x097f9850 <DDSImageSubtitleCheckedTableViewCell: 0x97f9850; baseClass = UITableViewCell; frame = (0 22; 320 44); hidden = YES; autoresize = W; layer = <CALayer: 0x97f9740>> 
$26 = 0x0a6a4a00 <DDSImageSubtitleCheckedTableViewCell: 0xa6a4a00; baseClass = UITableViewCell; frame = (0 66; 320 44); hidden = YES; autoresize = W; layer = <CALayer: 0xa6a4b50>> 
$27 = 0x0a3ad250 <DDSImageSubtitleCheckedTableViewCell: 0xa3ad250; baseClass = UITableViewCell; frame = (0 110; 320 44); hidden = YES; autoresize = W; layer = <CALayer: 0xa3ad390>> 
$28 = 0x0a3ae640 <DDSImageSubtitleCheckedTableViewCell: 0xa3ae640; baseClass = UITableViewCell; frame = (0 176; 320 44); hidden = YES; autoresize = W; layer = <CALayer: 0xa3ae780>> 
$29 = 0x0972a370 <DDSImageSubtitleCheckedTableViewCell: 0x972a370; baseClass = UITableViewCell; frame = (0 220; 320 44); hidden = YES; autoresize = W; layer = <CALayer: 0x972a340>> 

Jeśli chcesz tylko adresy

enter image description here

0x097f9850 
0x0a6a4a00 
0x0a3ad250 
0x0a3ae640 
0x0972a370 
+0

Wygląda na to, że dwa zrzuty ekranu punktu przerwania są takie same, ale uzyskują różne wyniki. Czy mieliby mieć inną zawartość w polu "Polecenie debugowania"? – pix

+0

@pix good eye. Dzięki za złapanie literówki powinna to być "p komórka", a nie "po komórka" p jest pierwotnym drukiem, gdzie po jest drukowanym obiektem i wywołuje [opis komórki]. Zhackowałem obrazek. Dzięki jeszcze raz. – GayleDDS

+0

Dobry hack też! Wygląda prawie tak, jakbyś ponownie zrobił zrzut ekranu –

Powiązane problemy