2011-11-14 22 views
1

我有一個繼承自UIView的類,並且此類具有一些我在IB中放置的控件。具有NIB文件的iOS UIView子類不顯示在IB中設計的UI

然後,在我的主視圖控制器的NIB文件中,我放置了一個視圖,並將該類更改爲我的子類,並創建了子類的出口。但是,當我運行我的應用程序時,應用程序不顯示我放在子類上的UI,它只是空白。

我收到的initWithCoder和awakeFromNib消息在子類中,這裏是子類.m文件基本上是這樣的:

#import "AnalyticsDetailView.h" 

@implementation AnalyticsDetailView 

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

- (void)awakeFromNib 
{ 
    [super awakeFromNib]; 
} 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) 
    { 
     NSArray *v = [[NSBundle mainBundle] loadNibNamed:@"AnalyticsDetailView" owner:self options:nil]; 
     [self addSubview:[v objectAtIndex:0]]; 
    } 

    return self; 
} 

- (void)dealloc 
{ 
    [super dealloc]; 
} 

@end 

我不知道,如果initWithFrame是正確的,但因爲該方法沒有開火,我懷疑這一點並不重要。如果我在看到子類方法觸發後在應用程序中放置斷點,則可以查看outlet子類,並且該框架與我在IB中創建的相同。

任何人有任何建議(缺少代碼,不良的IB連接等)在什麼尋找我已經錯過了或做錯了嗎?謝謝。

+0

你爲什麼要在一個視圖做一個的initWithCoder方法?是否有一些應用程序特定的數據正在歸檔/解壓縮? –

+0

另外,在awakeFromNib中設置一個斷點......如果它不是被加載的AnalyticsDetailView,那麼哪個nib文件***被加載? initWithFrame只會在你從父對象顯式地調用它的時候觸發(當你創建視圖時)。 –

回答

1

爲了讓您的界面顯示,您需要從父視圖控制器顯式實例化AnalyticsDetailView。

所以像viewDidLoad:viewWillAppear:方法的地方,你會添加一條線,說:

AnalyticsDetailView * newView = [[AnalyticsDetailView alloc] initWithFrame: CGRectMake(x,y,height,width)]; 
[parentView addSubview: newView]; 
[newView release]; // subview retains for us 
+0

我的主要NIB和視圖控制器類文件太大了,這就是爲什麼我試圖創建一個子類來將一些複雜度移動到另一個位置。我注意到了一些事情,我有一個InspectView類,它記錄了一個視圖以及所有的子視圖,在插座上使用它時,沒有子視圖。此外,有一個視圖出口在IB中顯示的子類,但有一個!在它旁邊,懸停顯示我的班級沒有名爲view的插座。另外,你以前的評論,我不知道如何判斷在awakeFromNib中加載哪個NIB文件。 –

+0

好的...我已經對我的回答做了修改。讓我知道這是否合理。 –

+0

感謝您的幫助邁克爾,它似乎現在工作。我不得不跳過一些箍環來讓輪換工作,但幸好另一個問題有我需要的答案。 –