2011-07-29 104 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]; 
}