3

currentSession を次のページに渡すことに関して質問があります。最初のページビューコントローラーでBluetoothセッションをテストし、正常に確立しました。ここで私の質問は、次のページに移動した後、Bluetooth 接続が失われるため、現在のセッションを次のページに渡すにはどうすればよいかということです。したがって、次のページに移動した後、現在のセッションは失われます。これは、2 台の電話でランダムな画像を送信することによってテストされました。ただし、nextpageController で 2 回目の Bluetooth 接続を要求すると、画像が送信される可能性があります。

ビューコントローラー.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

正しい方法で行ったかどうかはわかりませんが、多くのページを持つアプリがあり、それらすべてでその接続を維持する必要がありました。そのため、すべての Bluetooth 接続コードを、各ビュー コントローラーが通信できるシングルトン クラスに配置しました。そうすれば、各ページが送信したいものを伝えるだけで、すべての通信を処理できます。

したがって、これはシングルトン クラスの優れたチュートリアルです http://www.galloway.me.uk/tutorials/singleton-classes/

Bluetooth に関する限り、適切な方法がすべて揃っているようです。それらをシングルトンクラスに入れるだけです。次に、クラス *(MyManager sharedManager = [MyManager sharedManager];)を参照するときに、この [sharedManager sendCommand:data]; のように、必要な通信を送信するための種類の sendCommand メソッドを作成するだけです。

これで、Bluetooth クラスが作成されました。このコードのようなものを含む bluetoothconnect メソッドを追加します

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

次に、View Controller クラスから、チュートリアルで示したようなものでシングルトン クラスを参照します。

MyManager sharedManager = [MyManager sharedManager];

次に、新しいメソッドを呼び出すことができます: [sharedManager bluetoothconnect];

于 2012-10-30T21:04:07.700 に答える