简单的文件阅读器不会工作

时间:2011-09-23 18:12:02

标签: cocoa

我正在尝试学习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 一切都在编译和行为就像它想要工作它只是不会显示字符串。

非常感谢任何帮助。 麦克

3 个答案:

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

我希望有所帮助。