现在一直在寻找答案,我认为由于我的阵列设置的性质,我可能正在寻找错误的答案!
我有一个处理向我的数组添加项目的类:
// Item.h
@interface Item : NSObject {
NSString *name;
NSNumber *seconds;
}
@property(nonatomic,copy) NSString *name;
@property(nonatomic,copy) NSNumber *seconds;
- (id)initWithName:(NSString *)n seconds:(NSNumber *)sec;
@end
和...
//item.m
@implementation Item
@synthesize name, seconds;
- (id)initWithName:(NSString *)n seconds:(NSNumber *)sec {
self.name = n;
self.seconds = sec;
return self;
}
@end
所以要添加一个项目,我使用
Item *item1 = [[Item alloc] initWithName:@"runnerA" seconds:[NSNumber numberWithInt:780]];
我有一些代码允许用户编辑文本字段(运行器名称)和UIdatepicker设置为小时和分钟的时间。在save方法中,这工作正常。这是我无法开展工作的更新。我尝试了很多!这是目前的代码......
mainAppDelegate *appDelegate = (mainAppDelegate *)[[UIApplication sharedApplication] delegate];
Item *item = [[Item alloc] initWithName:inputName.text seconds:[NSNumber numberWithInt:secs]];
[appDelegate.arrItems replaceObjectAtIndex:rowBeingEdited withObject:item];
以上只是在数组中添加一个新项目(这是我不想要的)。我不确定如何替换值。在该函数中,我有我需要更新的行(rowBeingEdited
),字段inputName.text
和secs
都可以。 (NSLog出来证实了这一点)。
如何使用replaceObjectAtIndex实际将其替换为值?!它现在让我发疯了!
答案 0 :(得分:2)
由于您只是尝试编辑特定行,为什么不使用已在Item
中设置的属性访问器?它看起来像这样:
Item *item = (Item *)[appDelegate.arrItems objectAtIndex:rowBeingEdited];
[item setName:inputName.text];
[item setSeconds:[NSNumber numberWithInt:secs]];
附注,您是使用垃圾收集,还是在向阵列添加项目时手动释放您创建的Item
个对象?如果您手动执行此操作,它应如下所示:
Item *item1 = [[Item alloc] initWithName:@"runnerA"
seconds:[NSNumber numberWithInt:780]];
[appDelegate.arrItems addObject:item1];
[item1 release];
这遵循经验法则:如果您alloc
,copy
或retain
任何事情,您还必须release
它。请注意,这是有效的,因为数组在添加时将保留该项目。
答案 1 :(得分:1)
NSArray
还是NSMutableArray
? NSMutableArray
,那么您是如何初始化并首先填充数组的? 例如,仅使用仅留出空间的-initWithCapacity:
或+arrayWithCapacity:
是不够的。您必须先使用-addObject:
作为第一轮人口,然后才能使用-replaceObjectAtIndex:withObject:
:
Note that NSArray objects are not like C arrays。也就是说,即使您在创建数组时指定了大小,指定的大小也会被视为“提示”;数组的实际大小仍为0.这意味着您无法在大于当前数组计数的索引处插入对象。例如,如果一个数组包含两个对象,其大小为2,那么您可以在索引0,1或2处添加对象。索引3是非法的并且超出范围;如果您尝试在索引3处添加对象(当数组的大小为2时),NSMutableArray会引发异常。