2010-11-18 4 views
0

J'ai un UIViewController. Le UIViewController a une NIB avec une sortie - un UIView, contenant plusieurs boutons et étiquettes. Imaginez, c'est quelque chose comme un UIDatePicker. Afin de ne pas être obligé de copier et coller tout le code de contrôle dans un nouvel environnement, j'essayais d'encapsuler l'UIView dans une sous-classe UIView distincte avec une propre NIB, une sorte d'approche C# CustomControl.SDK iPhone: CustomControls comme C#

D'un contrôle (autre) UIViewController Je suis instancier la vue de la BNI

NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil]; 
selectorView = (DateTimeSelectorView*)[nibObjects objectAtIndex:0]; 

selectorView est une propriété à l'aide de la classe UIViewController. Le problème: "initWithFrame" de mon UIView n'est jamais appelé. Mon UIView couvre l'ensemble de l'espace (320x480), alors qu'il devrait avoir une taille plus petite. Comment puis-je réaliser ceci? De plus, UIView semble cacher tous les autres contrôles, instanciés depuis la classe UIViewController.

Cordialement

Répondre

0

Lorsqu'une vue est instancié par le chargeur de pointe, initWithFrame: n'est pas appelé. Le chargeur de plumes appelle initWithCoder :. Vous devez implémenter initWithCoder pour effectuer toute initialisation, y compris la définition du cadre.

+0

Merci. Pendant ce temps j'ai trouvé la réponse. Ce n'est pas évident. Je vais assembler un petit "Comment" – neil

0

Voici donc un "HowTo" pour la question: Comment intégrer un UIView autonome dans mon UIViewController avec NIB?

1) Dites que vous avez un UIView avec un bouton et un champ de texte, en vous connectant. Vous avez l'interface utilisateur dans un fichier NIB distinct appelé Login.xib. La fonctionnalité est dans Login.m et Login.h, une sous-classe de UIView. Le nom de la classe est "Login". Veillez à ce que la classe soit définie correctement dans Login.xib. Tout va bien.

2) Maintenant, vous voulez utiliser ce "out of the box" dans une nouvelle application.

3) Faites glisser les trois fichiers (Login.m, Login.h et Login.xib ») dans votre nouveau projet basé UIView

4) Ajouter une propriété dans votre classe UIViewController, pointant vers votre classe Login (bien sûr, inclure la première Login.h)

5) Ouvrez IB avec Login.xib et définir le propriétaire du fichier à votre classe actuelle UIViewController

6) Branchez la vue principale de votre Login.xib avec la propriété défini dans UIViewController (!! c'est important !!)

7) Ajouter ce qui suit à votre viewDidLoad dans UIViewController (supposé, le nom de votre propriété est « myLogin »)

[[NSBundle mainBundle] loadNibNamed:@"Login" owner:self options:nil]; 
myLogin.frame = CGRectMake(0 ,100, 320, 200); // Optional, you may also use the initial bounds 
[self.view addSubview:myLogin]; 

La vue apparaît où vous laissez apparaître. D'autres contrôles de votre aperçu seront également disponibles.

Il m'a fallu plusieurs heures pour le découvrir. Il y a ici et là quelques infos éparses, mais je n'ai pas trouvé de "comment" complet pour cette tâche simple jusqu'à présent.

Cordialement