0

所以,情况就是这样。我有一个基类 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 方法并且失败了。在通话之前使用它,它似乎工作得很好。

这是正确的方法还是我做错了?

谢谢!

4

1 回答 1

0

您可以[super viewDidLoad]在执行自己的初始化代码后调用。如果你的超类期望你初始化一些它会使用的东西,那是完全合理的。

你可能不应该打电话[_tableView setAutoresizesSubviews:YES]。表格视图有一个复杂的系统来布置它的子视图,你不知道它是否想要设置那个标志。

如果[self view]实际上是表视图,那么我相信调用[[self view] setBackgroundColor:]是调用tableView:cellForRowAtIndexPath:(间接)。您可以通过在您的中放置一个断点并在堆栈跟踪中tableView:cellForRowAtIndexPath:查找setBackgroundColor:(and ) 来检查这一点。viewDidLoad

于 2013-07-24T21:27:53.760 回答