2011-07-29 59 views
3

是否可以为扩展UIView的自定义类实现initWithNubName。UIView的iOS initWithNibName

实施例:

.H

@interface UIPullerView : UIView 
{ 
} 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil; 

的.m

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    NSBundle *bundle = nibBundleOrNil==nil ? [NSBundle mainBundle] : nibBundleOrNil; 
    NSString *nibName = nibNameOrNil==nil ? @"UIPullerView" : nibNameOrNil; 
    if (self == [[bundle loadNibNamed:nibName owner:self options:nil] objectAtIndex:0]) 
    { 
     NSLog(@"yes, the same class"); 
    } 
    return self; 
} 

一些控制器类调用此

UIPullerView *puller = [[UIPullerView alloc] initWithNibName:nil bundle:nil]; 

因为我不这不是一个工作示例” t设置第一个XIB ob投身于自我。如果我愿意,我会放松对主要课堂的引用权利?所以我想添加一个方法来读取XIB文件并将对象从XIB复制到自己。我不想使用UIViewController而是使用UIView,因此不应该将其他视图添加到主视图。

硒也是我如何设置XIB:

enter image description here

我会做

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
... 
    self = [[bundle loadNibNamed:nibName owner:self options:nil] objectAtIndex:0] 
    return self; 
} 

,但这是不正确的是真的吗?

这可能吗?

+0

我我不知道我明白你想要什么实现。 – onnoweb

+0

我只想将initWithNibName方法添加到扩展UIView(而不是UIViewController)的类中。 – xpepermint

+0

我不这么认为。 “initWithNibName”方法是在SDK中的类UIViewController中定义的,而不是在UIView中定义的,因此您无法在继承UIView的类中重写该方法。 – indiantroy

回答

3

为了绕开分配的自我,失去主类引用的问题,我不知道你是否应该同样做到这一点,与从NIB加载UITableViewCell

[[NSBundle mainBundle] loadNibNamed:@"MyTableCell" owner:self options:nil]; 
    cell = myTableCell; 
    self.myTableCell = nil; 

,并设置在做类这是NIB的所有者。

当然,如果你在实例化多个不同的,各个地方的UIPullerView那么最后得到棘手......

+0

嗡嗡声...但我怎么能设置第一个视图(从loadNibNamed数组)作为所有者? – xpepermint

+0

您可以在实例化UIPullerView的方法中使用此代码。所以那个班会成为老板。 – onnoweb

+0

好耶...我知道,使用UIViewController会非常容易,但UIView与nib文件相同的类是棘手的... – xpepermint

1

创建ExampleView.xib

创建ExampleView.hExampleView.m

@interface ExampleView : UIView 

@end 

ExampleView.xib的Identity Inspector中,将Custom Class设置为ExampleView

enter image description here

Example.m,添加awakeFromNib

- (void)awakeFromNib 
{ 
    [super awakeFromNib]; 
// [self whateverInits]; 
} 

这每当视图被加载,比如,通过将被执行:

NSArray *objects = [[NSBundle mainBundle] loadNibNamed:@"ExampleView" owner:self options:nil]; 
ExampleView *exampleView = [objects firstObject]; 
0

试试这个:

- (instancetype)initWithNib { 
    NSString *nibName = [NSString stringWithUTF8String:object_getClassName(self)]; 
    return [[[NSBundle mainBundle] loadNibNamed:nibName owner:self options:nil] objectAtIndex:0]; 
}