在从 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 子类: