【问题标题】:UIView Subclass with a delegate using NIB使用 NIB 的具有委托的 UIView 子类
【发布时间】:2013-07-05 11:32:38
【问题描述】:

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

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

谁能知道是什么原因?

提前致谢。

【问题讨论】:

  • 子类使用笔尖?您正在使用自定义子类的笔尖中的视图吗?请提供更多上下文,例如 xib 中的设置是什么?
  • @Rakesh:我有一些 UI 控件,如 UILabel 和 UIButtons 等,我想在其他视图控制器中重用这个视图。当我实例化视图并设置控件的委托和其他一些属性时出现问题,但它们没有发生任何事情,所有控件引用都变为 NULL。

标签: ios objective-c xcode


【解决方案1】:

对多个视图控制器重复使用相同的 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 中使用。

【讨论】:

    【解决方案2】:

    您可以使用 Xib 创建自定义 UIView 并向其添加属性。 然后将类与 xib 链接,并将属性与 IB 链接。

    或者你只能使用

    NSArray *v = [[NSBundle mainBundle] loadNibNamed:@"Qus_Scale1to7View" owner:self options:nil];
    
    UIView *view = [v objectAtIndex:0];
    

    并使用 viewWithTag: 方法设置您的对象值。

    UILabel *label = (UILabel *)[view viewWithTag:yourTag];
    

    如果这有帮助,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多