2011-09-23 66 views
0

我試着學習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 所有的東西都編譯並且行爲像它想要的那樣只是不顯示字符串。

任何幫助,非常感謝。 Mike

回答

1

確保IBOutlet實際上連接在XIB中。嘗試在設置其字符串後記錄其值。

+0

如果我右鍵單擊Main.xib中的對象,它將顯示OpenUp對象和mainField TextField之間存在連接。當我運行該應用程序時,它會在文檔顯示時掛起(旋轉圓圈) – Miek

+0

我重新連接了xib文件中的TextField並開始工作。謝謝 – Miek

1

答案在您的評論。正如它正確指出的beginWithCompletionHandler:方法,這將立即返回(之前用戶選擇文件)。所以

[mainField setStringValue: self.reader]; 

電話應該是完成處理程序塊內,後

self.reader = [[[NSString alloc] initWithContentsOfURL:theDoc encoding:NSUTF8StringEncoding] autorelease]; 

順便說一句吧,注意,我添加了一個自動釋放呼叫。您將該屬性定義爲副本,因此如果您不自動釋放,則會泄漏內存。另外,由於我不熟悉您正在使用的NAC文件瀏覽器不寫

NSError *error; 

NSError *error = nil; 
+0

錯誤檢查是假或無初始化;如果操作成功,則不能保證錯誤變量不會被分配給該錯誤變量。 (操作可能失敗,恢復併成功;如果發生這種情況,最終可能會出現一個錯誤,它會從中恢復,因此記錄它會誤導您認爲它沒有成功。)必須先檢查失敗* *尋找錯誤變量。 –

+0

感謝您的信息。一旦我將NSerror設置爲零,它似乎更可靠。我的問題是TextField爲空。 – Miek

0

,我提供了一個不同的方法來顯示您的文件。我發現我在加密工具,這是特別有用使用一個文件選擇一些代碼 - 代碼如下:

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

我希望幫助。

+0

感謝您的信息,我一定會研究這個。我的問題原來是與TextFields IBOutlet斷開連接。真的很感謝幫助 – Miek

+0

沒問題,希望對大家有幫助! – 2011-09-29 20:58:47