Czy możliwe jest posiadanie więcej niż jednej niestandardowej komórki uitableviewCell w tym samym xib?

Próbuję zapisać pliki XIB, łącząc różne niestandardowe komórki w ramach tego samego xib, a następnie ładując różne z tabeli.

W IB próbowałem ustawić każdą z klas uiTableViewCell na inną implementację niestandardowej klasy .m/.h. Oto, co próbowałem:

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

static NSString *cellIdentifier = @"DevConfigCell";

DeviceInfoCell *cell = (DeviceInfoCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];

if(cell == nil)
{

    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomTableViewCell~iphone" owner:self options:nil];
    cell = ( DeviceInfoCell *)[nib objectAtIndex:0];

}

return cell;
}

W innej tabeli ponownie użyłbym stalówki, ale zrobiłbym to:

    cell = ( SecondDeviceInfoCell *)[nib objectAtIndex:0];

Z jakiegoś powodu zawsze ładuje pierwszą komórkę.

Czy to wszystko powinno działać? czy jest jakiś sposób?

Dzięki

5
mskw 30 sierpień 2012, 20:13

2 odpowiedzi

Najlepsza odpowiedź

Próbuję zapisać pliki XIB, łącząc różne niestandardowe komórki w tym samym xib

Czemu? Nie ma ograniczeń co do liczby plików .xib, które możesz utworzyć.

a następnie ładowanie różnych z tabeli.

Kiedy ładujesz plik .xib, tworzone są wszystkie obiekty, które zawiera plik. Jeśli umieścisz 10 niestandardowych komórek w jednym .xib, załadowanie tego .xib spowoduje utworzenie wystąpienia każdej z tych 10 komórek. To prawdopodobnie nie to, czego chcesz. Trzymanie komórek w oddzielnych plikach .xibs jest prawdopodobnie lepszym planem.

cell = ( SecondDeviceInfoCell *)[nib objectAtIndex:0];

Wydajesz się być zdezorientowany tym, co robi casting. Kiedy rzucasz z jednego typu na inny, nie wybierasz w jakiś sposób innego obiektu. Obiekt zwrócony przez [nib objectAtIndex:0] będzie zawsze taki sam, jeśli tablica nib ma tę samą zawartość. Rzutowanie po prostu zmienia typ, który kompilator kojarzy z wartością; w tym przypadku zmienia typ wskaźnika.

Możesz utworzyć IBOutletCollection w kontrolerze widoku, a następnie podłączyć kilka różnych niestandardowych komórek do tej kolekcji gniazd; to da ci tablicę komórek, którą możesz wybrać za pomocą objectAtIndex:. Ale znowu, to naprawdę nie jest dobry pomysł, ponieważ będziesz tworzyć wszystkie komórki w pliku za każdym razem, gdy potrzebujesz tylko jednej.

4
Caleb 30 sierpień 2012, 20:26
   NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"PlayerAvgsTableCell" owner:nil options:nil];
    for(id currentObject in topLevelObjects)
    {
        if([currentObject isKindOfClass:[PlayerAvgsTableCell class]])
        {
            cell = (PlayerAvgsTableCell *)currentObject;
            break;
        }
    }
}
0
Maurice Holt 21 wrzesień 2013, 21:24