我创建了一个UIView的自定义子类以及一个xib文件,并在自定义类中声明了IBOutlets和IBActions。
@interface ContactUsView : UIView
@property (nonatomic, weak) IBOutlet UIButton *displayCloseButton;
- (IBAction)callButtonPressed:(id)sender;
- (IBAction)emailButtonPressed:(id)sender;
- (IBAction)displayCloseButtonPressed:(id)sender;
@end
在xib文件中,我拖入UIView来表示我的自定义视图。我已经设定了:
然后我添加了各种按钮,这些按钮与上述3种方法相连。
在ContactUsView.m内部,我有以下内容:
- (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;
}
当我创建此视图时,我会执行以下操作:
- (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];
}
问题 当我按下其中一个按钮时,应用程序崩溃: 主题1:EXC_BAD_ACCESS(代码= 2,地址= 0xb0c
任何人都可以帮助我。我觉得我可能在创建和加载xibs的自定义uiviews方面犯了一个错误。
如果您需要更多信息,请告知我们。非常感谢。
未来参考 使用xib创建自定义视图时请勿设置文件所有者。而是像往常一样创建所有IBOutlets和IBActions,然后将它们连接起来打开Utilities选项卡并从那里控制拖动。
答案 0 :(得分:4)
•文件所有者=我的自定义类
错误。文件所有者应为空。视图本身是文件所有者。这意味着您应该在xib中使用ContactUsView
连接所有操作和出口。
[[NSBundle mainBundle] loadNibNamed:@“ContactUsView”owner:self options:nil]
...
self =(ContactUsView *)object;
将self
作为owner
参数传递后。你改变它。这意味着以前分配的ContactUsView
(self
)将被销毁,因为-loadNibNamed:owner:options:
不保留它。如果您应用我的第一个建议,则应将nil
作为owner
参数
for
循环不一定只使用array[0]
,因为如果您的xib中有有效的视图层次结构,这始终是您的视图
答案 1 :(得分:2)
如果要为xib加载UIView,则应创建一个类方法来加载视图。
在customview.h中
+(id)customView;
&安培;在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;
}
您可以使用以下方式将其初始化:
CustomView *myView = [CustomView customView];
编辑:确保您已在身份检查器&中更改了自定义视图的课程。同时确保您与IBActions的联系与该班级相关。方法。
答案 2 :(得分:1)
您可以使用委托 这就是你如何做到这一点
@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
和.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];
}
之后只需使用viewcontroller参考设置委托并使用这些委托
- (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
{}
我做到了这一点并且工作得非常好