ios - 带有使用 NIB 的委托(delegate)的 UIView 子类

标签 ios objective-c xcode

我正在尝试使用 Nib 子类化 UIView。使用以下代码:


- (void)awakeFromNib
{
    [super awakeFromNib];
    NSArray *v = [[NSBundle mainBundle] loadNibNamed:@"Qus_Scale1to7View" owner:self options:nil];
    [self addSubview:[v objectAtIndex:0]];
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        NSArray *v = [[NSBundle mainBundle] loadNibNamed:@"Qus_Scale1to7View" owner:self options:nil];
        [self addSubview:[v objectAtIndex:0]];
    }
    return self;
}

这会正确创建对象并显示 View ,并且当对象从其 Nib 加载时,委托(delegate)立即变为 null 并忽略任何为其赋值的尝试。

有谁知道这是为什么吗?

提前致谢。

最佳答案

对于多个 View Controller 重复使用相同的 xib 是行不通的。如果您想重用该 View ,请创建一个继承自 UIView 的类并在其中添加代码。

#import "SomeProtocol.h"

@interface MyCustomView : UIView {
    IBOutlet UIView *headerView;
    IBOutlet UIView *footerView;
    IBOutlet UIButton *updateBtn;
}

@property (nonatomic, assign) id<SomeProtocol> delegate;

@end

............

@implementation BCFirmwareView

@synthesize delegate = _delegate;

+ (id)viewFromNibWithName: (NSString*)name {
    UIView *view = nil;
    NSArray *views = [[NSBundle mainBundle] loadNibNamed: name owner: self options: nil];
    if (views) {
        for (UIView *aView in views) {
            if ([aView isKindOfClass: NSClassFromString(name)])
                view = aView;
        }
    }

    return view;
}

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder: aDecoder];

    if (self) {
    }

    return self;
}

- (id)init {
    self = [[MyCustomView viewFromNibWithName: @"MyCustomView"] retain];
    if (self) {
    }

    return self;
}

- (void)dealloc {
    self.delegate = nil;

    [headerView release];
    [footerView release];
    [updateBtn release];

    [super dealloc];
}

- (void)awakeFromNib {
    [super awakeFromNib];
    // Do any additional setup after loading the view from its nib.

    headerView.backgroundColor = [UIColor redColor];
    footerView.backgroundColor = [UIColor greenColor];
}

- (void)willMoveToSuperview:(UIView *)newSuperview {
    [super willMoveToSuperview: newSuperview];

    if (!newSuperview)
        return;
}

- (void)didMoveToSuperview {
    [super didMoveToSuperview];
}

- (IBAction)updateBtnPressed: (id)sender {
// do some stuff
}

@end

下一步是在 Interface Builder 中打开 xib,并将您的类设置为 View 的自定义类,而不是文件响应程序的自定义类。右键单击 View 并建立 socket 和操作连接。

change the custom class for the view

make the outlet and actions connections for the view

现在您应该能够在任何 View Controller 中简单地创建 MyCustomView 的实例并使用它。如果您没有忘记将 View 自定义类更改为您的类,也可以在 Interface Builder 中使用。

关于ios - 带有使用 NIB 的委托(delegate)的 UIView 子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17487911/

相关文章:

objective-c - IOS:UIView 转换中的奇怪颜色:UIViewAnimationOptionTransitionCurlDown

iphone - 如何检查 rootViewController 是否属于特定类?

ios - 查看标签 : returns nil on UITableViewCell only first time

ios - 在 UITabBarController View 之间传递数据

ios - Spritekit 在 SKSpriteNode 子类中获取 Sprite 场景的最佳方法

ios - AdMobSDK :Apple Mach-O Linker error

ios - 向服务器发送 POST 请求时应用程序卡住

ios - 如何从以编程方式添加的 UITextView 获取文本 [Swift]

ios - 使用 NSLayoutConstraint 的 Superview 中 UIPageControl 的编程垂直对齐

swift - Xcode 在代码中内嵌显示颜色