2010-11-05 12 views
4

Je sous-classe UIView essayant de charger la vue que j'ai abandonnée dans l'interface constructeur à partir d'un fichier nib. je reçois l'erreur suivante sur la ligne de retour:iPhone - Charger un UIView à partir d'un fichier nib?

Mettre fin application en raison d'une exception non interceptée « NSGenericException », raison: « Ce codeur exige que les objets remplacés retournés de initWithCoder: »

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    [super initWithCoder:aDecoder]; 
    NSArray *objects = [[NSBundle mainBundle] 
         loadNibNamed:@"MyView" 
         owner:nil 
         options:nil]; 
    if (self = [objects objectAtIndex:0]) 
    { 
    } 
    return [self retain]; 
} 

Répondre

13

Vous faites quelque chose de très étrange)

loadNibNamed:owner:options: appellera initWithCoder: instancier votre vue de xib. Mais vous appelez loadNibNamed:owner:options: de initWithCoder:. Récursivité infinie?

Pour charger la vue de xib vous pouvez faire la prochaine:

@implementation MyView 

+ (MyView*) myView 
{ 
    NSArray* array = [[NSBundle mainBundle] loadNibNamed:@"MyView" owner:nil options:nil]; 
    return [array objectAtIndex:0]; // assume that MyView is the only object in the xib 
} 

@end 
+0

Y at-il quelque chose de spécial que vous devez faire pour utiliser MyView dans une autre plume, en plus de définir la classe personnalisée à MyView? – qix

0

plutôt que faire self = [objects objectAtIndex:0] vous devriez boucle à travers le réseau et assurez-vous que vous obtenez le bon objet, par exemple:

for (id object in objects) { 
    if ([object isKindOfClass:[YourClassName class]]) 
     self = (YourClassName*)object; 
} 

Cela dit, j'ai alway s fait cela une couche et tire la référence à droite de la UIViewController. Cela brise la couche d'abstraction cependant, puisque la classe qui veut juste utiliser la vue aurait besoin de savoir ce que Nib son dans:

UIViewController *vc = [[UIViewController alloc] initWithNibName:@"MyView" bundle:nil]; 
YourClassName* view = (YourClassName*)vc.view; 
[vc release]; 
+0

qui ne sont pas le problème, il n'y a que 1 objet dans le tableau, et le premier est toujours le correct – aryaxt

+2

et je n » t voulez utiliser un viewController, Tout ce que je veux est une vue personnalisée générée à partir d'une plume – aryaxt

Questions connexes