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