在从 NSMutableDictionary 加载的 textview 中保存更改的文本

Posted

技术标签:

【中文标题】在从 NSMutableDictionary 加载的 textview 中保存更改的文本【英文标题】:saving changed text in textview loaded from NSMutableDictionary 【发布时间】:2012-02-25 02:53:39 【问题描述】:

我在 DetailViewController 中有一个 UITextView,其中包含一些从 MainViewController 中的 NSMutableDictionary 加载的文本。这是它的代码;

- (void) coverflowView:(TKCoverflowView*)coverflowView coverAtIndexWasDoubleTapped:(int)index

    DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];

    if ((int)index == 0) 
        NSMutableDictionary *myDictionary = [NSMutableDictionary dictionaryWithObjectsAndKeys:

                        @"This is some text", @"textkey", nil];

               detailViewController.myDictionary = myDictionary;
    

我已使用此代码将其中的字符串加载到我的 DetailViewController 中;

self.myText.text = [(NSMutableDictionary *)myDictionary objectForKey:@"textkey"]; 

另外,在我的 viewDidLoad 中,我创建了一个名为“Save”的 RightBarButton,用于在查看器完成编辑时隐藏键盘。我希望此按钮还可以保存查看器输入到 UITextView 中的更改(以及原始文本)。 这是rightBarButton的代码;

UIBarButtonItem *saveButton =[[UIBarButtonItem alloc]
                                   initWithTitle:@"Save"
                                   style:UIBarButtonItemStyleBordered
                                   target:self
                                 action:@selector(textViewDidChange:)];

    self.navigationItem.rightBarButtonItem = saveButton; 

最后,我有代码可以调用 textVidewDidChange 并隐藏键盘。我也试图让它保存对 textView 的更改,但它没有。

-(void)textViewDidChange:(UITextView *)textView;

    if( textView == myText )
    [myDictionary setValue:myText.text forKey:@"textkey"];
    [myText resignFirstResponder];
   

谁能帮我完成这个。我只是想将 UITextView 的更改保存回 NSMutableDictionary。 (或者可能不那么简单)

我已将按钮更改为 `UIBarButtonItem *saveButton =[[UIBarButtonItem alloc] initWithTitle:@"保存" 样式:UIBarButtonItemStyleBordered 目标:自己 动作:@selector(didChangeValueForKey:)];

self.navigationItem.rightBarButtonItem = saveButton;`

和其他代码;

`-(void)didChangeValueForKey:(NSString *)key NSError *错误;

    [myDictionary setValue:[self myText].text forKey:@"textkey"];
[myText resignFirstResponder];

NSLog(@"%@", [myDictionary valueForKey:@"textkey"]);

我的 NSLog 显示了更改,但是当我重新打开应用程序时,它们消失了,没有保存。可以直接保存到 NSMutableDictionary 吗? 我读了很多关于持久数据的内容。考虑过 NSData 或 Plist 但尝试一下,因为我可能做得不好。

有人可以推荐一个很好的教程吗?

我查看了建议的链接并将这个(粗体部分)添加到我的代码中。

`-(void)didChangeValueForKey:(NSString *)key

/* NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:[(NSMutableDictionary *)myDictionary objectForKey:@"textkey"]];*/
   NSError *error;


[myDictionary setValue:[self myText].text forKey:@"textkey"]; 
**[myDictionary writeToFile:@"textkey" atomically:YES];**

[myText resignFirstResponder];

NSLog(@"%@", [myDictionary valueForKey:@"textkey"]);
`

如您所见,我也尝试使用上面的 [NSHomeDirector] 获取路径,然后替换 @"textkey" 带路径。我仍然可以看到 NSLog 中的变化(无论哪种方式),但是当我重新加载视图或重新启动应用程序时没有任何变化。

我已经更改了一些内容,以便我在 textview 中保存一个文本文件,其名称是从字典中获取的,以便每次根据 mainViewController 中选择的图像加载不同的 detailView。

这是我在 mainViewController 中的字典条目;

`if ((int)index == 0) NSMutableDictionary *myDictionary = [NSMutableDictionary dictionaryWithObjectsAndKeys: //这里是我想在我的DetailView中访问要加载到UITextView中的文本文件名的地方 @"first View Text", @"textkey2",

                 //This is where I give the text file of the changed text its name for each different view of the DetailView
                    @"first View Text", @"textkey3",nil];

           detailViewController.myDictionary = myDictionary;
`

接下来是我使用 UIbarbuttonright 将更改保存到 textView 的代码

`- (void)saveAction:(id)sender

[self.myText2 resignFirstResponder];

NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [documentPaths objectAtIndex:0];
NSString *documentTXTPath = [documentsDirectory stringByAppendingPathComponent:[(NSMutableDictionary *)myDictionary objectForKey:@"textkey3"]];
NSString *savedString = myText2.text;

NSLog(@"The Save file is:%@", savedString);

[savedString writeToFile:documentTXTPath atomically:YES
                encoding:NSUTF8StringEncoding error:NULL];

`

我已经检查过了,该文件以 First View Text 的名称保存在文档文件夹中,并且确实包含更改的文本。

我在将文本文件内容加载到 UITextView 时遇到问题。 使用我拥有的代码,我得到了 textkey2 对象(第一个文本视图)的路径,而不是文件的内容。

`NSString *textName = [myDictionary objectForKey:@"textkey2"];
NSArray *paths2 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,   
                                                     NSUserDomainMask, YES);
NSString *documentsDirectory2 = [paths2 objectAtIndex:0];

NSString *fullPath2 = [documentsDirectory2 stringByAppendingPathComponent:textName];

/* self.myText2.text = fullPath2;*/ self.myText2.text = [NSString stringWithContentsOfFile:fullPath2 encoding:NSUTF8StringEncoding error:NULL];`

我用没有注释掉的那一行替换了最后一行,它工作正常。对于任何想知道的人。

【问题讨论】:

您在这方面究竟面临什么问题。值不会在字典或其他东西中被替换...... 当我将文本添加到 textview 并点击按钮时,键盘会隐藏,但如果我退出视图并重新加载它,添加的文本不会出现,因此添加的文本不会被保存。 你确定你的 textViewDidChange 方法调用了吗? 当我把 NSLog (@"%@", [myDictionary objectForKey:@"text key"]);我得到 tableViewCoverflow (null) 【参考方案1】:

您需要实现数据持久化,例如将文本保存到永久存储中,以便以后重新加载视图时可以再次检索。

【讨论】:

我在原帖底部添加了一些更改,请看。 我快速搜索了一下,这是我得到的第一个链接:***.com/questions/7478440/…。这会将字典的内容保存到您可以指定的文件中。然后,您可以稍后在需要时再次加载此特定词典的内容。 看了你的建议后改了上面的一些代码,还是不行。 我已经对此进行了全面重写,需要一些帮助将文件加载到 UITextView 中。 修改最后一行代码终于搞定了。

以上是关于在从 NSMutableDictionary 加载的 textview 中保存更改的文本的主要内容,如果未能解决你的问题,请参考以下文章

iOS 不兼容的指针类型(来自 NSDictionary 的 NSMutableDictionary)

为啥在从文件加载表面时转换 SDL 表面有效,但在从字体文件生成表面时无效

在从 NIB 加载和 willMoveToSuperview 加载之间设置 UIImageView 子类:

NSMutableArray 未更新且 UITableView 未重新加载

在从函数返回之前等待 Firebase 加载

在从 XIB 加载的自定义视图中修改 UIButton 的标题标签