ナビゲーションコントローラでいくつかのビューをセットアップしました。私は電話を振ると元のビューに戻ることができるようにしたい。まず、ここで私はAppDelegateで持っているコードスニペットです:なぜpopToRootViewContollerがフリーズしたり、実行に時間がかかりますか?
- (void)startAccelerometerUpdates
{
[motionManager startDeviceMotionUpdatesToQueue:queue withHandler:^(CMDeviceMotion *motion, NSError *error) {
// based from
// http://stackoverflow.com/questions/5214197/simple-iphone-motion-detect/5220796#5220796
float accelerationThreshold = 1; // or whatever is appropriate - play around with different values
CMAcceleration userAcceleration = motion.userAcceleration;
if (fabs(userAcceleration.x) > accelerationThreshold ||
fabs(userAcceleration.y) > accelerationThreshold ||
fabs(userAcceleration.z) > accelerationThreshold) {
if(!self->isRoot) {
NSLog(@"Stopping motion manager");
[motionManager stopDeviceMotionUpdates];
NSLog(@"popping to top view controller");
[navcon popToRootViewControllerAnimated:YES];
NSLog(@"Done popping");
}
}
}];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
.....
motionManager = [[CMMotionManager alloc] init];
motionManager.deviceMotionUpdateInterval = .5;
isRoot = malloc(sizeof(BOOL));
self->isRoot = NO;
[self startAccelerometerUpdates];
[navcon pushViewController:main animated:NO];
....
}
私はpopToRootへの呼び出しが即時になることを期待していました。ただし、約30秒かかります。面白いことに、あなたが手動で前のページに戻るために押すことができる上部のボタンは、この時点では機能しません。電話は、ボタンをフリーズするために大変な作業をしているようです。だから、私は間違いなくここで何か間違っている。
多分popToRootViewControllerを何度か呼び出すと思っていたので、コードに見られるように "isRoot"というチェックを追加しました。(BOOLがなぜポインタであるのか気にしないでください。
ここで役に立つかもしれない、あなたの実際のログを表示する最も簡単な方法は、パラメータを取らない別のメソッドを追加することです。 – tia
ログは単純に3行です...停止、ポッピング、コード内での実行。コードは問題なくこのメソッドを実行します。 – EDJ