所以,情况就是这样。我有一个基类 SSSAdEnabledTableViewController 和一个 XIB 文件,该文件在主视图内有一个 _contentView ,在该视图内有一个 _tableView 。基类用于呈现/隐藏广告。
然后我有许多从该基类继承的子类。除了那些需要非标准表格单元格(在本例中为 SSSDataEntryTableCell)的表格视图之外,大多数表格视图都可以正常工作。
如果我在调用 super 后尝试在我的子类的 viewDidLoad 中为该自定义表格单元格注册笔尖,它不起作用,并且我的表格视图数据源和委托返回 nil 单元格。但是,如果我在调用 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 方法并且失败了。在通话之前使用它,它似乎工作得很好。
这是正确的方法还是我做错了?
谢谢!