2013-07-24 49 views
0

所以,這裏是情況。我有一個基類SSSAdEnabledTableViewController,它帶有一個XIB文件,在主視圖中有一個_contentView,在該視圖中有_tableView。基類正被用於渲染/隱藏廣告。在調用super之前,UIViewController的子類可以在viewDidLoad中做一些初始化嗎?

然後我有許多繼承自該基類的子類。除了那些需要非標準表格單元格(在本例中爲SSSDataEntryTableCell)的表格之外,大多數表格視圖都可以正常工作。

如果我嘗試在調用super後在我的子類的viewDidLoad中註冊該自定義表格單元格的nib,它不起作用,我的表格視圖數據源和委託將返回零單元格。但是,如果我在致電super之前註冊NIB,它似乎工作得很好。

我有的問題是,如果這是不好的做法,並表明我做錯了什麼,反過來導致需要做到這一點。

相關的代碼片段如下:

的基類 - SSSAdEnabledTableViewController

@interface SSSAdEnabledEditTableViewController : UIViewController <ADBannerViewDelegate, UITableViewDataSource, UITableViewDelegate> 
{ 
    // the data table 
    UITableView *_tableView; 

    // our inner view (to show/hide ads) 
    UIView *_contentView; 

    // our ad banner 
    ADBannerView *_bannerView ; 
} 

@property (retain, nonatomic) IBOutlet UIView *contentView; 
@property (retain, nonatomic) IBOutlet UITableView *tableView; 
@property (nonatomic, retain) ADBannerView *bannerView ; 

@end 

而且它的viewDidLoad方法:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // 
    // set the appropriate background color 
    // 
    UIColor *clr = nil ; 

    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) 
    { 
     clr = kSSSDefaultBackgroundColor ; 
    } 
    else 
    { 
     clr = [UIColor groupTableViewBackgroundColor] ; 
    } 

    [[self view] setBackgroundColor:clr] ; 

    [_tableView setAutoresizesSubviews:YES] ;  
} 

這裏是子類的viewDidLoad方法之一:

- (void)viewDidLoad 
{ 
    // Load the NIB file for our custom cell -- do this before [super viewDidLoad]! 
    UINib *nib = [UINib nibWithNibName:kSSSDataEntryTableCell bundle:nil] ; 

    // Register the NIB which contains the cell 
    [_tableView registerNib:nib forCellReuseIdentifier:kSSSDataEntryTableCell] ; 

    [super viewDidLoad]; 

    // ... does some other stuff not relevant to the question at hand ... 
} 

因此,如果我首先調用[super viewDidLoad],那麼在NIB註冊並且失敗之前,代碼正在爲cellForRowAtIndexPath調用UITableView方法。通話之前,它似乎工作得很好。

這是正確的方法來做到這一點,或者我是我做錯了嗎?

謝謝!

回答

0

執行自己的初始化代碼後,您可以調用[super viewDidLoad]。如果你的超類想要你初始化一些它將會使用的東西,這是非常合理的。你可能不應該叫[_tableView setAutoresizesSubviews:YES]。表格視圖有一個複雜的系統來佈置它的子視圖,你不知道它是否需要設置標誌。

如果[self view]實際上是表格視圖,那麼我認爲對[[self view] setBackgroundColor:]的調用正在調用tableView:cellForRowAtIndexPath:(間接)。您可以通過在tableView:cellForRowAtIndexPath:中放置斷點並在堆棧跟蹤中查找setBackgroundColor:(和viewDidLoad)來檢查此問題。

+0

謝謝!這就解釋了爲什麼我看到了對tableView:cellForRowAtIndexPath的調用。從來不會想到設置背景會導致該問題。再次感謝。 –

相關問題