2013-07-05 33 views
2

我想使用笔尖子类UIView。使用下面的代码:使用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; 
} 

这将创建正确的对象和视图还显示,当从笔尖的对象加载委托瞬间变得无效,而忽略任何企图值分配给它。

任何人都可以知道它的原因吗?

在此先感谢。

+0

使用笔尖的子类?你在使用自定义子类的nib中的视图?请提供更多的背景信息,比如xib中的设置是什么? – Rakesh

+0

@Rakesh:我有一些像UILabel和UIButtons等UI控件,我想在其他视图控制器中重用此视图。问题出现在我实例化视图并将委托和其他属性设置为控件时,但它们没有发生,所有控件引用都变为NULL。 –

回答

3

它将无法在多个视图控制器中重复使用相同的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,并将您的类设置为视图的自定义类,而不是文件的响应者。右键单击视图并进行插座和操作连接。

change the custom class for the view

make the outlet and actions connections for the view

现在,你应该能够简单地让你的MyCustomView的情况下,在任何视图控制器,并使用它。如果您不忘记将您的视图自定义类更改为您的类,将从Interface Builder工作。

0

你可以用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]; 

让我知道这是否有帮助。