0

私はiPhoneプログラミングにかなり慣れていません。タブ バー コントローラーを使用しているときに解決できない問題が発生しました。各タブが別々のクラスファイルとnibファイルを使用する2つのタブを持つアプリがあります。アプリに何かをするようにシェイク ジェスチャを使用しますが、タブ 2 からタブ 1 に戻って電話を振ると、現在のビューではなく 2 番目のビューのアクションが実行され、現在のビューはシェイク後も変更されません。

ここで何か不足していますか?何かを解放する必要がありますか?

よろしくお願いいたします。

FirstViewController.m:

    #import "FirstViewController.h"
#import <AudioToolbox/AudioToolbox.h>


@implementation FirstViewController
@synthesize label;

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration{

    if (fabsf(acceleration.x) > 2.0
        || fabsf(acceleration.y) > 2.0
        || fabsf(acceleration.z) > 2.0) {
            label.text = @"Shake"; 


}


- (void)viewDidLoad {

    UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer];
    accelerometer.delegate = self;
    accelerometer.updateInterval = 1.0f/60.0f;
    [super viewDidLoad];

}


- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {

}


- (void)dealloc {
    [super dealloc];

}

@end

SecondViewController.m

#import "SecondViewController.h"
#import <AudioToolbox/AudioToolbox.h>

@implementation SecondViewController
@synthesize label2;

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration{

    if (fabsf(acceleration.x) > 2.0
        || fabsf(acceleration.y) > 2.0
        || fabsf(acceleration.z) > 2.0) {
        label2.text = @"Shake View 2"; 


}


- (void)viewDidLoad {

    UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer];
    accelerometer.delegate = self;
    accelerometer.updateInterval = 1.0f/60.0f;
    [super viewDidLoad];

}


- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {

}


- (void)dealloc {
    [super dealloc];

}

@end
4

2 に答える 2

0

ビュー コントローラーがファーストレスポンダーとして設定されていない可能性があります。したがって、タブ 1 のビュー コントローラーを見ていると、タブ 2 のビュー コントローラーがモーション イベントを受信して​​います。私はここで多くの仮定を立てています。念のため。

このコードを両方のビュー コントローラーに追加すると、それぞれに切り替えると、ファーストレスポンダーとして引き継がれます。

-(BOOL)canBecomeFirstResponder {
    return YES;
}

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self becomeFirstResponder];
}

- (void)viewWillDisappear:(BOOL)animated {
    [self resignFirstResponder];
    [super viewWillDisappear:animated];
}
于 2011-04-04T13:45:10.090 に答える
0

viewDidLoad は、ビューがメモリにロードされたときにのみ呼び出され、表示されたときには呼び出されないため、その実装でタブを切り替えても、加速度計のデリゲートは変更されません。

- viewDidAppear:animatedメソッドで設定してみてください。それでも失敗する場合は、UITabBarControllerDelegate プロトコルと– tabBarController:didSelectViewController:メソッドを確認してください。まず、タブ バー コントローラー デリゲートを作成して割り当て、次にメソッドを実装する必要があります。次のようになります。

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
  if([viewController respondsToSelector:@sel(wasSelectedFromTabBar)]){
    [viewController wasSelectedFromTabBar]
  }
}

次に、View Controller で、wasSelectedFromTabBarメソッドに加速度計デリゲートを割り当てます。それがうまくいくことを願っています!

于 2011-04-04T14:35:24.577 に答える