我有一个MutableArray(NSMutableArray * NoteBook;),我想在其中存储Notepages(我设置了一个名为NotePage.m的对象,它只包含一个NSString * noteText和一个setNoteText方法)。我还有一个整数来跟踪我的页面(NSUInteger currentPageCounter;)。
我通过设置NotePage的新实例来启动我的小程序:
NotePage *newPage = [[NotePage alloc] init];
[newPage setNoteText:@"Sample Text for a certain page..."];
然后我将这个* newPage复制3次到我的NoteBook Mutable Array中:
[self.NoteBook insertObject:newPage atIndex:(self.currentPageCounter)];
这将给我3页,在指数0,1,2。到现在为止还挺好。一切都很棒。但现在来了敌人,UITextView。首先,我想在UITextView中显示我的NoteBook中页面的内容。所以我这样做是为了将MutableArray中的一个部分(例如索引0处的页面)与可以正常工作的UITextView同步:
NotePage *thisPage = [self.NoteBook objectAtIndex:self.currentPageCounter];
TextViewNote.text = thisPage.noteText;
但问题是,如果我想编辑我的UITextView并使用MutableArray同步更新的文本。这就是发生崩溃的地方......我已经用一个单独的方法编写了这个,一旦用户编辑完UITextView就可以点击它:
-(IBAction) savePage
{
NSString *tempString;
tempString = [NSString stringWithFormat:@"%@",TextViewNote.text];
NotePage *newPage = [[NotePage alloc] init];
[newPage setNoteText:tempString];
[self.NoteBook insertObject:newPage atIndex:(self.currentPageCounter)]; // e.g. at index 0 for page 1
[self.NoteBook removeObjectAtIndex:(currentPageCounter+1)]; // i.e. this is to remove the old page 1 which used to be at index 0 but now is at index 1
[self syncTextView];
[self syncCounter];
}
我想有一种不那么麻烦的方式(我还是初学者......)只需在Mutable Array的某个索引处替换一个对象。就像现在一样,一旦我试图继续前进到下一个显然不再存在的索引位置,它就会崩溃。
感谢您的任何想法!
答案 0 :(得分:2)
我想有一种不那么繁琐的方式 (我还是初学者......)简单地说 替换某个索引处的对象 在一个可变阵列。
事实上。请看 - [NSMutableArray replaceObjectAtIndex:withObject:]。
考虑到你发布的错误,听起来你的某个地方有一个糟糕的指针。错误是抱怨某处, - [UITouchData length]消息被发送到NotePage的实例。打开调试器中的“Stop-Objective-C Exceptions”选项(在“运行”菜单下)。这应该可以帮助您了解问题发生的位置。
答案 1 :(得分:1)
NSMutableArray
有一个方法replaceObjectAtIndex:withObject:
应该做你想做的事。
但是,除非在将release
添加到数组后调用newPage
,否则会遇到内存管理问题。除非您计划使NotePage
类更复杂,否则更改项目的文本而不是替换新对象可能是有意义的:
[[self.noteBook objectAtIndex:currentPageCounter] setNoteText:tempString];
(另外,请注意,将newPage
对象插入数组四次不复制对象;它只是插入相同的引用四次。如果你想要四个不同的对象,你需要在一个循环中分配四个对象:
for(i = 0; i < 4; i++){
NotePage *newPage = [[NotePage alloc] init];
[newPage setNoteText:@"Dummy text"];
[self.notebook addObject:newPage];
[newPage release];
}