2012-08-30 96 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