如何使用UITextView同步MutableArray中的节

时间:2011-03-21 21:02:29

标签: iphone objective-c cocoa-touch uitextview

我有一个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的某个索引处替换一个对象。就像现在一样,一旦我试图继续前进到下一个显然不再存在的索引位置,它就会崩溃。

感谢您的任何想法!

2 个答案:

答案 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];
}