I have created a custom subclass of UIView along with a xib file and declared IBOutlets and IBActions within the custom class.
@interface ContactUsView : UIView
@property (nonatomic, weak) IBOutlet UIButton *displayCloseButton;
- (IBAction)callButtonPressed:(id)sender;
- (IBAction)emailButtonPressed:(id)sender;
- (IBAction)displayCloseButtonPressed:(id)sender;
@end
In the xib file I have dragged in a UIView to represent my custom view. I have set:
- Files owner = to my custom class
- Have set the dragged in UIView to my custom class.
I have then added various buttons which are hooked up to the 3 methods stated above.
Inside the ContactUsView.m I have the following:
- (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;
}
When I come to create this view I do the following:
- (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];
}
Issue When I press on one of the buttons the application crashes with: Thread 1: EXC_BAD_ACCESS(code=2, address=0xb0c
Can anyone help me with this. I feel like I am probably making a mistake somewhere in regards to creating and loading custom uiviews from xibs.
If you require anymore information let me know. Many thanks.
Future reference When creating a custom view using a xib DO NOT set the files owner. Instead create all your IBOutlets and IBActions as you normally would and then to hook them up open the Utilities tab and control drag from there.
Wrong. Files owner should be empty. The view itself is files owner. It means that you should connect all actions and outlets with
ContactUsView
in your xib.After you passed
self
asowner
parameter. You changing it. Which means that previously allocatedContactUsView
(self
) will be destroyed since-loadNibNamed:owner:options:
do not retain it. If you apply my first advice you should sendnil
asowner
parameterfor
loop here is not necessary use justarray[0]
, because this is always your view if you have valid views hierarchy in your xibIf you are loading a UIView for an xib then you should create a class method to load the view.
In your customview.h
& in your customview.m
You can initialize it anywhere using:
EDIT: Make sure you have changed your customview's class in identity inspecter & also make sure your connection of IBActions are with that class' methods.
You can use delegate for this this is how you can do this
and in .m file
After that just set the delegate with viewcontroller refrence and use those delegate here
{
}
{}
{}
{}
I have done this and works totlly fine