2012-03-06 12 views
5

Używam scenariuszy ios5 z UITableViewController z podklasą UITableViewCell. Nie chcę projektować wizualnych elementów komórki w projektorze storyboardów dla widoku, ponieważ chcę użyć podklasy wielokrotnego użytku UITableViewCell (konkretnie TDBadgedCell).dequeueReusableCellWithIdentifier nie zwraca komórki mojego niestandardowego typu

Ustawiłem identyfikator komórki w projektorze scenorysów i wszystkie wiersze ładują się poprawnie w widoku UITableView, o ile nie ustawiam żadnej z właściwości unikalnych dla TDBadgedCell. Jeśli ustawię właściwość badgeString, która jest unikalna dla TDBadgedCell, otrzymam wyjątek. Zawęziłem, że dequeueReusableCellWithIdentifier: nie zwraca komórki typu TDBadgedCell.

Używam tylko tego z UITableViewController. Mam UIViewController z osadzonym UITableView skonfigurowany w taki sam sposób i to nie jest problem. Jakieś pomysły?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath 
{ 
static NSString *CellIdentifier = @"PhoneNumberCell"; 
TDBadgedCell *cell = (TDBadgedCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil) { 
    cell = [[TDBadgedCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
} 

if ([cell isKindOfClass:[TDBadgedCell class]]) 
{ 
    NSLog(@"It is TDBadgedCell"); 
} 
else 
    NSLog(@"It is NOT TDBadgedCell"); 
+6

czy zmieniłeś również "Klasę niestandardową" na TDBadgedCell w projektorze scenopisów? – fengd

+0

możliwy duplikat [Prototype Cells in a nib zamiast storyboard] (http://stackoverflow.com/questions/8574188/prototype-cells-in-a-nib-instead-a-storyboard) - możliwe tylko, Nie jestem pewien, czy masz oddzielne xib dla tej komórki, czy nie. – jrturton

+0

June1st - To było to! Dzięki! Nie jestem jednak pewien, jak oznaczyć twoją odpowiedź jako odpowiedź. – scubasteve

Odpowiedz

0

Miałem podobny problem w tym, że podklasy UITableViewCell, ale nie przy użyciu storyboard. Oto moje rozwiązanie do korzystania z różnych klas komórek w zależności od tego, czy użytkownik zakupił funkcję odblokowania aplikacji. Mam nadzieję, że to komuś pomaga.

W skrócie, miałem komórkę z kilkoma obiektami, w tym z obiektem UITextView. Chciałem zablokować funkcję kopiowania i wklejania obiektu UITextView w wersji Lite, a następnie zwolnić tę funkcję po zakupie przez użytkownika w produkcie w aplikacji.

Posiadałem dwie klasy UITableViewCell, jedną z UITextView taką, jaka jest, a drugą z UITextView z podklasą z canBecomeFirstresponder zwracającym NO. W ten sposób użytkownik może nadal przewijać w górę i w dół dane UITextview, ale nie może kopiować i wklejać danych.

Oto kod i wszystko, co musiałem zrobić, to zmienić nazwę identyfikatorów ponownego użycia.

DLACZEGO? Ponieważ [self.tableview reloadData] nie przebudowałby komórek z nową klasą, ponieważ komórka jeszcze istniała. Nowe komórki poza ekranem otrzymałyby nową klasę, ale już istniejące nie. To rozwiązanie odbudowuje wszystkie komórki jednorazowo po zakupie odblokowującym dodaną funkcję.

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


if (your test if in-app was purchased is yes) 
{ 
static NSString *MyIdentifier = @"MyCell"; 

FrontCell *cell = (FrontCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier]; 

if (cell == nil) 
     { 
     cell = [[FrontCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier]; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 
     cell.shouldIndentWhileEditing = NO; 
    } 

//....///  

cell.trackDetails.text = [yourObject objectAtIndex:indexPath.row]; 
cell.trackDetails.delegate = self; 
cell.trackDetails.tag = indexPath.row; 


return cell; 
} 
else // inapp not purchased 
{ 
    static NSString *MyLockedIdentifier = @"MyLockedCell"; 

    FrontCellLocked *cell = (FrontCellLocked *)[tableView dequeueReusableCellWithIdentifier:MyLockedIdentifier]; 

    if (cell == nil) 
    { 
     cell = [[FrontCellLocked alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyLockedIdentifier]; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 
     cell.shouldIndentWhileEditing = NO; 
    } 

    //....///  

cell.trackDetails.text = [yourObject objectAtIndex:indexPath.row]; 
cell.trackDetails.delegate = self; 
cell.trackDetails.tag = indexPath.row; 


return cell; } 
} 
0

W scenorysie można ustawić właściwość niestandardowej klasy dla podklasy UITablviewCell.
Następnie metoda deueueReusableCellWithIdentifier zwróci komórkę z typem twojej podklasy.

0

Myślę, że używasz niewłaściwej metody do usuwania komórek.

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    UITableViewCell *cell = [self.tblProfileInfo dequeueReusableCellWithIdentifier:@"PostCell" forIndexPath:indexPath]; 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    return cell; 

} 

Zapomniałeś o indeksie na końcu.

+0

Spróbuj zmienić "Komorę TDBadgedCell * (TDBadgedCell *) [tableView dequeueReusableCellWithIdentifier: CellIdentifier];" do "Komórka TDBadgedCell * (TDBadgedCell *) [tableView dequeueReusableCellWithIdentifier: CellIdentifier forIndexPath: indexPath];" –

Powiązane problemy