Copia UITableViewCell

voti
7

Sto leggendo un cella di una tabella personalizzata in tableView:cellForRowAtIndexPath:da un file di pennino. Questa grande opera per i miei scopi, tranne che è piuttosto lento.

Ora, so che la cosa giusta da fare nel lungo termine è quello di creare la cellula interamente in codice, e di utilizzare una singola vista, e così via. Ma questo è un prototipo, e non voglio mettere più di tanto sforzo in esso.

Per ora, sarei felice se stavo leggendo il pennino in una sola volta nell'arco UIViewControllersottoclasse, poi tableView:cellForRowAtIndexPath:ha fatto copie di esso. La mia ipotesi è che la copia sarebbe più veloce che leggere il pennino.

Ecco quello che io uso per caricare il pennino, che io chiamo da viewDidLoad:(e retaindopo)

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

Tutto è bene finora. Ma la domanda è: come faccio a copiare questo più e più volte? E 'anche possibile?

Ho provato [_cachedObject copy]e [_cachedObject mutableCopy], ma UITableViewCellnon supporta entrambi i protocolli di copia.

Se devo, posso solo dire loro di ignorare la velocità fino a quando mi sono preparato per rimuovere il pennino del tutto, ma preferirei farlo andare un po 'più veloce se c'è un low-hanging fruit qui.

Qualche idea?

È pubblicato 20/02/2009 alle 21:43
fonte dall'utente
In altre lingue...                            


5 risposte

voti
8

Penso di coping di cella di una tabella possono essere utilizzati insieme con il meccanismo accodamento, che permetterà di creare delle cellule una volta (dal pennino o di programmazione o di ottenere automaticamente caricata da altri pennino e il collegamento come valvola di sfogo in IB) e poi clonarlo o annullare l'accodamento esso Quando necessario.

UITableViewCell non è conforme al protocollo NSCopying, ma supporta archiviazione calettata / meccanismo estrazione dall'archivio, in modo che possa essere utilizzato per la clonazione.

"Sulla base di risposta ? Come duplicare un UIButton in Objective C " il mio metodo di dati di origine delegato assomiglia:

- (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;
}

E nel mio caso self.tableViewCell è una cellula che è stato caricato una sola volta dal file pennino di vista.

Non provato quello che sarà più veloce: "archivio + unarchive" clonare o "file di carico pennino + unarchive", che disciplina sarà fare in caso di -loadNibNamed: Proprietario: opzioni: , ho usato questo metodo solo con considerazioni di convenienza, ma buone possibilità che il funzionamento della memoria vs operazione di file sarà più veloce.

EDIT: Non sembra così facile come sembrava in un primo momento. Come UIImage non è conforme alle NSCoding, cellule con UIImageViews configurati non possono essere solo copiati senza codice aggiuntivo. Sì, la copia di tutta l'immagine non è sicuramente una buona pratica, applausi ad Apple per aver sollevato la questione.

Risposto il 17/03/2011 a 13:00
fonte dall'utente

voti
6

Utilizzare la clonazione cellulare integrato nella vista tabella. Apple ha saputo generare un sacco di celle della tabella era lento. Controlla la documentazione per questo metodo:

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

Si crea il cellulare una volta, poi come le nuove cellule sono richiesti, utilizzare tale metodo per clonare le cellule esistenti. Poi basta cambiare ciò che deve essere cambiato circa la nuova cella e restituire l'oggetto delle cellule.

Verificate anche il codice di esempio realted vista tabella fornita da Apple che utilizza questo metodo e vi mostrerà il modo giusto. Il fatto tuo cellulare è stato caricato da un pennino non dovrebbe importare a tutti.


chiarimento minore: Non penso cellule metodo clone di cui sopra per voi. Invece ci vuole oggetto delle cellule che sono contenuti nello schermo e semplicemente li sposta in un nuovo spot. Quindi è letteralmente il riutilizzo di una cella. Quindi assicuratevi che il vostro vista tabella personalizzata può essere impostata per tutti i nuovi valori di cui ha bisogno al di fuori della intialization.

Risposto il 20/02/2009 a 22:11
fonte dall'utente

voti
4

Non orgogliosi di questa soluzione, ma funziona con il massimo numero di possibili attacchi IB:

Interface (AlbumTableViewCell è una sottoclasse di UITableViewCell di cui un'istanza viene definita nel file XIB di AlbumViewController):

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

@property (nonatomic, retain) AlbumTableViewCell *tableViewCellTrack;

Attuazione (unarchive / archive fa una copia / cloni della cellula vista tabella):

@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;
}
Risposto il 08/12/2009 a 10:06
fonte dall'utente

voti
3

Beh, io non sono sicuro perché tutti i tutorial là fuori non specifica questo passaggio.

Quando si utilizza il proprio personalizzato UITableViewCell da Pennino, chiamando dequeueReusableCellWithIdentifier non è sufficiente. È necessario specificare il "Identifier" nella IB, solo per per esso nel Table View sezione di scheda cellulare.

Quindi assicurarsi che l'identificatore si mette in IB è lo stesso che l'identificativo utilizzato per la dequeueReusableCellWithIdentifier.

Risposto il 17/06/2009 a 05:10
fonte dall'utente

voti
1

Qui è a 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!
}
Risposto il 24/10/2015 a 02:00
fonte dall'utente

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