一个视图在iPhone上调用选项卡式视图的最佳方法

时间:2010-01-02 00:57:49

标签: iphone objective-c xcode multiview

编辑让我简化一下问题:假设你的应用程序有 两个视图,主视图和选项卡 查看3个选项卡。家庭观点有 三个名为“Tab1”的标准按钮, “Tab2”和“Tab3”。当你点击 “Tab1”,标签视图应该是 打开选项卡1和 同样适用于Tab2和Tab3。

任何提示?
/修改

我正在尝试做什么:当我的iPhone应用程序初始化时,它会显示一个带有一个按钮的视图。当我单击此按钮时,它应该转到选项卡式视图。

我正在做的方式并且它不起作用(获得未捕获的异常):我开始从基于视图的模板创建项目。在自动创建的视图控制器上,我已经声明了另一个名为TabbedViewController的视图控制器。这是头文件:

#import <UIKit/UIKit.h>

@class TabbedViewController;

@interface DZBluePagesViewController : UIViewController {
    TabbedViewController *tabbedViewController;
}

@property (nonatomic, retain) TabbedViewController *tabbedViewController;

-(IBAction)goToTabbedView:(id)sender;

@end

我创建了一个名为TabbedView的xib,并将文件所有者的类标识设置为TabbedViewController。我还拖了一个标签栏控制器。

我在主视图上添加了一个按钮,这是我在主视图控制器文件中与它关联的动作:

- (void)viewDidLoad {

    TabbedViewController *tvc = [[TabbedViewController alloc] 
                                 initWithNibName:@"TabbedView" bundle:nil];
    self.tabbedViewController = tvc;
    [tvc release];

    [super viewDidLoad];
}



-(IBAction)goToTabbedView:(id)sender {
//  [self.view removeFromSuperview];
    [self.view insertSubview:tabbedViewController.view atIndex:0];
}

我在insertSubview调用中得到一个未被捕获的异常...到目前为止,我已经在多视图应用程序上完成了3或4个教程(来自iPhone开发--Mark和LaMarche - 书),我认为我已经准备好了一个人没有牵着我的手......显然是错的。有人可以帮忙吗?

4 个答案:

答案 0 :(得分:1)

回答简化问题

我认为您需要第三个“根”视图并将控制器视为Home视图和Tab Bar视图的超级视图。

当您的应用启动时,Root视图将加载Home视图的内容。您可以使用以下行在根视图控制器中执行此操作:

homeViewController.view.frame = self.view.bounds;
[self.view addSubview:homeViewController.view];

然后,当您想切换到标签栏视图时,您可以这样做:

[homeViewController.view removeFromSuperview];
tabBarViewController.view.frame = self.view.bounds;
[self.view addSubview:tabBarViewController.view];

有一个问题:viewWillAppear:,viewDidAppear:方法不会被调用,除非你自己调用它们,所以你也必须将它们插入到正确的位置。

可能比Ben Gottlieb建议的更容易,并使用UINavigationController作为根视图。(我的意思是root作为我一直使用它的意义,导航控制器的根视图将然后,代替上面的代码,您可以调用pushViewController:方法来滑动tabBarViewController。如果这样做,您将需要自定义UINavigationController以隐藏导航栏,因为您可能不会我想要它,Apple实际上不建议在导航视图层次结构中放置一个标签栏。

关于例外

您发布的代码似乎与您发布的例外有任何关系。 See this blog post for instructions on setting a global breakpoint on thrown exceptions。这样你就可以使用调试器找出你自己程序中有问题的代码行。

答案 1 :(得分:0)

获得异常时打开运行控制台(shift-command-R)。张贴那个。您可能还想打开控制台,并在提示符下键入“bt”作为“返回跟踪”。

发布例外情况。

答案 2 :(得分:0)

我建议使用UINavigationController,然后在选择按钮后将tabController推到它上面。如果您不想要幻灯片动画,只需为动画:参数传递NO。

答案 3 :(得分:0)

为什么有冗余的菜单视图?为什么不将标签视图单独作为视图,让用户选择他们想要选择的标签?我不明白为什么你需要一个菜单​​,只要打开一个特定的标签,当标签栏界面没有菜单时就这样做...