【问题标题】:Changing Label.text from void function in the MainViewController that is called from a separate class从单独的类调用的 MainViewController 中的 void 函数更改 Label.text
【发布时间】:2012-02-14 02:34:58
【问题描述】:

我有一个主视图控制器,其按钮连接到名为REFRESH() 的 IBAction。 在REFRESH() 操作中,我调用了一个类中的一个函数,该函数从 WebService 发出对 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.
}

我是否应该寻找一种方法将RECEIVED_DATA() 函数绑定回viewDidLoad() 函数?

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

【问题讨论】:

    标签: iphone xml cocoa-touch ios5


    【解决方案1】:

    如果你的 UILabel myLabel 被定义为一个 IBOutlet 你可以调用

    self.myLabel.text = @"blah";
    

    该视图控制器类中的任何位置。

    那么标签是否被正确定义并连接为 IBOutlet?

    编辑:

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

    【讨论】:

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

    使用委托、KVO 或 NSnotifaction。我了解您的问题用户。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-19
      相关资源
      最近更新 更多