2012-08-30 209 views
0

我已經用NSOperation和NSOperationQueue構建了一個測試項目。 只有一個文本框:@property (weak) IBOutlet NSTextField *textbox;NSOperation:完成任務後更新UI

在此進行背景:

- (void)main 
{ 
    NSURL *url = [NSURL URLWithString:@"http://google.com"]; 
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
    [request startSynchronous]; 
    NSError *error = [request error]; 
    if (!error) { 
     NSString *response = [request responseString]; 
     NSLog(@"MainThread: %@", ([NSThread isMainThread] ? @"YES" : @"NO")); 
     [[AppDelegate sharedManager] performSelectorOnMainThread:@selector(pageLoaded:) 
              withObject:response 
             waitUntilDone:NO]; 
} 

和選擇被稱爲主線程:

- (void)pageLoaded:(NSString*)document 
{ 
    [textbox setStringValue:document]; // does nothing 
    NSLog(@"Textbox: %@", textbox); // returns nil 
} 

爲什麼文本框返回nil?

+0

您是否連接IB的插座? –

+0

是的,它已連接。即使我調用[textbox setStringValue:@「Test」];從applicationDidFinishLaunching方法中,文本框值發生更改。 – EduardMarcinco

回答

0

嗯,我有兩個想法:

  1. 一個現實之一:[AppDelegate sharedManager]回報不同 從一個對象,你也名爲applicationDidFinishLaunching。 如果將AppDelegate添加到XIB +中,您可能會有一個 單獨的單例實例。
  2. A 神祕一:只有一個 AppDelegate,但屬性值爲零爲什麼。如果這是 的情況下,最簡單的方法來找出事情將是 改變「弱」爲「分配」(以找出它是否發佈 問題),比重新定義setTextbox找到誰調用它。

但我可以打賭它是#1。

+0

1.在兩個地方AppDelegate具有相同的地址。我真的被困在這一個:)) – EduardMarcinco

+0

好吧,那麼#2 - setTexbox被稱爲anywere?另外,我有另一個想法(#3) - pageLoaded在awakeFromNib之前調用。即實際視圖尚未加載,並且插座尚未設置。 – Gobra