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

时间:2016-02-24 21:35:19

标签: ios objective-c subclass 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];

这可以在现有的View Controller之上添加新视图,但每当我点击MyXIB中的按钮时,应用程序崩溃并表示它是sending an unrecognized selector到父视图控制器。

如何让MyXIB上的按钮调用MyViewSubclass中的IBAction?

1 个答案:

答案 0 :(得分:0)

如果您要在其他视图控制器中使用该视图,则应创建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
}
相关问题