自定义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 *)对象;
在您作为owner
parameter passingself
之后。 你改变它。 这意味着之前分配的ContactUsView
( self
)将被销毁,因为-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
{}
我已经做到了这一点,工作很好