Skocz do zawartości

Witaj!

Zaloguj lub Zarejestruj się aby uzyskać pełny dostęp do forum.

Zdjęcie
- - - - -

UITableViewCell jako IBOutlet i ponownia inicjalizacja


  • Zaloguj się, aby dodać odpowiedź
4 odpowiedzi w tym temacie

#1 macsurf

macsurf
  • 104 postów
  • SkądKołobrzeg

Napisano 05 czerwca 2014 - 21:03

Utworzyłem w IB tabele i komórkę (UITableViewCell) jak ponownie ją zainicjować w metodzie protokołu UITableViewDelegate ?
Właściwość: IBOutlet UITableViewCell *cell;

i w metodzie protokołu utworzenie nowych komórek:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UILabel *label;
    
    // tworzenie kolejnych obiektow cell ??????
 
    label = (UILabel *)[cell viewWithTag:1];
    label.text = [samplearr objectAtIndex:indexPath.row];
    label = (UILabel *)[cell viewWithTag:2];
    label.text = @"test";
       
    return cell;
    
}

Tworzy mi tylko jeden rekord z oczywistych względów, nie można utworzyć nowego obiektu, gdyż zostaje zainicjowany poprzez IBOutlet.
Więc jak mam ponownie utworzyć w powyższej metodzie obiekt z Interfejsu ? Jest na to jakiś patent ?
Czy jednak będę zmuszony do tworzenia subklasy UITableViewCell i tam zcustomizować sobie komórkę :(

- - - Połączono posty - - -

Może inaczej jak skopiować komórkę :)
 UITableViewCell *mycell = [[UITableViewCell alloc] init];
   mycell = [cell copy];

Niestety nie ma takiej metody "copy", gdyby mozna bylo skopiowac komórkę a nie przypisać wskaźnik do niej to sprawa byłaby załatwiona :(

#2 tmkszlc

tmkszlc

  • 1 846 postów
  • SkądSzczecin, PL

Napisano 07 czerwca 2014 - 15:24

Wszystko masz wyjaśnione tutaj: Table View Programming Guide for iOS

#3 Gość_oneghost_*

Gość_oneghost_*

Napisano 07 czerwca 2014 - 16:40

Wyjaśnię w skrócie:
W storyboard dodajesz UITableView i ustawiasz mu delegata na jakiś ViewController.
Do UITableView dodajesz UITableViewCell, ustawiasz mu Identifier.
w tableView:cellForRowAtIndexPath: piszesz coś takiego:

static NSString *CellName = @"IdentyfikatorCelki";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellName];
return cell;

Jeśli chcesz dodać jakieś elementy do celki to dodajesz je normalnie i ustawiasz im tag (inny każdemu) i potem przed return cell; pobierasz do nich referencję tak:
UILabel *label = (UILabel *)[cell viewWithTag:1];

Nie powinieneś dodawać żadnych outlet'ów do celki, ani kopiować celek.

#4 macsurf

macsurf
  • 104 postów
  • SkądKołobrzeg

Napisano 09 czerwca 2014 - 12:26

Interfejs jest robiony tylko za pomocą obiektu widow i podwidoków. Ale już nie o to chodzi, wiem jak zrobić custom cell w tradycyjny sposób. Tylko nie rozumiem, dlaczego nie mogę skopiować utworzonej w IB skustomizowanej komórki, tylko muszę dziedziczyć po UITableViewCell i tam ją "customizować".

- - - Połączono posty - - -

A jeszcze jedno ;) oczywiście ta moja komórka wyświetla się. Tyle, że nie mogę skopiować jej tak aby dodać kolejne wartość do nowego obiektu zbudowanego na podstawie mojej komórki. Tak więc jak mam w tabeli np. 5 wierszy to mam tylko 1 wiersz z customizowaną komórką.

#5 macsurf

macsurf
  • 104 postów
  • SkądKołobrzeg

Napisano 09 czerwca 2014 - 17:30

Dobra straciłem cierpliwość do tego kopiowania ;) Zrobiłem to bez tworzenia osobnego pliku z klasą, która dziedziczy po UITableViewCell.

Tak więc, krótki opis może komuś się przyda:

Nie należy dodawać do głównego pliku xib naszej komórki (UITableViewCell), lepiej utworzyć odrębny plik np. myCustomCell.xib ( nowy plik->user interface -> empty )
Wstawiamy w IB komórkę "Table View Cell" dodajemy do niej jakieś obiekty: label, image i co tam chcemy. Każdy taki obiekt ma swój tag, tak więc w celu identyfikacji trzeba nadać unikalny identyfikator dla takiego obiektu. Komórka też powinna mieć swój identyfikator. Wszystkie te czynności wykonujemy oczywiście bezpośrednio w IB.
W pliku xib możemy oczywiście mieć kilka takich komórek z odpowiednimi identyfikatorami, gdyż po pobraniu plik xib zwracana jest tablica z kolejnymi obiektami w pliku xib. Przykładowy kod z komentarzami:



-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    
    static NSString *simpleTableIdentifier = @"mycell";
    
    /*
   wskaznik label przetrzymuje referencje do obiektu typu UILabel w ten sposob dokonujemy zmiany
     na wlasciwosciach obiektu label w danej komorce
   */
    UILabel *label;

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
    
    if(cell == nil)
    {
        
        /*
         Wgrywamy plik MyCustomCell.xib (bez rozszerzenia .xib) z nasza komorka. Może być tam wiecej prototypow komorek.
         Odwolujemy sie do tych obiektow poprzez kolejne indeksy zwroconej tablicy nib`ow
         UWAGA: nalezy naszej komorce w IB nadac identyfikator a kazdemu obiektowi w komorce (label,image,itp) odpowiednie identyfikatory "tagi"
         */
        
        
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MyCustomCell" owner:self options:nil];
        cell = [nib objectAtIndex:0]; // jesli mamy wiecej komorek to kazdy kolejny indeks odpowiada kolejnemu obiektowi w xib
        
        NSLog(@"wsk: %p\n", cell);
    }
    
    /*
     wiadomosc viewWithTag zwraca referencje do obiektu zawartego w komorce identyfikowanego przez tag !
     W tym wypadku sa to obiekty label, kazdemu obiektowi label ustawilismy tag w IB, ktory go identyfikuje.
     Trzeba oczywiscie rzutowac wynik metody viewWithTag na odpowiedni typ, gdyz moga to byc nie tylko
     obiekty label !
     */
    label = (UILabel *)[cell viewWithTag:1];
    
    label.text = [samplearr objectAtIndex:indexPath.row];
    label = (UILabel *)[cell viewWithTag:2];
    label.text = @"test";
    
    return cell;
    
}







Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych