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

呼び出します最初のXIB obを設定する自己に捧げる。もし私がメインクラスの権利を参照してくれるのであれば?ですから、私はXIBファイルを読んで、XIBから自己にオブジェクトを複製するメソッドを追加したいと思います。 UIViewControllerを使用するのではなく、UIViewを使用したいので、メインビューに追加のビューを追加する必要はありません。

Seのも、私は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

Iあなたが何をしようとしているのか分からない達成する。 – onnoweb

+0

私はUIView(UIViewControllerではなく)を拡張するクラスにinitWithNibNameメソッドを追加したいだけです。 – 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

hum ...しかし、最初のビュー(loadNibNamed配列から)を所有者に設定するにはどうすればよいですか? – xpepermint

+0

UIPullerViewをインスタンス化するメソッドにこのコードがあります。そのクラスはオーナーになるでしょう。 – onnoweb

+0

ええええええええええええええ、それはUIViewControllerを使用すると非常に簡単ですが、同じクラスとしてnibファイルでUIViewはトリッキーです... – xpepermint

1

ExampleView.hExampleView.m

@interface ExampleView : UIView 

@end 
を作成 ExampleView.xib

を作成します。

ExampleView.xibのIDインスペクタで、カスタムクラスをExampleView

に設定します Example.m

enter image description here

、ビューがロードされるたびに実行されます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]; 
} 
関連する問題