从Xib加载的自定义UIView

pls*_*pls 5 objective-c xib uiview custom-view ios

我已经创建了一个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
Run Code Online (Sandbox Code Playgroud)

在xib文件中,我拖入UIView来表示我的自定义视图.我已经设定:

  • 文件所有者=我的自定义类
  • 已将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;
}
Run Code Online (Sandbox Code Playgroud)

当我创建此视图时,我执行以下操作:

- (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];
}
Run Code Online (Sandbox Code Playgroud)

问题 当我按下其中一个按钮时,应用程序崩溃: 线程1:EXC_BAD_ACCESS(代码= 2,地址= 0xb0c)

谁能帮我这个.我觉得我可能在某处创建和加载来自xibs的自定义uiviews时犯了一个错误.

如果您需要更多信息,请告诉我们.非常感谢.

未来参考 使用xib创建自定义视图时请勿设置文件所有者.而是像往常一样创建所有IBOutlets和IBActions,然后将它们连接起来打开Utilities选项卡并从那里控制拖动.

在此输入图像描述

Sil*_*ril 4

\n

\xe2\x80\xa2 文件所有者 = 我的自定义类

\n
\n

错误的。文件所有者应该为空。视图本身是文件所有者。这意味着您应该将所有操作和出口连接到ContactUsView您的 xib 中。

\n
\n

[[NSBundle mainBundle] loadNibNamed:@"ContactUsView" 所有者:self 选项:nil]

\n

...

\n

self = (ContactUsView *)object;

\n
\n

self作为参数传递之后owner。你改变它。这意味着先前分配的ContactUsView( self) 将被销毁,因为-loadNibNamed:owner:options:不保留它。如果您应用我的第一个建议,您应该nil作为owner参数发送

\n

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

\n