0

我对iphone编程很陌生。我在使用无法解决的标签栏控制器时遇到了问题。我有一个带有 2 个选项卡的应用程序,每个选项卡使用单独的类文件和 nib 文件。我使用摇动手势来告诉应用程序做某事,但是当我从标签二变回标签一时摇动手机,它会执行第二个视图而不是当前视图的动作,当前视图在摇动后保持不变。

我在这里错过了什么吗?我需要释放一些东西吗?

提前感谢您提供的任何帮助。

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

第二视图控制器.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

您的视图控制器可能未设置为第一响应者。因此,当您查看 Tab 1 上的视图控制器时,Tab 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]
  }
}

然后,在您的视图控制器中,在方法中分配加速度计委托wasSelectedFromTabBar。希望它有效!

于 2011-04-04T14:35:24.577 回答