我遇到了麻烦,我正在寻求帮助。
我需要在单元格中保存标识符,所以我做了一个子类 UITableViewCell并添加了标识符属性。在我看来 控制器我按如下方式创建单元格:
- (SidebarCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell* tableViewCell = [super tableView:tableView cellForRowAtIndexPath:indexPath];
SidebarCell * cell = (SidebarCell *)tableViewCell;
Category *category = [categoryDataController.categories objectAtIndex:indexPath.row];
cell.textLabel.text = category.name;
if (category.checked == 1) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
cell.accessoryType = UITableViewCellAccessoryNone;
}
return cell;
}
问题是当我选择其中一个单元格时,该方法 cellForRowAtIndexPath:返回一个UTableViewCell对象 一个SidebarCell,所以我没有访问标识符属性:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO];
SidebarCell *cell = (SidebarCell *)[tableView cellForRowAtIndexPath:indexPath]; // Trying to cast from UITableViewCell to SidebarCell
if (cell.accessoryType == UITableViewCellAccessoryNone) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
[CategoryDataController updateRow:cell.identifier status:1]; // Here the app crashes
} else if (cell.accessoryType == UITableViewCellAccessoryCheckmark) {
cell.accessoryType = UITableViewCellAccessoryNone;
[CategoryDataController updateRow:cell.identifier status:0];
}
}
有没有办法让cellForRowAtIndexPath:返回一个Sidebarcell对象?
事先谢谢。
修改
SidebarCell.h
#import <UIKit/UIKit.h>
@interface SidebarCell : UITableViewCell
@property (nonatomic) NSInteger identifier;
@end
SidebarCell.m:
#import "SidebarCell.h"
@implementation SidebarCell
@synthesize identifier;
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
return self;
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];
// Configure the view for the selected state
}
@end
错误:
2012-04-24 09:21:08.543 Dongo[2993:11603] -[UITableViewCell identifier]: unrecognized selector sent to instance 0x6d87d50
2012-04-24 09:21:08.571 Dongo[2993:11603] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITableViewCell identifier]: unrecognized selector sent to instance 0x6d87d50'
*** First throw call stack:
(0x14b1052 0x1a65d0a 0x14b2ced 0x1417f00 0x1417ce2 0x116bc 0x48e71d 0x48e952 0xd1686d 0x1485966 0x1485407 0x13e87c0 0x13e7db4 0x13e7ccb 0x239d879 0x239d93e 0x3fea9b 0x2e85 0x2715 0x1)
terminate called throwing an exception(lldb)
答案 0 :(得分:4)
您应该保持tableView:cellForRowAtIndexPath:
方法签名的完整性:它应该返回(UITableViewCell *)而不是您的自定义单元类。由于您的SidebarCell
是UITableViewCell
的子类,因此它应该“正常工作”。无需致电super
或其中任何一项:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
SidebarCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CellIdentifier"];
if (cell == nil) {
cell = [[SidebarCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:@"CellIdentifier@"];
}
// ... set up the cell here ...
return cell;
}
在其他方法中,演员表应该像你一样工作:
SidebarCell *cell = (SidebarCell *)[tableView cellForRowAtIndexPath:indexPath];
答案 1 :(得分:2)
UITableViewCell* tableViewCell = [super tableView:tableView cellForRowAtIndexPath:indexPath];
以上代码行必须返回UITableViewCell
而不是SidebarCell
。
SidebarCell * cell = (SidebarCell *)tableViewCell;
然后在你的第二行你将单元格转换为SidebarCell
,但你只是骗了编译器并告诉它它应该是SidebarCell
,而实际上它不是。当你施展某些东西时,它需要从正确的类型开始。
您应该创建一个实际的SidebarCell,而不是这两行。如何执行此操作取决于您如何定义它。
让我知道它是在故事板,xib中,还是在代码中创建,如果需要,我可以提供一个示例。
修改强>
由于您是在代码中创建单元格,因此您只需将cellForRowAtIndexPath
中的前两行替换为:
SidebarCell * cell = [[SidebarCell alloc] init];
其他一切看起来应该按原样运作。
答案 2 :(得分:0)
在我的情况下,我使用了类tempTableViewcell的自定义单元格
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *identifier = @"cellidentifier";
tempTableViewcell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
}
cell.textLabel.text = @"abc";
return cell;
}