2010-05-07 3 views
3

Je souhaite utiliser une hiérarchie UIView plusieurs fois (l'objet nib est un modèle). Malheureusement, UIView ne se conforme pas à < NSCopying> siComment obtenir plusieurs copies d'un UIView chargé à partir d'une plume?

[cell.contentView addSubview: [[templEditCellView copy] autorelease]]; 

ne fonctionne pas.

Je n'ai pas été surpris, car je veux une copie profonde de la hiérarchie de vue.

Actuellement, la vue est l'un des objets de niveau supérieur de la plume à partir de laquelle elle est chargée. Existe-t-il un moyen de recharger un seul objet de niveau supérieur spécifié à partir de la plume? Dois-je scinder la vue en un seul NIB qui peut être rechargé à la demande? Ou y a-t-il une autre façon de faire une copie profonde d'une vue?

Merci!

Répondre

2

Vous ne pouvez pas le charger directement afficher le contenu de la cellule, mais vous pouvez créer une classe avec des sorties pour la vue (s) et le charger avec

[[NSBundle mainBundle] loadNibNamed:@"TheNib" owner:anObject options:nil]; 

Il y a plus d'info autour de SO et la 'net sur le chargement des cellules de vue de table à partir de plumes. J'aime beaucoup l'approche Bill Dudney's mais la méthode décrite par Jeff LaMarche est plus facile et plus adaptée à de nombreuses situations.

+0

Je vois un écho entre l'approche de Bill et celle que j'essaie. Je vois que l'approche de la plume séparée est tout à fait réalisable, je me demande simplement s'il y en a de meilleurs. Je personnalise sévèrement mes vues UITableCell! Merci pour les bons conseils. – dmaestro12

1

Cela semble fonctionner bien au moment de ce que je dois:

if (! templEditCellView) { 
    [[NSBundle mainBundle] loadNibNamed:@"TextEditCellView" owner:self options:nil]; 
    if (! templEditCellView) { 
    abort(); // !! 
    } 
} 
[cell.contentView addSubview: templEditCellView]; 
templEditCellView = nil; 

Le contrôleur de table est de placer la même hiérarchie de vue personnalisée dans le contenu de chaque cellule dans ce cas.

Je serais ravi de voir une approche qui ne multiplie pas les fichiers nib si j'ai beaucoup de différentes personnalisations de cellules (comme je le pourrais).

7

La manière la plus simple de réaliser une copie en profondeur d'une vue est de l'archiver et de la désarchiver.

id copyOfAView = 
    [NSUnarchiver unarchiveObjectWithData: 
    [NSArchiver archivedDataWithRootObject:aView]]; 

Mettre la vue dans sa propre plume fonctionne aussi. Vous pouvez créer un objet NSNib et le recharger autant de fois que vous le souhaitez.

+0

Donc, je pouvais charger mes graphiques d'objet de modèle (UIViews) une fois d'une plume, les archiver aux données dans un dictionnaire, et les désarchiver individuellement sur demande. Je pourrais avoir besoin de connaître le compromis de performance entre votre copie simple équivalent et mon idée de mettre en cache les données archivées dans la mémoire? – dmaestro12

+0

Si vous avez les vues en question dans leurs propres fichiers nib, alors ma suggestion ci-dessus est redondante. Vous pouvez charger la plume autant de fois que vous le souhaitez. – NSResponder

+0

UINib *) nibWithNibName vous permet de charger une plume en tant qu'archive en ignorant l'étape d'archivage. – zaph

Questions connexes