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:
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à.
• 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.
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