Custom UIView cargado desde Xib

He creado una subclass personalizada de UIView junto con un file xib y he declarado IBOutlets e IBActions dentro de la class personalizada.

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

En el file xib, he arrastrado una UIView para representar mi vista personalizada. Yo he puesto:

  • Propietario de files = a mi class personalizada
  • Han configurado el arrastrado en UIView a mi class personalizada.

Luego agregué varios botones que están conectados a los 3 methods indicados anteriormente.

Dentro de ContactUsView.m tengo lo siguiente:

 - (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; } 

Cuando vengo a crear esta vista hago lo siguiente:

 - (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]; } 

Problema Cuando presiono uno de los botones, la aplicación falla con: Subprocess 1: EXC_BAD_ACCESS (código = 2, dirección = 0xb0c

Puede alguien ayudarme con esto. Siento que probablemente estoy cometiendo un error en alguna parte con respecto a la creación y carga de uiviews personalizadas desde xibs.

Si necesita más información, avíseme. Muchas gracias.

Referencia futura Al crear una vista personalizada con un xib NO establezca el propietario de los files. En su lugar, cree todos sus IBOutlets e IBActions como lo haría normalmente y, luego, para conectarlos, abra la pestaña Utilidades y controle el arrastre desde allí.

introduzca la descripción de la imagen aquí

• Propietario de files = a mi class personalizada

Incorrecto. El propietario de los files debe estar vacío. La vista en sí es propietario de files. Significa que debe conectar todas las acciones y salidas con ContactUsView en su xib.

[[NSBundle mainBundle] loadNibNamed: @ propietario "ContactUsView": auto opciones: ninguno]

object self = (ContactUsView *);

Después de pasar como parámetro owner . Tu lo cambias Lo que significa que previamente se asignó ContactUsView ( self ) será destruido ya que -loadNibNamed:owner:options: no lo retiene. Si aplica mi primer consejo, debe enviarlo como parámetro owner

for loop aquí no es necesario usar solo array[0] , porque esta siempre es su vista si tiene una jerarquía de vistas válidas en su xib

Si está cargando una UIView para un xib, entonces debería crear un método de class para cargar la vista.

En tu customview.h

 +(id)customView; 

& en su 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; } 

Puede inicializarlo en cualquier lugar usando:

 CustomView *myView = [CustomView customView]; 

EDITAR: asegúrese de haber cambiado la class de su vista personalizada en el inspector de identidad y también asegúrese de que su connection de IBActions esté con los methods de esa class. introduzca la descripción de la imagen aquí

introduzca la descripción de la imagen aquí

Puedes usar delegado para esto así es como puedes hacer esto

  @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 

y en el 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]; } 

Después de eso, simplemente establezca el delegado con el refrence viewcontroller y use esos delegates aquí

 - (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 

{}

Lo he hecho y funciona muy bien