从 XIB 加载自定义视图,如何使其响应自定义子类



我创建了一个带有XIB(MyXIB)的视图,并创建了一个UIView子类(MyViewSubclass)。我将MyViewSubclass设置为MyXIB视图的"自定义类"。

我已经将MyXIB中的按钮连接到 MyViewSubclass 中的 IBAction。

在应用程序的主视图控制器中,我调用:

NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"MyXIB" owner:self options:nil];
MyUIViewSubclass *myView = [subviewArray objectAtIndex:0];
[self.view addSubview:myView];

这可以将新视图添加到现有视图控制器之上,但是每当我从MyXIB点击按钮时,应用程序就会崩溃并说它已sending an unrecognized selector到父视图控制器。

如何获得MyXIB上的按钮以在MyViewSubclass中调用 IBAction?

如果要在其他视图控制器中使用该视图,则应创建一个delegate protocol,如下所示:

MyXIB.h

#import <UIKit/UIKit.h>
@protocol MyXIBDelegate <NSObject>
@required // if it's not necessary, you can use @optional
- (void)myXIBDelegateMethod;
@end
@interface MyXIB : UIView
@property (weak, nonatomic) id<MyXIBDelegate> delegate;
@end

MyXIB.m

#import "MyXIB.h"
@implementation MyXIB
- (IBAction)buttonAction:(id)sender {
    if (self.delegate && [self.delegate respondsToSelector:@selector(myXIBDelegateMethod)]) {
        [self.delegate myXIBDelegateMethod];
    }
}
@end

由于 UIButton 的操作在视图中链接MyXIB因此,按下按钮时,请检查是否设置了 delegate 属性以及它是否响应委托方法,然后调用协议的方法。

在视图控制器.m @implementation部分的文件中,您将得到如下所示的内容:

#import "ViewController.h"
#import "MyXIB.h"
@interface ViewController () <MyXIBDelegate>
@end

并且由于协议方法@required,你必须在视图控制器中实现该方法:

#pragma mark - MyXIB Delegate Method
- (void)myXIBDelegateMethod {
    // your implementation
}

最新更新