将UITableViewCell设置为来自自定义对象实例的值

时间:2011-04-09 23:20:16

标签: objective-c uitableview

所以基本上我每次从Web请求收到有效响应时都尝试创建类的实例,然后将这些实例存储在一个数组中,以便以后可以访问它们的数据。然后,我尝试使用存储在数组中的实例的特定字段填充表视图。我一直有一些问题,因为我非常熟悉C ++并且使用向量做这种事情,然后根据我需要的索引进行访问,但是这让我脱掉了头发!谢谢,代码如下:

eventDetails.h:

@interface eventDetails : NSObject {
NSString *eventName, *eventID;
}

-(void) setEventID : (NSString *) ID;
-(void) setEventName: (NSString *) name;
-(NSString *) getEventName;
-(NSString *) getEventID;

并注意到

 NSMutableArray *events

在我的.h文件和

中声明
 events = [[NSMutableArray alloc] init]; 

已在viewDidLoad

中调用

然后我动态创建实例,因为从Web请求收到响应并将它们添加到数组中:

if ([elementName isEqualToString:@"id"])
{
    NSLog(@"at beginning of event, length is %i", [events count]);
    temp = [[eventDetails alloc] init];
    [temp setEventID:[NSMutableString stringWithString:soapResults]];

    [soapResults setString:@""];
    elementFound = FALSE; 
}

if ([elementName isEqualToString:@"name"])
{

    [temp setEventName:[NSMutableString stringWithString:soapResults]];
    [events addObject:temp];
    [soapResults setString:@""];
    elementFound = FALSE; 
    //[temp release];

}

完成所有操作后,我创建了一个小测试功能,以确保数据设置正确:

-(void) test{
for (eventDetails *s in events){
    NSLog(@"Entry ID: %@ with name %@", [s getEventID], [s getEventName]);
 }
}

我得到以下(正确的)输出:

2011-04-09 18:53:24.624 Validator [90982:207]条目ID:701,名称为iPhone Test Event     2011-04-09 18:53:24.625 Validator [90982:207]条目ID:784与名称另一个iPhone测试事件     2011-04-09 18:53:24.626 Validator [90982:207]条目号:839,名称为第三个iphone

然后我尝试刷新表视图,并从数组中的实例中提取数据:

 // Customize the appearance of table view cells.
 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";
//---try to get a reusable cell---
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
//---create new cell if no reusable cell is available---
if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                                  reuseIdentifier:CellIdentifier] autorelease];
}
//---set the text to display for the cell---
eventDetails *cellDetails = [[eventDetails alloc] init];
NSInteger row = [indexPath row];
cellDetails = [[self events] objectAtIndex:row];

NSString *cellValue = [cellDetails getEventName];
NSLog(@"Event is: %@", cellValue);
cell.textLabel.text = cellValue;
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
return cell;

}

但是每次程序到达这个部分时,它崩溃了我说的EXC_BAD_ACCESS:

 cell.textLabel.text = cellValue;

感谢您的帮助。我想我可能在如何声明eventDetails类的实例时做错了,但是我不确定它是否正确存储那些数据。如果您需要更多代码,我会缺少部分。

1 个答案:

答案 0 :(得分:0)

您发布的代码中有太多遗漏的详细信息,但我的猜测是eventName未被保留,并且在您尝试使用之前的某个时间被释放。

检查您的setEventName:实施情况;它需要将retaincopy发送到name参数,以确保在您使用它之前不会释放该字符串。但是,如果你想避免内存泄漏,情况要比这更复杂,所以如果你还没有这样做,我建议你阅读内存管理,特别是Apple优秀的内存管理编程指南。 (注意:由于Apple不断更改链接,我已经放弃了发布链接。)

附注:请勿使用单词get为访问者方法的名称添加前缀;这在Java或C ++中会很好,但这是Objective-C。您的访问者应如下所示:

- (NSString *)eventName;
- (NSString *)eventID;

无法保证依赖内省的Foundation机制能够正确处理不符合文档命名约定的访问器,因此这是另一回事。 : - )