Objective c NSTableView+NSTextView=灾难:(

Objective c NSTableView+NSTextView=灾难:(,objective-c,xcode,macos,cocoa,Objective C,Xcode,Macos,Cocoa,这让我有点疯狂 下面是到目前为止我的程序的截图 右侧是基于NSTableView的视图。用户可以在此处选择要处理的文档 左侧是NSTextView。将根据他们在NSTableView中选择的项目显示文本 在tableview中还有用于创建/删除新项的大加号和减号按钮 简单吧?我希望如此 现在我有了它,因此tableview从可变数组获取数据。可变数组包含名为DocumentItem的类的对象。DocumentItem只有两个字符串,一个用于文档文本,一个用于文档标题 到目前为止有效的方法是: 当

这让我有点疯狂

下面是到目前为止我的程序的截图

右侧是基于NSTableView的视图。用户可以在此处选择要处理的文档

左侧是NSTextView。将根据他们在NSTableView中选择的项目显示文本

在tableview中还有用于创建/删除新项的大加号和减号按钮

简单吧?我希望如此

现在我有了它,因此tableview从可变数组获取数据。可变数组包含名为DocumentItem的类的对象。DocumentItem只有两个字符串,一个用于文档文本,一个用于文档标题

到目前为止有效的方法是:

当我使用代码手动将对象添加到数组中时,我可以自由地在文档之间切换,textview将相应地更新

什么不起作用:

当用户切换到其他文档时,我希望调用NSTableView replaceObjectAtIndex方法来保存他们对数组中的对象所做的更改

到目前为止,我的代码是如何工作的:

可变数组存储在一个数据类中。该数据类是一个共享类,在我的代码中称为数据

在我的类中有一个线程循环,它具有textview。在我的tableview类中,我有一个名为blastToScreen的方法,该方法将名为shouldBLAST的BOOL更改为YES

下面是我的TableController类中用于将BOOL设置为YES的代码:

- (void) blastToScreen{

    theDATA.blasttext = [[theDATA.globaldoclist objectAtIndex:[tablevieww selectedRow]] doccontents];
    theDATA.shouldBLAST=YES;

}
这是我的循环线程中与textview不同的类中的shouldBLAST方法。请注意,if语句中显示iftheDATA.switchedrow,以确保某些代码仅在用户在tableview中切换行时运行

if(theDATA.shouldBLAST){

        if(theDATA.switchedrow){
            DocumentItem * itemr = [theDATA.globaldoclist objectAtIndex:theDATA.lastindex];

            NSLog(@"(%li) prev content - >%@",(long)theDATA.lastindex,itemr.doccontents);

            itemr.doccontents=textvieww.string;

            NSLog(@"(%li)adding content - > %@ <- to %@",theDATA.lastindex, itemr.doccontents,itemr.docname);

            theDATA.switchedrow=NO;
            [theDATA.globaldoclist replaceObjectAtIndex:theDATA.lastindex withObject:itemr ];

            NSLog(@"changed: - > %@",[[theDATA.globaldoclist objectAtIndex:theDATA.lastindex] doccontents]);

        }





             textvieww.string=theDATA.blasttext;
             theDATA.shouldBLAST=NO;
        NSLog(@"changed: - > %@",[[theDATA.globaldoclist objectAtIndex:theDATA.lastindex] doccontents]);
        theDATA.lastindex=theDATA.selectedrow;



    }
以下是关于这一切的奇怪部分:

根据我设置的NSLog语句,我的代码在瞬间工作,然后重置

下面是控制台显示的内容。忽略0。这只是指最后选择的索引

它说的是切换前的文本没有任何问题。它说它正在将文本马铃薯添加到该数组中。然后,我第一次从数组中获取对象时,它显示它成功地更改为PotatoStill fine。然后,当我在几行后尝试获取相同的精确数据时,它没有返回任何结果:

我觉得这个问题存在于我的TableController类中的某个地方。请参阅TableController类中的代码

以下是控制台返回的内容:

2015-09-14 17:17:46.024 Simplicity[4801:432580] (0) prev content - >
2015-09-14 17:17:46.025 Simplicity[4801:432580] (0)adding content - > Potato <- to Untitled
2015-09-14 17:17:46.025 Simplicity[4801:432580] changed: - > Potato
2015-09-14 17:17:46.025 Simplicity[4801:432580] changed: - > 
我真的希望你们能帮助我。我尽了最大努力来解决这个问题。这让我无法完成我的软件。

也许,DocumentItem类的doccontents属性很强,或者在应该复制时保留

从NSTextView继承的:

出于性能原因,此方法返回文本对象的当前备份存储。如果要在操作文本存储时维护此备份存储的快照,则应创建相应子字符串的副本


因此,如果您只是保留对同一对象的引用,当文本视图的内容发生更改时,您所引用的对象的内容也会发生更改。您需要制作一个私有副本。

如果不知道数据是什么,很难提供帮助。globaldoclist,您可以记录该值吗?@aug2uag globaldoclist是我正在使用的共享数组我正在使用nstableview。另一个灾难是你的问题演示文稿的长度。请尽量简短。没有人会花超过30秒的时间阅读其他人带来的问题。@ElTomato lol抱歉。我只是不知道还有什么地方可以求助,我很难在不遗漏细节的情况下将问题浓缩。非常感谢!我不能相信2秒钟的改变就解决了。我需要多读一些关于房产的书。你是个救命恩人!