我有一个关于将 currentSession 传递到下一页的问题。 我已经在第一个页面 View Controller 上测试并成功建立了蓝牙 session 。现在我的问题是,如何将当前 session 传递到下一页,因为导航到下一页后,蓝牙连接丢失。所以在导航到下一页后,当前 session 就丢失了。这是通过用两部手机发送随机图像来测试的。但是,如果第二次在nextpageController提示蓝牙连接,则可以发送图片。
查看 Controller .M:
-(IBAction)btnBluetoothConnect:(id)sender {
picker = [[GKPeerPickerController alloc] init];
picker.delegate = self;
picker.connectionTypesMask = GKPeerPickerConnectionTypeNearby;
[picker show];
}
- (void)peerPickerController:(GKPeerPickerController *)pk didConnectPeer:(NSString *)peerID toSession:(GKSession *)session {
self.currentSession = session;
session.delegate = self;
[session setDataReceiveHandler:self withContext:nil];
picker.delegate = nil;
[picker dismiss];
}
- (void)peerPickerControllerDidCancel:(GKPeerPickerController *)pk {
picker.delegate = nil;
}
- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state {
switch (state) {
case GKPeerStateConnected:
NSLog(@"connected");
if (GKPeerStateConnected) {
self.progress = [[ProgressAlertView alloc] init];
progress.delegate = self;
progress.task = @selector(compute);
[progress start];
}
break;
case GKPeerStateDisconnected:
NSLog(@"disconnected");
currentSession = nil;
default:
break;
}
}
-(void)compute{
[self updateUIWithProgress:0.0 andMessage:@"3"];
[NSThread sleepForTimeInterval:3];
if([progress isCancelled]){
self.progress = nil;
return;
}
[self updateUIWithProgress:0.4 andMessage:@"2"];
[NSThread sleepForTimeInterval:1];
if([progress isCancelled]){
self.progress = nil;
return;
}
[self updateUIWithProgress:0.6 andMessage:@"1"];
[NSThread sleepForTimeInterval:1];
if([progress isCancelled]){
self.progress = nil;
return;
}
[self updateUIWithProgress:0.8 andMessage:@"0"];
[NSThread sleepForTimeInterval:1];
if([progress isCancelled]){
self.progress = nil;
return;
}
else
[self updateUIWithProgress:1.0 andMessage:@"Start!"];
NSLog(@"Woohahaha");
**[self performSegueWithIdentifier:@"next page" sender:self];**
//process the data here or send a notification for data processing
//when this method returns, the progress alert view disappears.
}
NextPageController.m:
-(IBAction)btnSend:(id)sender{
if(currentSession){
NSData *imageData = UIImageJPEGRepresentation([UIImage imageNamed:[NSString stringWithFormat:@"4.png"]], .7);
[self.currentSession sendDataToAllPeers:imageData withDataMode:GKSendDataReliable error:nil];
}
}
- (void) receiveData:(NSData *)data fromPeer:(NSString *)peer inSession: (GKSession *)session context:(void *)context{
imageView.image = [UIImage imageWithData:data];
}
- (void)peerPickerController:(GKPeerPickerController *)pk didConnectPeer:(NSString *)peerID toSession:(GKSession *)session {
self.currentSession = session;
session.delegate = self;
[session setDataReceiveHandler:self withContext:nil];
picker.delegate = nil;
[picker dismiss];
}
- (void)peerPickerControllerDidCancel:(GKPeerPickerController *)pk {
picker.delegate = nil;
}
最佳答案
我不知道我的做法是否正确,但我有一个包含很多页面的应用程序,我需要在所有页面中保持这种联系。所以我把我所有的蓝牙连接代码放在一个单例类中,每个 View Controller 都可以与之通信。这样它就可以处理所有的通信,每个页面都可以告诉它它想要发送什么。
所以这是一个很棒的单例类教程 http://www.galloway.me.uk/tutorials/singleton-classes/
就蓝牙方面的问题而言,您似乎拥有所有正确的方法。只需将它们放在您的单例类中即可。然后,当您引用类时 *(MyManager sharedManager = [MyManager sharedManager];) 然后只需创建一个 sendCommand 方法来发送您想要的任何通信,就像这样 [sharedManager sendCommand:data];
所以你有你的蓝牙类。您添加一个蓝牙连接方法,其中包含类似此代码的内容
picker = [[GKPeerPickerController alloc] init];
picker.delegate = self;
picker.connectionTypesMask = GKPeerPickerConnectionTypeNearby;
[picker show];
然后从您的 View Controller 类中引用您的单例类,就像教程中显示的那样。
MyManager sharedManager = [MyManager sharedManager];
然后你可以调用你的新方法:[sharedManager bluetoothconnect];
关于iphone - 通过浏览下一页的 iOS 蓝牙连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13132220/