在UITableView子类中设置UITableViewDataSource无效

时间:2014-07-30 05:21:09

标签: ios objective-c uitableview datasource

在我的故事板中,我有一个简单的视图控制器,里面包含一个UITableView。

enter image description here

SceneFormVC.m

@property (nonatomic, strong) IBOutlet SceneFormTV  *sceneFormTable;

在改善我的MVC和制作“打火机”的过程中。 VC,我将UITableView子类化,以便更好地分离关注点和代码重用。

SceneFormTV.h

@interface SceneFormTV : UITableView <UITableViewDataSource, UITableViewDelegate, UITextFieldDelegate>

SceneFormTV.m

@implementation SceneFormTV

- (id)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];
    if (self)
    {
         self.dataSource = self;
         self.delegate   = self;
    }

    return self;
}

这里的问题是当我在dataSource/delegate = self期间尝试在我的子类中设置initWithCoder时(由故事板设置调用),然后它对导致其余的UITableView方法无效被称为(eg. (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath)

但是如果我在主VC中设置dataSource/delegate指针( SceneFormVC.m ),那么UITableView就会按预期工作。

@implementation SceneFormVC

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.sceneFormTable.dataSource = self.sceneFormTable;
    self.sceneFormTable.delegate   = self.sceneFormTable;

我不太明白为什么我的SceneFormTV子类在内部使用完全相同的dataSource/delegate指针时无法操作?

1 个答案:

答案 0 :(得分:1)

这个最初的目标是IBOutlets,但在你的情况下也应该有效。

  

调用initWithCoder时,对象尚不存在,并且在调用viewDidLoad时它们也存在。通过使用类似:

之类的方法注销worldView的值来检查initWithCoder方法
NSLog(@"%@", self.datasource);
  

它将是零。它们将在调用viewDidLoad之前初始化,因此您可以在那里设置它们。

来源:Objective-C iOS Development Using viewDidLoad or initWithCoder when setting Variables and Why?