我对iphone编程很新。使用我无法解决的标签栏控制器时,我遇到了问题。我有一个带有2个标签的应用程序,每个标签使用单独的类文件和nib文件。我使用摇动手势告诉应用程序做某事但是当我从标签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
答案 0 :(得分: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];
}
答案 1 :(得分:0)
当您在该实现中切换选项卡时,加速度计委托不会更改,因为仅在将视图加载到内存而不是显示时调用viewDidLoad。
您可以尝试在- viewDidAppear:animated
方法中进行设置。如果这也失败了,请查看UITabBarControllerDelegate协议和– tabBarController:didSelectViewController:
方法。首先,您需要创建并分配选项卡栏控制器委托,然后实现该方法。它可能看起来像这样:
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
if([viewController respondsToSelector:@sel(wasSelectedFromTabBar)]){
[viewController wasSelectedFromTabBar]
}
}
然后,在视图控制器中,使用wasSelectedFromTabBar
方法分配加速度计代理。希望它有效!