我遇到了一个非常奇怪的问题。我创建了自己的UITabBarController来定制它,它工作得很好……除了模式视图。当我使用动画关闭模式视图(在UITabBarController中显示/退出)时,它会一直等到动画结束,并转到选项卡栏的第一个控制器!
为什么控制器会改变?我怎么才能修复它呢?
谢谢
PS:我的UITabBarController视图在主窗口上,上面有一个UITabBar。控制器(由选项卡栏管理)位于主窗口的选项卡栏控制器视图上方,高度较短。当我呈现模式视图时,我将选项卡栏控制器视图放在前面。
发布于 2010-04-29 06:05:59
在读完你对我第一个答案的评论后,我更好地理解了你在做什么,尽管不看代码就很难找出哪里出了问题。我创建了另一个带有自定义选项卡栏控制器(从UIViewController派生的子类)的项目,其中一个选项卡式视图有一个呈现模式视图控制器的按钮。当我关闭模式视图时,它会返回到我所在的选项卡。
在您的问题中,您说由选项卡栏管理的视图控制器在主窗口上,当您呈现模式视图时,您会将选项卡栏控制器视图放在前面。这对我来说没什么意义。
在我的示例中,我将CustomTabBarController作为UIViewController的子类,并为具有两个选项卡栏项目和两个视图控制器的选项卡栏创建了实例变量。我添加了选项卡栏和成员视图控制器的两个视图作为CustomTabBarController视图的子视图(我设置了视图控制器的视图框架,使它们不会与选项卡栏重叠)。我还将CustomTabBarController设置为选项卡栏的代理。当选择了选项卡栏项目时,我将消息bringSubviewToFront:发送到CustomTabBarController的视图,并将适当的子视图作为参数。
其中一个成员视图控制器视图有一个按钮,当点击该按钮时,将显示模式视图。当点击按钮时,视图控制器可以调用presentModalViewController:,但是,因为您说您的选项卡栏控制器正在执行此操作,所以我在视图控制器中有一个IBAction方法(这是呈现模式视图的按钮的目标),它调用CustomTabBarController中的一个方法,该方法调用presentModalViewController:。视图控制器有一个用于CustomTabBarController的ivar (因为视图控制器属于CustomTabBarController,这很容易设置)。
模式视图控制器类还有一个用于CustomTabBarController的ivar (我是在调用presentModalViewController:之前设置的),并且我在模式视图中有一个关闭模式视图的按钮。该按钮连接到模态视图控制器类中的IBAction,然后调用CustomTabBarController中的方法。
当我这样做的时候,一切都如我所愿。我相信你有理由创建自定义标签栏控制器,但我怀疑这是否真的有必要。我希望这能帮到你。
发布于 2010-04-27 11:11:14
我有几个问题:
1)当你说“创建了我自己的UITabBarController”时,你的意思是你继承了UITabBarController?
2)如何调用来呈现模式视图控制器?是否有一个正在被点击的按钮或什么东西调用来呈现模式视图控制器?
你说控制器“在主窗口上”,当你呈现模式视图时,你“把标签栏控制器视图放在前面”。这让我很困惑。视图控制器应该“属于”标签栏控制器。
我创建了一个小项目,并让它为我工作,所以我做了以下工作:
1)我创建了UITabBarController的一个子类:
@interface MyTabBarController : UITabBarController
{
}
- (IBAction)presentModalView:(id)sender;
- (void)dismissModalview;
@end
@implementation MyTabBarController
- (IBAction)presentModalView:(id)sender
{
MyModalViewController* myModalView = [[MyModalViewController alloc] initWithNibName:@"ModalView" bundle:nil];
[myModalView setTbc:self];
[self presentModalViewController:myModalView animated:YES];
}
- (void)dismissModalview;
{
[self dismissModalViewControllerAnimated:YES];
}
@end2)然后对于我的模式视图控制器,我创建了一个UIViewController的子类:
@interface MyModalViewController : UIViewController
{
MyTabBarController* tbc;
}
@property (retain) MyTabBarController* tbc;
- (IBAction)returnToTabBar:(id)sender;
@end
@implementation MyModalViewController
@synthesize tbc;
- (IBAction)returnToTabBar:(id)sender;
{
[tbc dismissModalview];
}
@end3)我将一个标签栏控制器拖放到MainWindow.xib中,将其所有者设置为MyTabBarController,并向两个标签添加视图控制器(我使用检查器将每个标签的背景颜色设置为不同的颜色)。在第二个选项卡的视图控制器中,我添加了一个按钮,并在MyTabBarController中将其目标设置为操作"presentModalView:“。
4)我创建了一个新的xib,其中包含一个名为ModalView的视图,并将其文件的所有者设置为MyModalViewController。我将视图的背景颜色设置为与上面两种颜色不同的颜色,并在视图中添加了一个按钮。我在MyModalviewController中将按钮的目标设置为操作"returnToTabBar:“。
显然,我必须将选项卡栏视图添加到应用程序委托中window的子视图中。这对我很有效,当我在第二个选项卡上时,呈现了一个模式视图控制器,当我取消它时,我返回到选项卡栏控制器中的第二个选项卡。
我希望这能帮到你!
发布于 2010-07-13 00:19:51
我怀疑你做了很多(太多了?)在viewDidLoad中初始化工作,其中一件事是选择第一个选项卡?
也许你可以和我们分享一下你的自定义Tab bar控制器类中的init/load的顺序?
在显示模式视图时,您的Tab栏控制器视图可能正在卸载,当取消模式视图时,可能会重新加载(调用viewDidLoad)。
我的建议是在选项卡切换和视图加载方法中设置一些调试器断点,并检查调用堆栈,以确保Tab栏控制器的生命周期与您的理解相符。
https://stackoverflow.com/questions/2717452
复制相似问题