Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 从单独类调用的MainViewController中的void函数更改Label.text_Iphone_Xml_Cocoa Touch_Ios5 - Fatal编程技术网

Iphone 从单独类调用的MainViewController中的void函数更改Label.text

Iphone 从单独类调用的MainViewController中的void函数更改Label.text,iphone,xml,cocoa-touch,ios5,Iphone,Xml,Cocoa Touch,Ios5,我有一个主视图控制器,带有一个连接到iAction的按钮,名为REFRESH()。 在REFRESH()操作中,我调用了类中的一个函数,该函数从Web服务异步请求XML,并从该数据创建一个对象 主视图控制器上还有一个名为`(void)RECEIVED_DATA()的函数,它接受从类文件中的XML创建的对象。只有在从服务器接收回数据后,才能从我的类文件调用此函数。此时,我想在主视图控制器的标签上设置文本。不幸的是,我不能。我可以在连接到按钮单击的REFRESH()函数中更改label.text,但

我有一个主视图控制器,带有一个连接到iAction的按钮,名为
REFRESH()
。 在
REFRESH()
操作中,我调用了类中的一个函数,该函数从Web服务异步请求XML,并从该数据创建一个对象

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

以下是两个功能:

-(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.
}
我是否应该寻找一种方法将
接收的\u数据(
)函数重新绑定到
viewDidLoad()
函数中

更新-
另一个用户指出,由于数据是由单独的线程检索的,因此它不会影响任何UI,因为UI正在主线程上运行。我将发布一个单独的问题,看看是否有人有办法解决这个问题。

如果您的UILabel myLabel被定义为您可以调用的IBOutlet

self.myLabel.text = @"blah";
viewcontroller类中的任何位置

那么,标签是否作为IBOutlet正确定义和连接

编辑:


事实证明,这是类B在MainViewController中调用方法的情况。在MainViewController中的方法中,可以更新标签文本。使用协议适当地委派方法调用。

使用委派或KVO或NSnotifaction。我理解你的问题

因此,如果您创建主视图控制器的实例并要求它设置/更新label属性,那么它将成为具有更新文本的新对象


因为您使用的是异步方法,并且返回值的时间范围是不可预测的,所以如果您希望使消息传递看起来简单,我建议您使用NSnotification,否则就使用委托。实际上,尝试实现所有这些。你会有一个清晰的想法。

我已经将它定义为一个IBOutlet,一个主视图控制器的'@property'和'@synthetic'属性。我可以更改viewDidLoad中的文本,也可以更改由iAction直接调用的函数中的文本,但不能更改由单独类调用的函数。单独类?是的,你不能。它不是独立类中定义的变量否,正如我上面的文章所述,独立类在完成加载数据后调用MainViewController中的函数。该类将数据填充对象传递给MainViewController中的函数。MainViewController中的函数接收数据填充对象。我可以毫无问题地在该函数中记录对象的所有信息。问题是该函数不会更改标签中的文本。您可以在我的代码中清楚地看到上面设置myLabel.text的地方,但它不起作用。使用self.myLabel.text也一样。您需要使用协议。你可以用谷歌搜索。它将帮助您从另一个类调用MainViewController中的方法。因此,在另一个类中,您可以在receive data函数中调用mainviewcontroller的方法(设置标签文本)。我感谢您的帮助,但谷歌搜索协议实际上不是任何类型的答案。它们可能很有用,但协议是其他类采用的模板。这就像说谷歌是一个If..Then..Else语句。我已经可以从另一个类调用MainViewController中的方法。我可以将数据传递给该方法,并且可以在NSLog中打印该数据,但请阅读以下内容:我无法在标签中打印数据。在调用该方法时,UILabel是一个空对象,尽管它是一个“@property”,因此可以访问。