Xcode 4.2 iPhone项目
我正在尝试创建一个从NSMutableArray填充的tableView。目前,当我运行模拟器时,有问题的tableView显示5行(这是正确的)但所有行都有相同的字符串(这显然是不正确的)。显示的字符串来自我的NSMutableArray中定义的LAST对象。这是代码:
- (void)viewDidLoad
{
[super viewDidLoad];
codes = [[NSMutableArray alloc] init];
TableList *listItem = [[TableList alloc] init];
[listItem setCodeTitle:@"Test Name 1"];
[listItem setCodeNumber:@"101"];
[listItem setCodeDescription:@"This is the description for 101."];
[codes addObject:listItem];
[listItem setCodeTitle:@"Test Name 2"];
[listItem setCodeNumber:@"102"];
[listItem setCodeDescription:@"This is the description for 102."];
[codes addObject:listItem];
[listItem setCodeTitle:@"Test Name 3"];
[listItem setCodeNumber:@"103"];
[listItem setCodeDescription:@"This is the description for 103."];
[codes addObject:listItem];
[listItem setCodeTitle:@"Test Name 4"];
[listItem setCodeNumber:@"104"];
[listItem setCodeDescription:@"This is the description for 104."];
[codes addObject:listItem];
[listItem setCodeTitle:@"Test Name 5"];
[listItem setCodeNumber:@"105"];
[listItem setCodeDescription:@"This is the description for 105."];
[codes addObject:listItem];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
//#warning Potentially incomplete method implementation.
// Return the number of sections.
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
//#warning Incomplete method implementation.
// Return the number of rows in the section.
return [codes count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"CodeCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
// Configure the cell...
TableList *current = [codes objectAtIndex:indexPath.row];
cell.textLabel.text = [current codeTitle];
return cell;
}
我希望对于比我更有经验的人来说,这是非常明显的......我很少。
答案 0 :(得分:3)
您将完全相同的对象存储在阵列中5次。你好像误以为-addObject:
会复制它所交给的对象,但事实并非如此。简单的解决方法是将-addObject:
行更改为
[codes addObject:[[listItem copy] autorelease]];
这当然是假设您的TableList
类符合<NSCopying>
。如果没有,你可能想要这样做。如果您不愿意支持在该课程中进行复制,那么您每次都必须创建一个新的TableList
对象。
此外,除非您使用ARC,否则您将泄露TableList
对象。
为了支持-copy
,您必须符合<NSCopying>
,这是一个声明方法-copyWithZone:
的协议(虽然区域参数是一个应该被忽略的历史好奇心) 。为此,请将@interface
行修改为
@interface TableList : NSObject <NSCopying>
然后实现方法-copyWithZone:
- (id)copyWithZone:(NSZone *)zone {
// If our superclass conformed to <NSCopying> we'd call [super copy]
// But it doesn't, so alloc/init a new instance
TableList *newObj = [[TableList alloc] init];
newObj.codeTitle = self.codeTitle;
newObj.codeNumber = self.codeNumber;
newObj.codeDescription = self.codeDescription;
return newObj;
}
这只是一个示例实现。它假定这3个属性是对象上的唯一值,并且只是分配给属性是合适的。如果你有需要复制的内部ivars,你可以通过使用类似
的方式获得ivar访问权限newObj->ivar = copyIvar(self->ivar); // self->ivar is the same as just plain ivar
答案 1 :(得分:0)
此外,如果您使用的是NSMutableArray,请尝试将其链接到NSArray。