Comment puis-je obtenir une vue dans Interface Builder pour charger une vue personnalisée dans une autre plume?

StackOverflow https://stackoverflow.com/questions/3944964

Question

Je fais un widget personnalisé que je voudrais utiliser dans plusieurs grué. Je fais donc une nouvelle vue nib Screen3, ajouter quelques boutons, et que vous voulez maintenant mon widget de UIAwesomeSauce.

Si j'ajoute juste une vue, puis changer la classe d'identité, il ne reçoit pas les sous-éléments de la pointe UIAwesomeSauce. Même chose si je vais à la bibliothèque et de passer à des classes. Il semble seulement UIViewController a le champ pour « charge de pointe », ce qui serait beau.

Je sais que je peux charger la pointe UIAwesomeSauce à partir du code, Récupère les objets de niveau supérieur, et placez-le à la main. Mais le point de IB est si vous n'avez pas à placer les choses dans le code. Il serait encore mieux si je pouvais obtenir UIAwesomeSauce à apparaître dans la liste de la bibliothèque elle-même.

RESOLU - par Nimrod - LIRE SUR LE CODE ET EXPLICATION DE

Quoi qu'il en soit, dood, qui est grand. Je peux faire mes propres classes de widget maintenant pour Goofy trucs super. Faire le FileOwner de l'interface utilisateur nib votre classe, et il suffit d'une UIView normale avec tous vos trucs. (Le point de vue unique dans la pointe du widget ne peut pas être la classe elle-même, ou si vous obtenez récursive en initWithCoder.) Puis, dans la plume que vous voulez utiliser, faire une UIView vanille et changer sa classe. Vous ne serez pas en mesure de voir réellement le widget dans ce carré, mais beaucoup.

Self est maintenant une vue en blanc, et tMyActualSelf est la seule vue que vous avez fait le travail dans l'autre nib. Yay!

- (id)initWithCoder:(NSCoder*)coder 
{
    if ((self = [super initWithCoder:coder])) 
    {
        UIView *tMyActualSelf = nil;
        // Initialization code
        NSArray *tNibItems = [[NSBundle mainBundle] loadNibNamed:@"UIAwesomeSauce" owner:self options:nil];
        for (id object in tNibItems) 
        {
            if ([object isKindOfClass:[UIView class]])
                tMyActualSelf = (UIView *)[object retain];
        }   
        if( tMyActualSelf ) 
        {
            tMyActualSelf.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
            [self addSubview:tMyActualSelf];
        }
    }
    return self;
}
Était-ce utile?

La solution

Je sens votre douleur quand il vient à la UIViewController être la seule chose que vous pouvez spécifier une charge de pointe avec, mais je pense qu'il est parce qu'il doit être propriétaire qui est un contrôleur d'un fichier, ou quelque chose comme ça, même si je suis ne sais pas pourquoi un UIView ne peut pas être propriétaire d'un fichier.

Je pense que vous pouvez mettre les choses dans la bibliothèque sous des objets personnalisés, mais je pense que vous seriez limité à mettre un UIView là-bas avec la classe vient de mettre à une sous-classe personnalisée de UIView. En fait, je regardais en essayant d'étendre constructeur d'interface et il semble que vous pouvez le faire pour des choses OS X, mais pas pour des trucs iPhone. Elle implique la compilation du code pour le nouveau widget dans le constructeur d'interface pour lui dire comment dessiner le widget juste à l'intérieur de l'IB. Je pense qu'il ya en fait un modèle OS X pour cela.

Je pense que je serais probablement faire est de créer une vue principale dans un fichier nib qui contient tous les sous-vues, puis en initWithCoder: dans la chose UIAwesomeSauce ouvrir le fichier nib, chargez la vue principale, et il suffit de placer à l'intérieur de soi de sorte que vous avez une vue « inutile » entre la vue UIAwesomeSauce et les sous-vues (ou sous subviews selon le cas serait.) Je ne suis pas sûr de savoir comment inefficace qui est, mais de jouer avec des choses, il semble que certaines vues comme UIWebView semblent avoir une de ces vues intermédiaires apparemment unnecssary (IIRC).

Si vous venez avec une meilleure solution s'il vous plaît me dire parce que je voudrais savoir aussi.

EDIT

Maintenant que je regarde, je pense que le UIView PEUT être le propriétaire du fichier, vous ne pouvez pas le mettre dans IB. Fondamentalement, vous appelleriez la charge nib quelque chose comme ça dans le UIView:

[paquet loadNibNamed: @ "UISpecialSauce" propriétaire: auto Options: ...]

Je pense que si vous créez points de vente dans UISpecialSauce ou quoi ils devraient recevoir correctement à cause du propriétaire:. Auto

Autres conseils

Theres un cocoapod qui pourrait effectivement aider à cela: https://github.com/mobilejazz/NibWrapper

Il offre une vue wrapper qui charge une vue de l'enfant d'un autre NIB. Vous pouvez spécifier le nom de cette NIB dans l'attribut Interface Builder par un moteur d'exécution.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top