Kopiowanie UITableViewCell

głosy
7

Czytam w niestandardowy komórkę tabeli tableView:cellForRowAtIndexPath:z pliku nib. Działa to wielkie dla moich celów, oprócz tego, że jest dość powolna.

Teraz wiem, co trzeba zrobić w dłuższej perspektywie jest stworzenie komórki w całości w kodzie, a także korzystać z jednego widoku, i tak dalej. Ale jest to prototyp, a ja nie chcę, aby umieścić, że wiele wysiłku w to.

Na razie byłbym zadowolony gdybym czytał stalówkę tylko raz na UIViewControllerpodklasy, następnie tableView:cellForRowAtIndexPath:wykonane kopie niego. Moje założenie jest to, że kopiowanie byłoby szybciej niż czytanie stalówkę.

Oto co mogę użyć w celu załadowania stalówki, co ja nazywam od viewDidLoad:(i retainpo)

-(id)loadFromNamed:(NSString*)name {
    NSArray *objectsInNib = [[NSBundle mainBundle] loadNibNamed:name
                                                          owner:self
                                                        options:nil];
    assert( objectsInNib.count == 1 );
    return [objectsInNib objectAtIndex:0];
}

Wszystko jest dobrze do tej pory. Ale pytanie brzmi: Jak mogę skopiować ten w kółko? Czy to w ogóle możliwe?

Próbowałem [_cachedObject copy]i [_cachedObject mutableCopy]ale UITableViewCellnie obsługują protokół kopiowania.

Jeśli muszę, mogę tylko powiedzieć, żeby ignorować prędkość aż jestem gotów usunąć stalówkę całkowicie, ale wolałbym dostać idzie trochę szybciej, jeśli jest owocem nisko wiszące tutaj.

Jakieś pomysły?

Utwórz 20/02/2009 o 21:43
źródło użytkownik
W innych językach...                            


5 odpowiedzi

głosy
8

Myślę, że radzenie sobie z komórki tabeli mogą być używane razem z mechanizmem zdejmującą z kolejki, która pozwoli na stworzenie jednej komórki czasu (od stalówki lub programowo lub coraz to ładowany automatycznie z innych stalówki i łączącą jako ujście w IB), a następnie sklonować go lub dequeue go kiedy był potrzebny.

UITableViewCell nie jest zgodny z protokołem NSCopying, ale obsługuje kluczykiem archiwizację / mechanizm dearchiwizacja, dzięki czemu może być stosowany do klonowania.

„W oparciu o odpowiedź ? Jak powielić UIButton w Objective C ” moja metoda dane źródło delegat wygląda następująco:

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

    if (!cell) {
        NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:self.tableViewCell];
        cell = [NSKeyedUnarchiver unarchiveObjectWithData:archivedData];
    }

    // ... config ...

    return cell;
}

A w moim przypadku self.tableViewCell jest komórka, która została załadowana raz od stalówki plik widoku za.

Nie testowane co będzie szybciej: „archiwum + Zdezarchiwizuj” sklonować lub „plik stalówka obciążenie + Zdezarchiwizuj”, który ramy będą robić w przypadku -loadNibNamed Właściciel: opcje: użyłem tej metody tylko ze względów wygody, ale duże szanse, że operacja pamięć vs działania pliku będzie szybsze.

EDIT: To nie wydaje się tak proste jak się wydawało na początku. Jak UIImage nie jest zgodny z NSCoding komórki ze skonfigurowanych UIImageViews nie może być po prostu kopiowane bez dodatkowego kodu. Tak, kopiując cały obraz na pewno nie jest to dobra praktyka, okrzyki Apple za wskazanie tego.

Odpowiedział 17/03/2011 o 13:00
źródło użytkownik

głosy
6

Użyj klonowanie komórek wbudowany w widoku tabeli. Jabłko wiedział generując dużo komórek tabeli była powolna. Sprawdź docs dla tej metody:

- (UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier

Utworzyć komórkę raz, potem jako nowe komórki są wymagane, należy użyć tej metody klonowania istniejących komórek. Następnie wystarczy zmienić to, co musi być zmieniony o nowej komórki i zwrócić przedmiot komórek.

Sprawdź również widoku tabeli kod realted próbki dostarczone przez firmę Apple, która korzysta z tej metody i pokazać właściwą drogę. Fakt swoją komórkową ładowane z nib nie powinno mieć znaczenia w ogóle.


Minor wyjaśnienie: Nie sądzę powyższe komórki metoda clone dla Ciebie. Zamiast trwa obiekt komórek, które przesunął się poza ekran i po prostu przenosi je do nowego miejsca. Więc to dosłownie ponowne komórkę. Więc mieć pewność, że zwyczaj widoku tabeli można ustawić na wszystkich nowych wartości potrzebnych poza intialization.

Odpowiedział 20/02/2009 o 22:11
źródło użytkownik

głosy
4

Nie dumny z tego rozwiązania, ale działa z maksymalną liczbą możliwych powiązań IB:

Interfejs (AlbumTableViewCell to podklasa UITableViewCell których wystąpienie jest określona w pliku XIB AlbumViewController'S):

@interface AlbumsViewController : UITableViewController {
    IBOutlet AlbumTableViewCell *tableViewCellTrack;
}

@property (nonatomic, retain) AlbumTableViewCell *tableViewCellTrack;

Wdrożenie (Zdezarchiwizuj / archiwum tworzy kopię / klonów komórce widoku tabeli):

@implementation AlbumsViewController

@synthesize tableViewCellTrack;

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    AlbumTableViewCell *cell = (AlbumTableViewCell *)[tableView dequeueReusableCellWithIdentifier: @"AlbumCell"];

    if (cell == nil) {
        AlbumsViewController *albumsViewController = [[[AlbumsViewController alloc] init] autorelease];
        [[NSBundle mainBundle] loadNibNamed: @"AlbumsViewController" owner: albumsViewController options: nil];

        cell = albumsViewController.tableViewCellTrack;
    }

    cell.labelTitle.text = ...;
    cell.labelArtist.text = ...;

    return cell;
}
Odpowiedział 08/12/2009 o 10:06
źródło użytkownik

głosy
3

Cóż, nie jestem pewien, dlaczego wszystkie tutoriale tam nie precyzuje tego kroku.

Podczas korzystania swój własny UITableViewCell od końcówki piszącej, nazywając dequeueReusableCellWithIdentifier nie wystarczy. Trzeba określić „identyfikator” w IB, tylko dla niego w Table View sekcji zakładki komórkowych.

Następnie upewnij się, że identyfikator można umieścić w IB jest taki sam jak identyfikator używanego do dequeueReusableCellWithIdentifier.

Odpowiedział 17/06/2009 o 05:10
źródło użytkownik

głosy
1

Oto ona w Swift

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    var cell : UITableViewCell?
    let cellId = String(format: "Cell%d", indexPath.row)
    cell = alertTable!.dequeueReusableCellWithIdentifier(cellId) as! UITableViewCell?

    if cell == nil {
        let archivedData = NSKeyedArchiver.archivedDataWithRootObject(masterTableCell!)
        cell = NSKeyedUnarchiver.unarchiveObjectWithData(archivedData) as! UITableViewCell?
    }

    // do some stuff

    return cell!
}
Odpowiedział 24/10/2015 o 02:00
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more