UIView personnalisé chargé à partir de Xib

J'ai créé une sous-class personnalisée de UIView avec un file xib et déclaré IBOutlets et IBActions dans la class personnalisée.

@interface ContactUsView : UIView @property (nonatomic, weak) IBOutlet UIButton *displayCloseButton; - (IBAction)callButtonPressed:(id)sender; - (IBAction)emailButtonPressed:(id)sender; - (IBAction)displayCloseButtonPressed:(id)sender; @end 

Dans le file xib, j'ai glissé un UIView pour représenter ma vue personnalisée. J'ai mis:

  • Fichiers owner = à ma class personnalisée
  • Avoir mis le glissé dans UIView à ma class personnalisée.

J'ai ensuite ajouté différents buttons qui sont reliés aux 3 methods indiquées ci-dessus.

Dans le ContactUsView.m j'ai les éléments suivants:

 - (id)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { NSArray* array = [[NSBundle mainBundle] loadNibNamed:@"ContactUsView" owner:self options:nil]; for (id object in array) { if ([object isKindOfClass:[ContactUsView class]]) self = (ContactUsView *)object; } } return self; } 

Quand je viens créer cette vue, je fais ce qui suit:

 - (void)viewWillAppear:(BOOL)animated { ContactUsView *contactUs = [[ContactUsView alloc] initWithFrame:CGRectZero]; CGPoint origin = self.view.frame.origin; CGSize size = self.view.frame.size; [contactUs setFrame:CGRectMake(origin.x, CGRectGetMaxY(self.view.frame) - 100, size.width, contactUs.frame.size.height)]; [self.view addSubview:contactUs]; } 

Problème Lorsque j'appuie sur l'un des buttons, l'application se bloque avec: Thread 1: EXC_BAD_ACCESS (code = 2, adresse = 0xb0c

Est-ce que quelqu'un peut m'aider avec ça. J'ai l'printing de faire une erreur quelque part en ce qui concerne la création et le chargement d'uiviews personnalisés depuis xibs.

Si vous avez besoin de plus d'informations faites le moi savoir. Merci beaucoup.

Référence future Lors de la création d'une vue personnalisée à l'aide d'un xib NE définissez pas le propriétaire des files. Au lieu de cela, créez tous vos IBOutlets et IBActions comme vous le feriez normalement, puis, pour les relier, ouvrez l'onglet Utilities et contrôlez le glisser à partir de là.

entrez la description de l'image ici

• Propriétaire du file = à ma class personnalisée

Faux. Le propriétaire des files doit être vide. La vue elle-même est le propriétaire des files. Cela signifie que vous devez connecter toutes les actions et les sockets avec ContactUsView dans votre xib.

[[NSBundle mainBundle] loadNibNamed: @ "ContactUsView" propriétaire: auto-options: néant]

self = (ContactUsView *) object;

Après vous être passé en tant que paramètre owner . Vous le changez. Ce qui signifie que ContactUsView ( self ) alloué précédemment sera détruit puisque -loadNibNamed:owner:options: ne le conserve pas. Si vous appliquez mon premier conseil, vous devriez envoyer nil comme paramètre owner

for loop ici n'est pas nécessaire utilisez simplement array[0] , car c'est toujours votre vue si vous avez une hiérarchie de vues valide dans votre xib

Si vous chargez un UIView pour un xib, vous devez créer une méthode de class pour charger la vue.

Dans votre customview.h

 +(id)customView; 

& dans votre customview.m

 + (id)customView { CustomView *customView = [[[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:nil options:nil] lastObject]; if ([customView isKindOfClass:[CustomView class]]) return customView; else return nil; } 

Vous pouvez l'initialiser n'importe où en utilisant:

 CustomView *myView = [CustomView customView]; 

EDIT: Assurez-vous que vous avez changé la class de votre customview dans l'inspecteur d'identité et assurez-vous également que votre connection d'IBActions est avec les methods de cette class. entrez la description de l'image ici

entrez la description de l'image ici

Vous pouvez utiliser délégué pour ceci c'est comment vous pouvez le faire

  @protocol CustomViewDelegate <NSObject> - (void)callButtonPressed:(id)sender; - (void)emailButtonPressed:(id)sender; - (void)displayCloseButtonPressed:(id)sender; @end @interface ContactUsView : UIView @property (nonatomic, weak) IBOutlet UIButton *displayCloseButton; @property (nonatomic, weak) id<CustomViewDelegate> ButtonDelegate; - (IBAction)callButtonPressed:(id)sender; - (IBAction)emailButtonPressed:(id)sender; - (IBAction)displayCloseButtonPressed:(id)sender; @end 

et dans le file .m

 - (IBAction)callButtonPressed:(id)sender { [self.ButtonDelegate callButtonPressed:sender]; } - (IBAction)emailButtonPressed:(id)sender{ [self.ButtonDelegate emailButtonPressed:sender]; } - (IBAction)displayCloseButtonPressed:(id)sender{ [self.ButtonDelegate displayCloseButtonPressed:sender]; } 

Après cela, il suffit de définir le délégué avec refrence viewcontroller et utiliser ces delegates ici

 - (void)viewWillAppear:(BOOL)animated 

{

 ContactUsView *contactUs = [[ContactUsView alloc] initWithFrame:CGRectZero]; contactUs.ButtonDelegate = self; CGPoint origin = self.view.frame.origin; CGSize size = self.view.frame.size; [contactUs setFrame:CGRectMake(origin.x, CGRectGetMaxY(self.view.frame) - 100, size.width, contactUs.frame.size.height)]; [self.view addSubview:contactUs]; 

}

 - (void)callButtonPressed:(id)sender 

{}

 - (void)emailButtonPressed:(id)sender 

{}

 - (void)displayCloseButtonPressed:(id)sender 

{}

Je l'ai fait et travaille très bien