UITableView dataSource 必须从 tableView:cellForRowAtIndexPath 返回一个单元格:

Posted

技术标签:

【中文标题】UITableView dataSource 必须从 tableView:cellForRowAtIndexPath 返回一个单元格:【英文标题】:UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath: 【发布时间】:2010-10-12 09:38:25 【问题描述】:

进口

我正在尝试实现一个自定义单元格以在我的表格视图中使用

这是我的自定义单元界面类

@interface CustomCell : UITableViewCell 
    IBOutlet UILabel *nameLabel;
    IBOutlet UITextView *inputText;
    IBOutlet UIImageView *image;
    IBOutlet UIButton *btnBuy;


@property (nonatomic, retain) IBOutlet UILabel *nameLabel;
@property (nonatomic, retain) IBOutlet UITextView *inputText;
@property (nonatomic, retain) IBOutlet UIImageView *image;
@property (nonatomic, retain) IBOutlet UIButton *btnBuy;

@end

这是我的视图控制器

#import "CustomCellProjectViewController.h"

@implementation CustomCellProjectViewController

@synthesize nameLabel, inputText, image, btnBuy, listData;

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad 
    image = [[UIImageView alloc] init];
    btnBuy = [[UIButton alloc] init];
    inputText = [[UITextView alloc] init];
    nameLabel = [[UILabel alloc] init];

    NSDictionary *row1 = [[NSDictionary alloc] initWithObjectsAndKeys:image, @"image", inputText, @"text", nameLabel, @"label", btnBuy, @"button", nil];

    NSArray *array = [[NSArray alloc] initWithObjects:row1, nil];
    self.listData = array;

    [row1 release];
    [array release];
    [super viewDidLoad];


- (void)didReceiveMemoryWarning 
    [super didReceiveMemoryWarning];


- (void)viewDidUnload 
    self.listData = nil;



- (void)dealloc 
    [listData release];
    [super dealloc];


#pragma mark -
#pragma mark Table View Data Source Methods
- (NSInteger)tableView:(UITableView *)tableView
 numberOfRowsInSection:(NSInteger)section 
    return [self.listData count];


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

    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CustomCellIdentifier];
    if (cell == nil)
    
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
        for (id oneObject in nib)
            if ([oneObject isKindOfClass:[CustomCell class]]) 
                cell = (CustomCell *)oneObject;
            
    
    return cell;


- (NSIndexPath *)tableView:(UITableView *)tableView
willSelectRowAtIndexPath:(NSIndexPath *) indexPath
    NSUInteger row = [indexPath row];
    if (row == 0)
        return nil;
    return indexPath;


- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    NSUInteger row = [indexPath row];
    NSString *rowValue = [listData objectAtIndex:row];
    NSString *message = [[NSString alloc] initWithFormat:@"You selected %@", rowValue];

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Row Selection" message:message delegate:nil cancelButtonTitle:@"Okay" otherButtonTitles:nil];
    [alert show];
    [message release];
    [alert release];
    [tableView deselectRowAtIndexPath:indexPath animated:YES];


- (CGFloat) tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath 
    return kTableViewRowHeight;


@end

但我收到一个错误:

UITableView 数据源必须返回一个 细胞来自 表视图:cellForRowAtIndexPath:

单元格剩余为零

谁能帮帮我?

【问题讨论】:

【参考方案1】:

至于我,我会手动为 CustomCell 编写代码。 然后,我可以使用 -cellForRowAtIndexPath 中的单元格,如下所示。

- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath 

    static NSString *CustomCellIdentifier = @"CustomCellIdentifier";

    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CustomCellIdentifier];
    if (cell == nil)
     
        cell = [[[CustomCell alloc] initByMyWayWithIdentifier:CustomCellIdentifier] autorelease];
    

    // assign necessary information to cell

    return cell;

【讨论】:

这一切都很好,但是原始发布者想要(或不想要?)使用 xib。所以我假设他/她的问题的答案应该考虑到这一点。 @Stelian:你是对的。我之前有来自 xib 的称重传感器,但最后我更喜欢为子类化单元编写代码。通常,自定义单元格简单且易于实现。【参考方案2】:

我发现从 xib 文件中获取单元格的方式非常可疑。不知道这是否是问题(当您调试该方法时会发生什么?)。

您的 CustomCell 是否需要在单独的 xib 中,您是否在不同的 VC 中使用它?如果没有,您可以尝试将其粘贴到 VC 的 xib 中,然后简单地创建一个 IBOutlet 并将其连接到您的 CustomCell。

【讨论】:

CustomCell在CustomCell.XIB名称下的同一个项目文件中 所以换句话说我把 IBOutlet CustomCell *cell;在我的控制器接口文件中? CustomCell 是 UITableViewCell 类型 好吧,不,如果你有它在不同的 xib 中,那么你不能只将它添加到 Controller 类中。您可以尝试调试并查看您的单元在哪一步没有加载吗? (即保持为零)。 if ([oneObject isKindOfClass:[CustomCell class]]) cell = (CustomCell *)oneObject; 永远不是真的

以上是关于UITableView dataSource 必须从 tableView:cellForRowAtIndexPath 返回一个单元格:的主要内容,如果未能解决你的问题,请参考以下文章

我的应用程序崩溃,原因'UITableView dataSource 必须从 tableView 返回一个单元格:cellForRowAtIndexPath

UITableView 在 tableview.datasource 开始时崩溃

一行代码,快速为UITableView创建Delegate和DataSource

UITableView 仅用于 GUI 控件,没有 DataSource

在 ViewController 中使用带有外部 DataSource 和 UITableView 的自定义 UITableViewCell

UITableView dataSource 对象在滚动时变为空