0

IOS プログラミングを学んだばかりで、初めての iPhone アプリを書いています。

私のアプリは、UINavigationController のルート ビュー コントローラーであるビュー コントローラーの MKMapView に関する情報を提供します。モバイル信号が悪い場合、私は mapViewDidFailLoadingMap:withError: を使用して、ユーザーが何をしているかに応じて、アプリが 2 つの異なるビュー コントローラーのいずれかをナビゲーション コントローラー スタックにプッシュするようにします。コードは次のとおりです。

    - (void)mapViewDidFailLoadingMap:(MKMapView *)mapView withError:(NSError *)error
    {
        NSLog(@"mapViewDidFailLoadingMap: %@", [error localizedDescription]);
        [aiView stopAnimating];

        if (mapTypeInt == 0) {
            NSString *message = 
    [NSString stringWithFormat:@"Your signal is not currently 
     strong enough to download a map. Switching to table view."];
            UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Maps Unavailable"
                                                         message:message
                                                        delegate:nil
                                               cancelButtonTitle:@"OK"
                                               otherButtonTitles:nil];
            [av show];
            if (currentMode == @"retracingSteps")
            {
                RetraceViewController *rvc = 
    [[RetraceViewController alloc] initWithNibName:@"RetraceViewController" bundle:nil];
                [[self navigationController] pushViewController:rvc animated:YES];
            }
            else{
                TripTableViewController *ttvc = [[TripTableViewController alloc] init];
                [[self navigationController] pushViewController:ttvc animated:YES];
            }
        }
        else{
            [self setMapType:0];

            NSString *message = [NSString stringWithFormat:
    @"Your signal is not currently strong enough to download a satellite map. 
    Switching to Standard Map view."];
            UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Can't Use Satellite Maps"
                                                         message:message
                                                        delegate:nil
                                               cancelButtonTitle:@"OK"
                                               otherButtonTitles:nil];
            [av show];
        }



    }

昨日、田舎の谷間で弱いモバイル信号をテストしたところ、正しい 2 つ目のビュー コントローラーがスタックにプッシュされました。その後、電話をロックして数分後にアプリを再チェックしたときに気付いたのは、起床時にルート ビュー コントローラーがすぐに表示され、その後に期待どおりのビュー コントローラーが表示されたことです。事実上、これが行ったことは、2 番目のビュー コントローラーの同一のコピーをスタックにプッシュすることでした。これは、ルート ビュー コントローラーに戻るために [戻る] ボタンを 6 回タップする必要があったときに発見しました。

ウェイクアップ時にアプリに実行してもらいたいのは、ルート ビュー コントローラーではなく、電話がロックされたときにライブだったビュー コントローラーをすぐに表示することです。これを行う方法がわかりません。

4

2 に答える 2

0

これはおそらく、画面をロックしてもアプリがまだ位置情報の更新を受信して​​いるため (位置情報サービスは実際のバックグラウンド モードでコードを実行できます)、View Controller をプッシュすると、スタック内の前のコントローラーがまだ存在し、位置情報の更新を受信して​​いるために発生する可能性があります。すべてを行うように設計されているため、別のコントローラーをプッシュしても、実装されたロジックで別のコントローラーをプッシュする必要がある場合、このビューコントローラーはナビゲーションコントローラーにアクセスできるため、別のコントローラーをスタックに追加してプッシュするだけですそれ(スタック内のすべてのVCでナビゲーションコントローラーは同じままです)

したがって、別のコントローラーを押したときにこのケースを処理するために停止し、コントローラーをポップバックしたときに再起動する必要があります

于 2013-05-23T10:45:20.000 に答える
0

このバグは、ハンドラー mapViewDidFailLoadingMap:withError: が、制御がプッシュされたビュー コントローラーに渡される前に複数回呼び出されたことが原因でした。ハンドラー メソッドに 3 つの変更を加えてバグを修正しました。1) UIAlertView の表示を削除し、プッシュされたビュー コントローラーに移動しました。2) フラグ (viewDidAppear: で初期化) を使用して、ハンドラーが 2 回目に呼び出された場合にプッシュを実行せずにハンドラーから戻りました。3)割り当て前に、プッシュされたView Controllerの存在を確認しました。

これら 3 つの変更がすべて行われると、View Controller 間の遷移が正しく行われました。コードは次のとおりです。

- (void)mapViewDidFailLoadingMap:(MKMapView *)mapView withError:(NSError *)error

{ [aiView stopAnimating];

if (mapViewFailed > 0) {
    mapViewFailed ++;
    return;
}

if (mapTypeInt == 0) {
    [map setUserTrackingMode:MKUserTrackingModeNone];
    [self removeAsNoticationsObserver];

    if ([currentMode isEqualToString:@"retracingSteps"])
    {
        if (!rvc) {
            rvc = [[RetraceViewController alloc] initWithNibName:@"RetraceViewController" bundle:nil];
        }
        [[self navigationController] pushViewController:rvc animated:YES];
    }
    else{
        if (!ttvc) {
            ttvc = [[TripTableViewController alloc] init];
        }
        [[self navigationController] pushViewController:ttvc animated:YES];
    }
    mapViewFailed ++;


}
else{
    [self setMapType:0];

    NSString *message = [NSString stringWithFormat:@"Your signal is not currently strong enough to download a satellite map. Switching to Standard Map view."];
    UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Can't Use Satellite Maps"
                                                 message:message
                                                delegate:nil
                                       cancelButtonTitle:@"OK"
                                       otherButtonTitles:nil];
    [av show];
}

}

iOS 初心者である私がまだ知らない、より洗練されたソリューションが利用可能であることは間違いありません。

于 2013-06-08T11:59:38.183 に答える