关闭标签栏控制器
Posted
技术标签:
【中文标题】关闭标签栏控制器【英文标题】:Closing tab bar controllers 【发布时间】:2011-04-04 13:10:21 【问题描述】:我对 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
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
【问题讨论】:
您需要提供与您的问题相关的某些代码部分的源代码。 我现在已经在上面发布了代码。谢谢 【参考方案1】:当您在该实现中切换选项卡时,加速度计委托不会更改,因为 viewDidLoad 仅在视图加载到内存时调用,而不是在显示时调用。
您可以尝试在- viewDidAppear:animated
方法中设置它。如果这也失败了,请查看 UITabBarControllerDelegate 协议和– tabBarController:didSelectViewController:
方法。首先,您需要创建并分配标签栏控制器委托,然后实现该方法。它可能看起来像这样:
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
if([viewController respondsToSelector:@sel(wasSelectedFromTabBar)])
[viewController wasSelectedFromTabBar]
然后,在您的视图控制器中,在 wasSelectedFromTabBar
方法中分配加速度计委托。希望它有效!
【讨论】:
我将加速度计委托从 viewDidLoad 移动到 viewDidAppear 并且它起作用了。非常感谢您的帮助!【参考方案2】:您的视图控制器可能未设置为第一响应者。因此,当您查看 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];
【讨论】:
感谢您的回答。我没有添加。但我现在已将它添加到我的 FirstViewController.m 和 SecondViewController.m 的底部,但它没有任何区别:(以上是关于关闭标签栏控制器的主要内容,如果未能解决你的问题,请参考以下文章