自定义UIView从Xib加载

我创build了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来表示我的自定义视图。 我已经设定:

  • 文件所有者=我的自定义类
  • 已经把UIView拖到我的自定义类。

然后,我添加了各种button,这些button连接上述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; } 

当我创build这个视图时,我执行以下操作:

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

问题当我按下其中一个button时,应用程序崩溃: 线程1:EXC_BAD_ACCESS(code = 2,address = 0xb0c

谁能帮我这个。 我觉得我可能在创build和加载xibs的自定义uiviews方面犯了一个错误。

如果您需要了解更多信息,请告诉我。 非常感谢。

将来的参考使用xib创build自定义视图不要设置文件所有者。 而是像平常一样创build所有的IBOutlets和IBActions,然后连接它们打开Utilities选项卡并从那里控制拖动。

在这里输入图像说明

•文件所有者=我的自定义类

错误。 文件的所有者应该是空的。 视图本身是文件的所有者。 这意味着你应该连接所有的行动和网点与你的xib中的ContactUsView。

[[NSBundle mainBundle] loadNibNamed:@“ContactUsView”owner:self options:nil]

self =(ContactUsView *)对象;

在您作为ownerparameter passingself之后。 你改变它。 这意味着之前分配的ContactUsViewself )将被销毁,因为-loadNibNamed:owner:options:不保留它。 如果你申请我的第一条build议,你应该发送nil作为owner参数

for循环这里没有必要使用array[0] ,因为如果你的xib中有有效的视图层次结构,这总是你的视图

如果你正在加载一个xib的UIView,那么你应该创build一个类方法来加载视图。

在你的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]; 

编辑:确保你已经改变了你的customview的类的身份检查,也确保你的IBActions的连接与该类的方法。 在这里输入图像说明

在这里输入图像说明

你可以使用这个委托来做到这一点

  @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 

{}

我已经做到了这一点,工作很好