2012-02-14 59 views
1

我有一个主视图控制器,其按钮附加到IBAction,名为REFRESH()。 在REFRESH()操作中,我在一个类中调用一个函数,该函数对WebService中的XML进行异步请求,并从该数据创建一个对象。从MainViewController中的void函数更改Label.text从一个单独的类中调用

主视图控制器上有另一个叫``(void)RECEIVED_DATA()的函数,它接受从我的类文件中的XML创建的对象。在从服务器接收数据后,此功能只能从我的班级文件中调用。此时,我想在我的主视图控制器中的标签上设置文本。不幸的是,我不能。我可以更改附加到按钮单击的REFRESH()函数中的label.text,但无法在void函数中更改它,该函数在从类文件返回数据时被调用。

这里有2个功能:

-(void)refresh 
{ 
    funcs *fn = [[funcs alloc]init]; //this is my class file which handles http request and response 
    [fn GetData]; 
} 



-(void)received_Data:(DataObject *)x 
{ 
    myLabel.text = [x displayData]; //myLabel is a UILabel on my MainViewController and the displayData function returns an NSString. It won't even let me use myLabel.text = @"test"; Nothing happens. 
} 

我应该寻找一种方式,以配合RECEIVED_DATA()函数返回到viewDidLoad()功能?

UPDATE - 另一位用户表示,由于数据是由单独的线程检索的,因为UI在主线程上运行时不会影响任何UI。我会发布一个单独的问题,看看是否有人对这个问题有办法。

回答

2

如果您的UILabel myLabel被定义为一个IBOutlet可以调用该视图 - 控制类

self.myLabel.text = @"blah"; 

任何地方。

那么标签是如何定义和正确连接的IBOutlet?

编辑:

原来这是B类的调用MainViewController的方法的情况。在MainViewController中的方法中,您可以更新标签文本。使用协议来适当地委托方法调用。

+0

我将它定义为一个IBOutlet,作为主视图控制器的'@property'和'@synthesized'它。我可以更改viewDidLoad中的文本,并且可以更改由IBAction直接调用的函数中的文本,而不是通过由单独的类调用的函数。 – user1205315 2012-02-14 04:34:17

+0

单独课?是的,你不能。它不是在单独的类中定义的变量 – mbh 2012-02-14 04:41:17

+0

不,因为我上面的帖子所述,单独的类在完成加载数据时在我的MainViewController中调用一个函数。该类将数据填充对象传递给MainViewController中的函数。 MainViewController中的函数接收数据填充对象。我可以NSLog记录来自该函数中的对象的所有信息,没有任何问题。问题是该函数不会更改标签中的文本。您可以在我的代码中清楚地看到上面我设置myLabel.text,但它不起作用。使用self.myLabel.text也不例外。 – user1205315 2012-02-14 05:04:37

1

使用授权或KVO或NSnotifaction。我了解你的问题用户。

所以,如果你创建了主视图控制器的一个实例,并要求它设置/更新标签属性,那么这将成为一个带有更新文本的新对象。

由于您使用的是异步方法,并且返回值的时间框架是不可预测的,所以如果您希望使消息传递看起来很简单,我建议您使用NSnotification,否则请转至授权。其实尝试所有这些。你会有一个清晰的想法。

相关问题