3

我有一个关于将 currentSession 传递到下一页的问题。我已经在第一个页面视图控制器上测试并成功建立了蓝牙会话。现在我的问题是,我如何将当前会话传递到下一页,因为导航到下一页后,蓝牙连接丢失。因此,在导航到下一页后,当前会话将丢失。这是通过用两部手机发送随机图像来测试的。但是,如果第二次在 nextpageController 上提示蓝牙连接,则可以发送图片。

视图控制器.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;
}
4

1 回答 1

1

我不知道我的做法是否正确,但我有一个包含许多页面的应用程序,我需要在所有页面中保持这种联系。所以我把我所有的蓝牙连接代码放在一个单例类中,每个视图控制器都可以与之对话。这样它就可以处理所有的通信,每个页面都可以告诉它它想要发送什么。

所以这是一个很棒的单例类教程 http://www.galloway.me.uk/tutorials/singleton-classes/

就蓝牙而言,您似乎拥有所有正确的方法。只需将它们放在您的单例类中即可。然后,当您引用类 *(MyManager sharedManager = [MyManager sharedManager];)时,只需创建一个 sendCommand 方法来发送您想要的任何通信,例如 [sharedManager sendCommand:data];

所以你有你的蓝牙课程。您添加了一个 bluetoothconnect 方法,其中包含类似此代码的内容

picker = [[GKPeerPickerController alloc] init];
picker.delegate = self;
picker.connectionTypesMask = GKPeerPickerConnectionTypeNearby;
[picker show];

然后从您的视图控制器类中,您可以参考教程中显示的内容来引用您的单例类。

MyManager sharedManager = [MyManager sharedManager];

然后你可以调用你的新方法:[sharedManager bluetoothconnect];

于 2012-10-30T21:04:07.700 回答