无法在UITableView实现中调用委托/数据源方法

时间:2013-11-18 15:00:12

标签: ios iphone objective-c uitableview

我为UITableView创建了名为mainTableViewgm.hmainTableViewgm.m的.h和.m文件。我正在调用 - initWithFrame:从我的主视图控制器到此mainTableViewgm.m实现文件的方法

[[mainTableViewgm alloc]initWithFrame:tableViewOne.frame]

请注意,此tableview位于我的主视图控制器中。但是我已经为tableView创建了单独的文件,并且还在故事板中将自定义类设置为mainTableViewgm

-initWithFrame:方法如下所示

- (id)initWithFrame:(CGRect)frame
{

//NSLog(@"kource data");
self = [super initWithFrame:frame];
if (self)
{
    [self setDelegate:self];
    [self setDataSource:self];
    [self tableView:self cellForRowAtIndexPath:0];
    [self tableView:self numberOfRowsInSection:1];
    // Initialization code
}

return self;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
NSLog(@"kource data");
return 1;
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath     *)indexPath
{
NSLog(@"kource data2");
UITableViewCell*cellOne =[[UITableViewCell alloc]init];
cellOne.detailTextLabel.text=@"text did appear";
return cellOne;
}

-initWithFrame:被称为罚款以及此方法中的'if(self)'块。但问题是numberOfRowsInSection:并且此处未自动调用cellForRowAtIndexPath:kource data / kource data2永远不会出现在日志中。如何加载表格? delegate / datasource设置不正确吗?

我必须提到我还设置了UITableViewDelegateUITableviewDataSource协议:

@interface mainTableViewgm : UITableView <UITableViewDelegate,UITableViewDataSource>
@end

非常感谢帮助。谢谢。

2 个答案:

答案 0 :(得分:0)

控制器初始化时未加载您的tableview,因此您无法在init方法中执行此操作。您必须将代码移至viewDidLoad方法。

此外,您没有在tableview对象上设置委托和数据源(可能是一种类型,您在视图控制器上设置它们)。它应该是这样的:

- (void)viewDidLoad:(BOOL)animated {
    [super viewDidLoad:animated];
    [self.tableView setDelegate:self];
    [self.tableView setDataSource:self]; // <- This will trigger the tableview to (re)load it's data
}

接下来就是正确实现UITableViewDataSource方法。 UITableViewCell *cellOne =[[UITableViewCell alloc] init];未返回有效的单元格对象。您应该至少使用initWithStyle:。并了解如何使用dequeueReusableCellWithIdentifier:forIndexPath:。典型的实现如下所示:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";

    // Reuse/create cell    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    // Update cell contents
    cell.textLabel.text = @"Your text here";
    cell.detailTextLabel.text=@"text did appear";

    return cell;
}

答案 1 :(得分:0)

我无法相信我已经做了两年的XCode编程,但仍然遇到了这个问题。

我遇到了与XCode 6.1相同的问题 - 我正在设置我的UITableView代表&amp; viewWillAppear函数中的dataSource,但没有任何委托函数正在进行中。

但是,如果我右键点击了故事板上的UITableView,则委托和dataSource的圈子都是空的。

然后,解决方案是按住CTRL键,然后从每个圈子拖动到包含UIView的{​​{1}}的名称:

enter image description here

完成此操作后,我UITableView愉快地填充了自己。

(那么,我们现在是XCode的v6.1了吗?你认为Apple会做出这件事,你知道吗,友好 ......我会相当的喜欢在我的代码中添加书签......这是一个不错的功能。)