Nib de charge pour UIView utilisé dans ViewController dans StoryBoard

j'ai un uivi que je veux utiliser dans plusieurs contrôleurs de vue donc j'ai créé la vue (.h./m) et d'une plume de fichier. Dans Storyboard, la vue est ajoutée en tant que sous-vue pour afficher le contrôleur, mais ne charge pas le layout tel que défini dans nib.

est-il possible de charger le nib d'un UIView utilisé dans un contrôleur de vue dans un Storyboard?

20
demandé sur tiltem 2014-01-15 11:09:45

3 réponses

Si vous vous demandez voir votre .xib contenu dans Interface Builder quand on édite Storyboard, c'est pas possible. Mais si vous avez besoin de le charger dans l'exécution, c'est possible.

  • .h./m doit contenir UIView sous-classe
  • .xib le fichier que vous devez définir propriétaire du Fichier (Identité De L'Inspecteur -> Classe Personnalisée) avec votre uivi personnalisé sous-classe
  • .h ajouter un fichier @property (strong, nonatomic) IBOutlet UIView* view; et connectez votre conteneur de vue depuis Interface Builder à ce champ (Ctrl + Cliquez Sur sur la Vue et faites-le glisser de connexion ci-dessus view propriété dans .h
  • se connecter à d'autres sous-vues .h
  • .m le fichier que vous devez placer


- (void)awakeFromNib {
    NSString* nibName = @"Place here your Nib name without extension";
    if ([[NSBundle mainBundle] loadNibNamed:nibName owner:self options:nil]) {
        [self.view setFrame:[self bounds]];
        [self addSubview:self.view];
    }
}

C'est tout. Déplacer Vue de Storyboard scène, modifiez Personnalisé Classe pour votre FooView, import .h en Vue Contrôleur de code et l'utiliser IBOutlets comme vous le souhaitez.

bon codage

EDIT

je tiens à signaler que, selon awakeFromNib documentation nous devrions éviter un tel code dans awakeFromNib.

il est recommandé de maintenir une correspondance de un à un entre les objets propriétaires de votre fichier et leurs fichiers nib associés. En chargeant deux fichiers nib avec L'objet propriétaire du même fichier, la méthode awakeFromNib de cet objet est appelée deux fois, ce qui pourrait provoquer la réinitialisation de certaines structures de données de manière non désirée. Il est également recommandé d'éviter de charger d'autres fichiers nib à partir de l'implémentation de la méthode awakeFromNib.

18
répondu Anton Gaenko 2015-05-18 07:53:25

Donnez votre point de vue ViewInNib, puis nous avons:

  1. ViewInNib.h
  2. ViewInNib.m
  3. ViewInNib.xib

dans votre scénario, mettez un placeholder UIView component dans le contrôleur de vue, n'oubliez pas de définir sa classe ViewInNib, puis ViewInNib.m:

static BOOL isReplaced = NO;
- (id)awakeAfterUsingCoder:(NSCoder *)aDecoder
{
    if (!isReplaced) 
    {
        isReplaced = YES;
        ViewInNib *replaced = [[[NSBundle mainBundle] loadNibNamed:@"ViewInNib" owner:nil options:nil] lastObject];
        replaced.frame = self.frame;
        replaced.translatesAutoresizingMaskIntoConstraints = NO;
        return replaced;
    }
    isReplaced = NO;
    return self;
}

dans cette méthode, nous remplaçons la vue réelle chargée à partir de nib de la vue dans le storyboard. Espérons que cela aide.

10
répondu sunnyxx 2015-12-24 09:27:45

utiliser XXNibBridge:

https://github.com/sunnyxx/XXNibBridge

Super simple à utiliser et fonctionne avec Swift. Tout le mérite revient à @ sunnyxx

4
répondu Robert Wagstaff 2016-01-11 01:01:28