75 votes

UIView et initWithFrame et une PLUME de fichier. Comment puis-je obtenir la PLUME de chargement du fichier?

J'ai un UIView appelés baseViewet que j'ai initWithFrameoù j'ai ajouter quelques autres points de vue et de faire quelques trucs. Le même point de vue a aussi une PLUME de fichier.

Maintenant, j'ai un UIViewController classe nommée AppController dans laquelle je veux ajouter l' baseView afficher à la vue de l' AppController vue donc je fais ceci :

self.view = baseView; mais le problème est que la POINTE de fichier n'est pas chargé. Comment puis-je m'assurer de la mesure trucs ET la PLUME fichier est chargé/run ?

168voto

Bogatyr Points 12027

Vous avez plusieurs options, en fonction de la façon dont votre "baseView" la classe est destinée à être utilisée et intégrée à votre application. Il n'est pas clair à quel point vous avez l'intention d'utiliser cette classe -- comme le point de vue dans une sous-classe UIViewController, ou réutilisable, modulaire signifie d'être instancié plusieurs fois tout au long de votre application, pour une utilisation dans de nombreux point de vue différent des contrôleurs.

Si votre vue est destiné à être le seul point de vue dans une sous-classe UIViewController, puis Phonitive est correct -- le bundle avec la sous-classe UIViewController .xib fichier et utiliser la UIViewController de viewDidLoad faire initialisation.

Mais si vous voulez que votre point de Vue de la classe à un sous-composant réutilisé plusieurs fois dans différents contrôleurs de vue, intégré, soit par un code ou par l'inclusion dans un .xib fichier d'un autre contrôleur, alors vous avez besoin pour mettre en œuvre le initWithFrame: méthode init, et awakeFromNib, à manier les deux cas. Si votre interne de l'initialisation de certains objets .xib, puis dans votre initWithFrame vous devrez charger votre .xib manuellement afin de soutenir le "client" classes que vous voulez créer votre widget via le code. Et de même, si un .xib fichier contient votre objet, puis vous aurez besoin pour vous assurer d'appeler n'importe quel code-requis finalisation de awakeFromNib.

Voici un exemple de comment créer une sous-classe UIView composant avec la conception de l'INTERFACE utilisateur dans une plume.

Mavue.h:

@interface MyView : UIView
{
    UIView *view;
    UILabel *l;
}
@property (nonatomic, retain) IBOutlet UIView *view;
@property (nonatomic, retain) IBOutlet UILabel *l;

Mavue.m:

#import "MyView.h"
@implementation MyView
@synthesize l, view;

- (id)initWithFrame:(CGRect)frame 
{
    self = [super initWithFrame:frame];
    if (self) 
    {
        // Initialization code.
        //
        [[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil];
        [self addSubview:self.view];
    }
    return self;
}

- (void) awakeFromNib
{
    [super awakeFromNib];

    // commenters report the next line causes infinite recursion, so removing it
    // [[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil];
    [self addSubview:self.view];
}

- (void) dealloc
{
     [l release];
     [view release];
     [super dealloc];
}

Voici ce que la plume de fichier ressemble (sauf que le propriétaire du fichier doit être modifié pour Mavue classe).

enter image description here

assurez-vous de brancher à la fois de la vue et de magasins de marque de Propriétaire du Fichier. Ça y est! Un modèle pour la création de ré-utilisable UIView widgets.

La seule chose vraiment bien sur cette structure, c'est que vous pouvez placer des instances de votre Mavue objet dans d'autres nib fichiers, il suffit de placer une UIView à l'emplacement/la taille que vous voulez, puis changer la classe de l'identité de l'inspecteur (CMD-4) à Mavue, et boum, vous avez une instance de votre widget quelle que soit la vue que vous voulez! Tout comme UIKit objets que vous pouvez mettre en œuvre délégué protocoles de sorte que les objets à l'aide de votre widget d'être informé des événements intéressants, et peut fournir des données à afficher dans le widget pour le personnaliser.

3voto

crissag Points 44

J'ai trouvé ce post après avoir eu un problème en essayant de le faire dans mon application. J'ai essayé de créer une instance de la vue à partir d'une PLUME dans la méthode ViewDidLoad, mais les contrôles sont comportés comme s'ils étaient handicapés. J'ai du mal avec cette tente de régler directement la userInteractionEnabled de la propriété et de définir par programmation de l'événement de touche du sélecteur d'un bouton dans ce point de vue. Rien n'a fonctionné. Je suis tombé sur un autre post et découvert que viewDidLoad était sans doute trop tôt pour le chargement de cette PLUME. J'ai déplacé la charge de la ViewWillAppear méthode et tout a fonctionné. Espérons que cela aide quelqu'un aux prises avec cette. La réponse principale est grande et fonctionne bien pour moi maintenant que je l'ai appelé le bon endroit.

2voto

Phonitive Points 120

si vous souhaitez utiliser une PLUME, c'est mieux pour votre UIView d'être en relation avec un UIViewController, dans ce cas, vous pouvez utiliser

UIViewController *vc=[[UIViewController alloc] initWithNibName:@"YourNIBWihtOUTEXTENSION" bundle:nil]

[self.view addSubView:vc.view ];

attention de fuites de mémoire, vous devez libérer de cr

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X