从XIB加载自定义View,如何让它响应自定义子类?

Loading Custom View from XIB, How to Make it Respond to Custom Subclass?

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

我已将 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
}