如何从Multipeer Connectivity Session中更改视图UILabels,UIButtons,UIViews等?

rusdog2784

到现在已经有4天了,我一直在尝试更改属于多点连接会话中连接的对等点的视图或视图元素。创建了会话,我能够连接两个设备并在两个设备之间发送数据,但是每当我尝试更改标签时,都不会发生任何事情。当我过去NSLog看到的label.text什么时,它返回null。

这是我的会话didReceiveData:方法:

- (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID {
NSLog(@"did receive data, %@", peerID.displayName);
NSDictionary *dict = @{
                       @"data": data,
                       @"peerID": peerID
                       };
[[NSNotificationCenter defaultCenter] postNotificationName:@"MCDidReveiveDataNotification" object:nil userInfo:dict];

NSArray *arrayFromData = [NSKeyedUnarchiver unarchiveObjectWithData:data];
NSString *gesture = [arrayFromData objectAtIndex:0];
UILabel *tapLabel = [arrayFromData objectAtIndex:1];
NSString *tapString = tapLabel.text;

[_gestureViewController receivedTap:gesture withLabelText:tapString]; }

我尝试将UILabel与数据以及正常的NSString一起发送。当我调用该gestureViewController方法时,receivedTap:gesture withLabelText:tapString我可以NSLog标记文本,但是当我尝试将当前的viewController设置tapGestureLabeltapString文本时,什么也没发生。

这是我的receivedTap:gesture withLabelText:tapString方法:

- (void)receivedTap:(NSString *)gesture withLabelText:(NSString *)labelText {
NSLog(@"%@", gesture);
NSLog(@"%@", labelText);
self.tapGestureLabel.text = labelText; }

我分配到主线程上的想法:

- (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID {
NSDictionary *dict = @{
                       @"data": data,
                       @"peerID": peerID
                       };
[[NSNotificationCenter defaultCenter] postNotificationName:@"MCDidReceiveDataNotification" object:nil userInfo:dict];
NSArray *arrayFromData = [NSKeyedUnarchiver unarchiveObjectWithData:data];
UIImage *image = [arrayFromData objectAtIndex:2];
[self performSelectorOnMainThread:@selector(changeImage:) withObject:image waitUntilDone:NO];
}

我的changeImage:选择器方法:

- (void)changeImage:(UIImage *)image {
[_gestureViewController.imageView setImage:image];
}
彼得·芬尼玛

session:didReceiveData由Mulitipeer Connectivity Framework从专用线程调用。您正在尝试从此专用线程更新标签。不允许这样做,您应该只从主队列访问UI元素。解决方案是将更新标签的代码分派到主队列。

您可以在receiveTap:withLabelText中进行如下操作:

- (void)receivedTap:(NSString *)gesture withLabelText:(NSString *)labelText {
    NSLog(@"%@", gesture);
    NSLog(@"%@", labelText);
    dispatch_async(dispatch_get_main_queue(), ^{
        self.tapGestureLabel.text = labelText; 
    });
}

或在session:didReceiveData:fromPeer中处理它

dispatch_async(dispatch_get_main_queue(), ^{
    [_gestureViewController receivedTap:gesture withLabelText:tapString];
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用Multipeer Connectivity(Swift 3)在会话中通过didReceiveData()调用table.reloadData

Multipeer Connectivity杀死会话

iOS8 AVAudioEngine如何通过Multipeer Connectivity发送麦克风数据?

无法通过Multipeer Connectivity连接蓝牙

Multipeer Connectivity自动静默连接

使用 Multipeer Connectivity 快速发送 PDF

通过BackgroundTask在后台维护Multipeer Connectivity会话?

如何在iOS上的Multipeer Browserview中删除本地设备

当用户关闭并打开蓝牙时,Multipeer Connectivity停止工作

iOS 7 Multipeer Connectivity是否与Android Wi-Fi Direct兼容?

目标C-使用Multipeer Connectivity Framework发送对象,Peer未连接

如何使用Watch Connectivity传输UIImage

如何在iOS中为HMSegmentControl加载UIViews而不是UILabels

如何使用Connectivity Manager.NetworkCallback获取网络类型

在使用Core Data时如何使用Watch Connectivity共享数据

如何使用 Connectivity Plugin 4.0 获取远程主机状态?

未捕获的TypeError:$ rootScope。$ on不是Connectivity Factory中的函数

ScpCfHttpDestination在cloudplatform-connectivity-3.3.1.jar中不可用

适用于图形对象中的edge_connectivity

BroadcastReceiver CONNECTIVITY_CHANGE始终在首次启动应用程序中运行吗?

未处理的异常:MissingPluginException(在通道plugins.flutter.io/connectivity中未找到方法检查的实现)

iOS Multipeer连接-在自定义MCNearbyServiceBrowser中显示DiscoveryInfo

Android N:处理缺少CONNECTIVITY_CHANGE

不推荐使用ConnectivityManager.CONNECTIVITY_ACTION

如何在CGI :: Session中更改域?

如何在Liquibase中更改视图

如何在Angular中更改视图值?

如何在SwiftUI中更改视图

如何在WPF中更改视图?