Objective c 将UITableViewCell设置为自定义对象实例中的值
因此,基本上,每次我从web请求收到有效响应时,我都会尝试创建下面类的实例,然后将这些实例存储在数组中,以便以后可以访问它们的数据。然后,我尝试使用存储在数组中的实例中的特定字段填充表视图。我一直有一些问题,因为我很熟悉C++,并用向量做这种事情,然后只是根据我需要的索引访问,但这让我揪了我的头发!谢谢,代码如下: eventDetails.h:Objective c 将UITableViewCell设置为自定义对象实例中的值,objective-c,uitableview,Objective C,Uitableview,因此,基本上,每次我从web请求收到有效响应时,我都会尝试创建下面类的实例,然后将这些实例存储在数组中,以便以后可以访问它们的数据。然后,我尝试使用存储在数组中的实例中的特定字段填充表视图。我一直有一些问题,因为我很熟悉C++,并用向量做这种事情,然后只是根据我需要的索引访问,但这让我揪了我的头发!谢谢,代码如下: eventDetails.h: @interface eventDetails : NSObject { NSString *eventName, *eventID; } -(vo
@interface eventDetails : NSObject {
NSString *eventName, *eventID;
}
-(void) setEventID : (NSString *) ID;
-(void) setEventName: (NSString *) name;
-(NSString *) getEventName;
-(NSString *) getEventID;
还要注意的是
NSMutableArray *events
在my.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验证程序[90982:207]条目ID:701,名称为iPhone测试事件
2011-04-09 18:53:24.625验证器[90982:207]条目ID:784,名称另一个iPhone测试事件
2011-04-09 18:53:24.626验证器[90982:207]条目ID: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_访问,我说:
cell.textLabel.text = cellValue;
谢谢你的帮助。我想我可能在声明eventDetails类的实例时出错了,但我不确定,因为它在存储数据方面工作正常。如果您需要更多的代码,我会提供缺少的部分。您发布的代码中有太多遗漏的细节,无法确定,但我猜,
eventName
没有保留,并且在您尝试使用它之前的某个时间被释放
检查您的setEventName:
实现;它需要将retain
或copy
发送到name
参数,以确保在使用完字符串之前不会释放该字符串。然而,如果你想避免内存泄漏,情况要比这复杂得多,因此如果你还没有这样做,我建议你阅读内存管理,特别是苹果优秀的内存管理编程指南。(注:由于苹果不断更改链接,我已放弃发布链接)
旁注:不要在访问器方法的名称前加上单词get
;在java或C++中,这是很好的,但是这是Objto-C。
- (NSString *)eventName;
- (NSString *)eventID;
不能保证依赖内省的基础机制能正确地工作,而不遵循记录的命名约定,所以这是另一回事。p> 在您发布的代码中,
events
未声明为实例变量,因此我不确定您所说的“events
在我的.h文件中声明”是什么意思。如果不是实例变量,events
在哪里定义?对,这不是很清楚。事件是此特定viewController的实例变量。在这个视图控制器的.h文件(我没有发布)中,我声明了NSMutableArray*事件;然后在控制器的viewDidLoad中初始化它。谢谢谢谢我改变了这些访问器,读了一点,所以我现在明白了这是多么重要。我读了你提到的文章和其他几篇关于Objective C内存管理的文章,正如你所建议的,它们都提到在setter中保留引用。但是,为了避免泄漏,如果我将setter设置为:-(void)eventID:(NSString*)ID{eventID=[ID retain];}只要调用[[eventName objectAtIndex:indexPath.row]release],我就可以-(void)dealoc{[eventID release];};当我在我的主程序中完成它时?不完全是。我建议多花点时间阅读《内存管理指南》。这需要一点时间来了解全貌,我想你会发现没有它你真的走不了多远。