我创建了一个带有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
}