2013-09-02 20 views
11

Bir sınıf, FooView, yani kimin görünümü bir uç yüklenen bir UIView alt sınıfı ve bir var, bir şey gibi:bir uç yüklenen bir UIView alt sınıfı sınıflara

+ (instancetype)viewFromNib 
{ 
    NSArray *xib = [[NSBundle mainBundle] loadNibNamed:@"FooView" owner:self options:nil]; 
    return [xib objectAtIndex:0]; 
} 

ucu kendisi Custom vardır Sınıf, Kimlik Denetçisinde FooView'a ayarlandı. Bu beklediğiniz gibi davranır

FooView *view = [FooView viewFromNib]; 

: olarak

Bu

örneği. FooView kendisi FooSubclassView olarak sınıflandırma ve örneği zaman Ancak gibidir:

FooSubclassView *view = [FooSubclassView viewFromNib]; 

view tip FooView değil FooSubclassView korumaktadır. alt örneği adı verilen altta yatan amacı, FooView bir örneği olduğu gerçeğini düzeltmez object_setClass ile sınıf Swizzling

ve böylece yöntem olup FooSubclassView üst sınıf (FooView) ait olanlar olacaktır.

Her alt sınıf için yeni bir uç oluşturmak zorunda kalmadan veya her bir alt sınıfa yeniden viewFromNib yeniden sahip olmak zorunda kalmadan alt sınıfların doğru türde olmasını sağlamak için bunu nasıl düzeltebilirim?

cevap

7

Swizzling (hiç) yanıtı değildir.

Sorun, NIB'nizde; Bu, örneğidir, FooSubclassView değil nesnesiyle [0] arşivlenir. NIB ile NIB farklı alt sınıfı nesne [0] olarak yüklemek istiyorsanız, örneği NIB arşivinden çıkarmanız gerekir. sınıf zaten NIB yükleniyor beri

Muhtemelen en kolay şey yapmak, FooView veya FooSubclassView dosya'nın sahibi bir örneğini yapmak olduğunu.

Bu soru dosyasının sahibinin modelinin düzgün bir açıklaması vardır. Sınıfınızda zaten XIB/NIB'yi yükleyen bir şey olduğunu göreceksiniz.

Ve işte resmi docs on File's Owner.

+0

Bunu tam olarak anlamıyorum. Görünüm Dosya Sahibi ise, IB kullanarak çizdiğiniz görsel "tuval" olacak başka bir sınıfa ihtiyacınız var, değil mi? Maalesef bu soru açık değilse üzgünüm, ancak içinde yalnızca bir tek NSView alt sınıfıyla bir NIB var. Teşekkür ederim! –

1

En iyi çözüme gittiğinizden emin değilim, ama sanırım aradığınız şey bu.

+ (instancetype)viewFromNib 
{ 
    NSString *className = NSStringFromClass([self class]); 
    NSArray *xib = [[NSBundle mainBundle] loadNibNamed:className owner:self options:nil]; 
    return [xib objectAtIndex:0]; 
} 

Bu, NIB'nin sınıfla aynı ada sahip olduğundan emin olabileceğiniz sürece geçerlidir.


Şartlardan birini yanlış yaptığımı anladıktan sonra, @bbum ile aynı fikirdeyim.

- (id)init 
{ 
    // NOTE: If you don't know the size, you can work this out after you load the nib. 
    self = [super initWithFrame:GCRectMake(0, 0, 320, 480)]; 
    if (self) { 
     // Load the nib using the instance as the owner. 
     [[NSBundle mainBundle] loadNibNamed:@"FooView" owner:self options:nil]; 
    } 
    return self; 
} 

+ (instancetype)viewFromNib 
{ 
    return [[self alloc] init]; 
} 
+0

Bu işe yaramaz; NIB'yi "className" adıyla yüklüyorsunuz. Bu, sınıf başına bir NIB'ye ihtiyacınız olacağı anlamına gelir. En azından OP'nin istediği şey olduğunu düşünmüyorum. Ama belki de ... – bbum

+0

Peki, bu gerekliliği fark etmedim. –

İlgili konular