带有使用 NIB 的委托的 UIView 子类

2023-12-22

我正在尝试使用笔尖对 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;
}

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

谁能知道这是为什么吗?

提前致谢。


对于多个视图控制器重复使用相同的 xib 是行不通的。如果您想重用该视图,请创建一个继承自 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,并将您的类设置为视图的自定义类,而不是文件响应程序的自定义类。右键单击视图并建立插座和操作连接。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有使用 NIB 的委托的 UIView 子类 的相关文章

随机推荐