我正在尝试学习Xcode,Cocoa,Objective C.今天我以为我要创建一个简单的应用程序使用Nac文件浏览器,读取文件并在NSTevtView中显示它。
一切都像是想要工作,但文件永远不会显示。如果我调试它,它显示我的字符串有文件内容但我不能让它显示到TextView。
这是我的代码,OpenUp.h和OpenUp.m
#import <Foundation/Foundation.h>
@interface OpenUp : NSObject
{
NSString *reader;
IBOutlet NSTextField *mainField;
}
@property(readwrite,copy)NSString *reader;
- (void)awakeFromNib;
- (IBAction)openExistingDocument:(id)sender;
@end
//OpenIt.m
#import "OpenUp.h"
@implementation OpenUp
@synthesize reader;
- (id)init
{
self = [super init];
if (self) {
// Initialization code here.
}
return self;
}
- (IBAction)openExistingDocument:(id)sender{
NSOpenPanel* panel = [NSOpenPanel openPanel];
[panel retain];
// This method displays the panel and returns immediately.
// The completion handler is called when the user selects an
// item or cancels the panel.
[panel beginWithCompletionHandler:^(NSInteger result){
if (result == NSFileHandlingPanelOKButton) {
NSURL* theDoc = [[panel URLs] objectAtIndex:0];
NSLog(@"%@", theDoc);
//open the document
NSError *error;
self.reader = [[NSString alloc] initWithContentsOfURL: theDoc encoding:NSUTF8StringEncoding error:&error];
NSLog(@"%@",error);
}
// Balance the earlier retain call.
[panel release];
}];
[mainField setStringValue: self.reader];//this should display the contents of the string
}
- (void)awakeFromNib {
self.reader = @"";//initialize reader
}
@end
我不确定我是否在内存分配方面做错了,或者从文件读取的字符串是否会使用此窗口。我已经尝试过NSScrollViewer和NSTextField 一切都在编译和行为就像它想要工作它只是不会显示字符串。
非常感谢任何帮助。 麦克
答案 0 :(得分:1)
确保{X}中实际连接了IBOutlet
。设置字符串后尝试记录其值。
答案 1 :(得分:1)
答案在你的评论中。正确地说明了beginWithCompletionHandler:方法,这将立即返回(在用户选择文件之前)。所以
[mainField setStringValue: self.reader];
调用应该在完成处理程序块内,紧跟在
之后self.reader = [[[NSString alloc] initWithContentsOfURL:theDoc encoding:NSUTF8StringEncoding] autorelease];
顺便说一下,请注意我添加了自动释放呼叫。您将属性定义为副本,因此如果您不自动释放,则会泄漏内存。另外,不要写
NSError *error;
但
NSError *error = nil;
答案 2 :(得分:0)
由于我不熟悉您使用的Nac文件浏览器,因此我提供了一种不同的方法来显示您的文件。我找到了一些我在加密工具中使用的文件选择器的代码,这个代码特别有用 - 代码如下:
NSOpenPanel* openDlg = [NSOpenPanel openPanel];
[openDlg setCanChooseFiles:YES];
[openDlg setCanChooseDirectories:YES];
[openDlg setPrompt:@"Select"];
[openDlg setAllowsMultipleSelection:NO];
if ([openDlg runModalForDirectory:nil file:nil] == NSOKButton )
{
NSArray* files = [openDlg filenames];
for(NSString* filePath in
[openDlg filenames])
{
NSLog(@"File Path:%@", filePath);
[filePathName setStringValue:filePath]; // get filepath
}
}
这样,当用户选择文件时,您可以在控制台中返回文件路径名称。现在你想要做的是使用文件路径获取数据。您可以使用dataWithContentsOfFile:
方法执行此操作。
NSData *data = [NSData dataWithContentsOfFile:filePath]
您现在拥有用户选择的文件的数据。我们使用指针'data'稍后再参考数据。您现在想要在某处显示数据。我不确定你为什么要在NSTextfield上显示数据,因为它只有在用户选择文本文件时才有效,除非你只是显示字节(这没有意义)。
然后,您可以将此数据转换为字符串:
NSString *yourStuff = [[[NSString alloc] initWithData:myData
encoding:NSUTF8StringEncoding] autorelease];
现在你有了你的字符串,你可以把它写到NSTextView:
[yourNstextiview setStringValue:yourstuff];
我希望有所帮助。