在回调函数上设置uilabel

时间:2011-09-01 23:36:25

标签: ios sockets callback uilabel

我想在一个cfsocket的回调上设置一个uilabel的文本,但它不起作用。错误是:“使用未声明的标识符'标签'” 但是这个setText工作在其他函数中,为什么不在这个呢?

回调功能:

static void receiveData(CFSocketRef s, CFSocketCallBackType type, CFDataRef address, const void *data, void *info)
{
    UInt8 *buff;

    NSLog(@"%ld",CFDataGetLength(data));

    CFDataGetBytes(data, CFRangeMake(0, CFDataGetLength(data)), buff);

    NSLog(@"%s",buff);

    [label setText:@"toto"];
}

setText工作的函数:

- (IBAction)deconn:(id)sender
{
    if (conn_ok && socket && sock_addr) {
        CFSocketInvalidate(socket);
        [label setText:@"disconnected"];
        conn_ok = false;
        [sock_addr release];
    }

}

好的,我在我的功能中做到了这一点:

socketViewController *toto = (id)info;
[toto.label setText:@"received msg"];

但它不起作用,我收到了EXEC_BAD_ACCESS,我在日志中有这个:

sharedlibrary apply-load-rules all
warning: Unable to restore previously selected frame.
(gdb)

我认为这是一个内存访问问题,我在函数末尾添加toto = nil;但没有任何变化。

2 个答案:

答案 0 :(得分:0)

receiveData是一个函数,而不是一个方法。您正在尝试访问对象的私有ivar。如果你使用了访问器(self.label),那就更清楚了。使用访问者。

您可以使用info指针将self传递给回调,以便您可以访问该标签。

要配置info指针,需要在创建套接字时传递上下文:

CFSocketContext context = { 0, self, NULL, NULL, NULL };

现在,在您的CFSocketCreate...电话中,您将传递&context上下文参数。

我建议cocoaasyncsocket而不是实现您自己的CFSocket。它提供了一个更简单的界面。

答案 1 :(得分:0)

receiveData是一个静态函数,因此它不能访问任何对象的成员变量(在目标C中调用它们的ivars)。