9
votes

Utilisation d'ID pour le propriétaire du fichier dans l'interface Builder?

J'ai un UitailViewCell que je suis instantané à partir d'une nib à l'aide de Instanciéwithowner: (ID) Options du propriétaire: (NSDictionary *) Options . Lorsque la nib est instantanée, je l'enregistre à une iboutlet définie dans mon contrôleur d'affichage, qui est défini comme propriétaire du fichier dans le fichier .xib. Tout travaille bien.

Je suis maintenant sur la nécessité d'utiliser cette cellule personnalisée dans plusieurs contrôleurs d'affichage. J'espérais que je puisse définir un protocole (par exemple, quels contrôleurs d'affichage plusieurs contrôleurs pourraient mettre en œuvre. Le protocole définirait simplement l'iboutlet utilisé pour référencer la cellule lorsqu'il est instancié.

si idéalement, je voudrais définir "le propriétaire du fichier" sur: xxx

dans Builder d'interface.

Toutefois, l'interface Builder ne semble que vous permettre de définir le propriétaire de fichier à une classe connue, et non à une carte d'identification de protocole?

Y a-t-il un moyen de Faites cela? Ou un moyen plus simple d'aborder ce problème?

Merci!


3 commentaires

Complete Sidenote, pouvez-vous me signaler à une sorte de guide ou d'échantillon de la manière dont vous faites cela, car cela sonne bien, il faut actuellement boucler à travers une nib à trouver la vue appropriée à utiliser dans mes cellules personnalisées. Ce n'est pas idéal. Et on dirait que vous avez une excellente solution.


Pouvez-vous élaborer sur "il ne semble que vous permettre de définir le propriétaire de fichier à une classe connue, pas à une carte d'identité à la mise en œuvre d'un protocole?" Cela signifie-t-il l'interface Builder?


@Oroftop Oui, "Il" fait référence au constructeur d'interface dans ce cas. Lors de l'édition / de la configuration de l'objet propriétaire du fichier, une option de "classe" vous permet de sélectionner la classe du propriétaire du fichier. Cette case dans IB ne me permet pas d'entrer ID comme type, et je me demande si cela est possible. Merci!


5 Réponses :


3
votes

Ce n'est pas la solution que vous demandez, mais vous pouvez créer une sous-classe uiviewcontroller que vous sous-classe pour chaque contrôleur d'affichage qui doit utiliser votre NIB. Quelque chose comme: xxx

puis utilisez-le comme la classe de base pour chacun: xxx

alors vous pourriez simplement définir le propriétaire du fichier à CustomCellInserviewController sans problèmes.

juste une idée.


0 commentaires

1
votes

Je l'ai couru aujourd'hui et je n'ai pas trouvé de bonne solution. Je l'ai cependant fait pirater afin qu'il semble fonctionner correctement. Cela ressemble vraiment à un piratage cependant.

J'ai d'abord créé une classe "Fuckower" comme ceci: xxx

i puis définissez le propriétaire de l'objet dans le XIB comme Foncelier et connecté la sortie. Ensuite, pour chaque contrôleur qui veut utiliser ces cellules, j'ajoute la même propriété et crée la classe comme celle-ci: xxx

puisque le faux propriétaire et mon contrôleur ont la même iboutlet, chargement du Cellule avec le contrôleur lorsque le propriétaire fait que la connexion se produise même si ce n'est pas ce qui n'est pas explicitement défini dans XIB.

pas à 100% si la gestion de la mémoire est juste actuellement (je pense que ça va), Mais autre que cela semble fonctionner très bien. J'aimerais voir une meilleure façon de le faire.


0 commentaires

1
votes

Faire fonctionner un faux propriétaire; Cependant, une telle solution peut être fragile et inextensible. En un sens, la cellule se détient, mais même ce qui est techniquement incorrect. La vérité est que utableviewcell code> s n'a pas de propriétaires.

La bonne façon d'implémenter une vue sur la table personnalisée est de créer d'abord une sous-classe personnalisée d'Uitabiliewcell. Dans cette classe, vous définirez toutes les iboutlets et telles que pour la cellule. Voici un échantillon d'un fichier d'en-tête: p> xxx pré>

à partir de là, j'ai une méthode de commodité qui crée la cellule de la NIB, si nécessaire: P>

+ (id)cellForTableView:(UITableView *)tableView reuseIdentifier:(NSString *)reuseID fromNib:(UINib *)nib {

    if (!reuseID)
        reuseID = [self cellIdentifier];

    id cell = [tableView dequeueReusableCellWithIdentifier:reuseID];

    if (!cell) {

        NSArray * nibObjects = [nib instantiateWithOwner:nil options:nil];

        // Sanity check. 
        NSAssert2(([nibObjects count] > 0) && 
                  [[nibObjects objectAtIndex:0] isKindOfClass:[self class]],
                  @"Nib '%@' does not appear to contain a valid %@", 
                  [self nibName], NSStringFromClass([self class]));

        cell = [nibObjects objectAtIndex:0];
    }

    return cell;
}


0 commentaires

1
votes

dans iOS 5.0 Il y a maintenant le registernib: ForcellruseIdentifier: Méthode sur UitailView Que je pense tente de résoudre un problème similaire.

de la documentation:

Lorsque vous enregistrez un objet NIB avec la vue Table de la table et appelez ultérieurement le DEQUUEREUSABLECellwithIdentifier: , passant dans l'identifiant enregistré, la vue Tableau instanible de la cellule de l'objet NIB s'il n'est pas déjà dans la file d'attente de réutilisation.

Cela pourrait être une approche alternative en fonction de vos besoins.


0 commentaires

1
votes

Une autre option peut être de créer un objet léger 'usine' qui gère la création des cellules pour vous. Cet objet serait le Chiffres de fichiers Code> dans l'interface Builder, avec la sortie code> rootObject code> défini de manière appropriée.

NibLoader *customCellLoader = [[NibLoader alloc] initWithNibName:@"CustomCell" bundle:nil];
self.customCell = customCellLoader.instantiateRootObject; 


0 commentaires