2013-10-14 16 views
9

En son SDK ile bir iOS 5+ uygulaması geliştiriyorum.EXC_BAD_ACCESS UIBI

Özel bir XIB ile özel bir UIView (TopMenuView) oluşturdum. Interface Builder'da, bu XIB'de sınıfında TopMenuView'a değiştirdim. Hiç File's Owner ayarlamamıştım. TopMenuView.m günü

Ben:

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 

    if (self) 
    { 
     NSLog(@"init with coder: %d", counter); 
     counter++; 
     // Add custom XIB 
     NSArray *topMenuView = [[NSBundle mainBundle] loadNibNamed:@"TopMenuView" 
                  owner:nil 
                  options:nil]; 
     UIView *nv = [topMenuView objectAtIndex:0]; 

     [self addSubview:nv]; 
    } 

    return self; 
} 

Ben UIViewController bir UIView eklendi ve TopMenuView bu UIView sınıfı değişti Interface Builder kullanma. Ben app çalıştırdığınızda

Ama ben bu günlük mesaj 4251 defa olsun: 2013-10-13 20:49:34.078 MyProject[470:c07] init with coder: 0

Ve sonra, burada bir EXC_BAD_ACCESS olsun: TopMenuView oluşturulduğunda - (id)initWithCoder:(NSCoder *)aDecoder denir Sizin

NSArray *topMenuView = [[NSBundle mainBundle] loadNibNamed:@"TopMenuView" 
                  owner:nil 
                  options:nil]; 
+0

nv'yi alt görünüm olarak ekliyorsunuz, ancak ana görünüm nerededir? Dosyanın sahibine herhangi bir görünüm beyan etmiyorsunuz. Dosyanın sahibine bir görünüm eklemelisiniz. – KDeogharkar

cevap

3

Bu kullanan bazı denetleyici muhtemelen TopMenuView kullanmak istiyorum ben nasıl yaptım:

//Add Custom View to my main view of viewcontroller 
self.customNavView = [[CustomNavigationView alloc] init]; 
self.customNavView = [[[NSBundle mainBundle] loadNibNamed:@"CustomNavigationView" owner:self options:nil] objectAtIndex:0]; 
[self.customNavView setFrame:CGRectMake(0, 20, 320, 54)]; 
[self.view addSubview:self.customNavView];  

Burada CustomNavigationView, UIView olarak UWiew ve UIView özel sınıfı CustomNavigationView olarak UIView alt sınıfıdır.

Bu benim için çalışır.

+0

Harika çalışıyor! InitWithCoder'ı geçersiz kılabilirsiniz – Jesse

1

xib'inizi yükleyerek. Böylece

özyinelemeli tüm yöntem - (id)initWithCoder:(NSCoder *)aDecoder

sizin initWithCoder:


Yorum aradığınız ve nerede aşağıdaki kodu

NSArray *topMenuView = [[NSBundle mainBundle] loadNibNamed:@"TopMenuView" owner:nil options:nil]; 
UIView *nv = [topMenuView objectAtIndex:0]; 
+0

Evet, bunu biliyorum. Bunu nasıl düzeltebilirim? – VansFannel

9

Büyük olasılıkla sonsuz bir döngüye giriyorsunuz çünkü initWithCoder numaralı telefonu arıyorsunuz. Bir geçici çözüm, alt sınıfınızın önce herhangi bir alt görüşünün olup olmadığını kontrol etmektir. Ben film şeridinden xib dosyasını yüklenen nasıl redid kadar

-(id)initWithCoder:(NSCoder *)aDecoder { 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 
     if (self.subviews.count == 0) { 
      NSArray *topMenuView = [[NSBundle mainBundle] loadNibNamed:@"TopMenuView" owner:nil options:nil]; 
      UIView *nv = [topMenuView objectAtIndex:0]; 
      [self addSubview:self.view]; 
     } 
    } 
    return self; 
} 
0

aynı hatayı alıyordum. Temel olarak, xib dosyasının root görünümünden @IBOutlet kodunun yapılmasıyla ilgilidir. Ayrıca, xib dosyasının Dosya Sahibini özel sınıfınıza ayarladığınızdan emin olun. Bu projeyi kurmak için

import UIKit 
class ResuableCustomView: UIView { 

    @IBOutlet var view: UIView! 
    @IBOutlet weak var label: UILabel! 

    @IBAction func buttonTap(sender: UIButton) { 
     label.text = "Hi" 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 

     NSBundle.mainBundle().loadNibNamed("ReusableCustomView", owner: self, options: nil)[0] as! UIView 
     self.addSubview(view) 
     view.frame = self.bounds 
    } 
} 

Benim tam cevap here olduğunu.

30

InitWithCoder öğesini çağırmasının nedeni, .xib dosyanızdaki yanlış sınıf kurulumundan kaynaklanmaktadır.

enter image description here

Ve kök View sınıf varsayılan UIView olduğundan emin olun:

enter image description here

Dosyanın Veren Özel Class emin olun özel UIView sınıftır

Ve şimdi bu sizin özel sınıfınızda (Swift) ihtiyacınız olan her şeydir:

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 

    let view = NSBundle.mainBundle().loadNibNamed("TopMenuView", owner: self, options: nil)[0] as! UIView 
    self.addSubview(view) 
    view.frame = self.bounds 
} 
+1

Bu gerçekten sorunu çözer. Xcode'un bu tür “özel sınıf” konfigürasyonlarına daha iyi uyarılar vermesi gerektiğini düşünmüştüm. – RandyTek

+1

@JYeh Bu ayrıntılı ve kesin bir cevaptır. – Singh

+2

Ayrıca, özel sınıfınız bir Cocoapods bağımlılığı gibi başka bir projeden geliyorsa, Modül alanını da doldurmanız gerektiğini (özel sınıfın hemen altında) unutmayın. – judepereira

İlgili konular