【问题标题】:how to move between views by using Tab bar如何使用标签栏在视图之间移动
【发布时间】:2012-01-31 07:24:08
【问题描述】:

我正在做一个基于 SingleView 的应用程序的应用程序,其中我有许多 UIviewcontrollerclass 子类用于从一个视图移动到另一个视图。我在其中一个视图中有一个标签栏,并希望在单击时与其他视图通信tab.so 请告诉我我该怎么做,我被困在这里。 我有类叫

LoginPage.h/.m/.xib

Myservices.h/.m/.xib

History.h/.m/.xib

Profile.h/.m/.xib

MyRecentRequest.h/.m/.xib

当我从登录页面进入时,它会移动到 Myservices 视图。 我在底部添加了标签栏,并添加了另外两个标签项目,总共有 4 个标签栏项目,分别命名为 Myservices、history、MyrecentRequest 和 profile。

现在我想将标签栏与其他类连接起来,这样当我点击标签项时,应该会出现该特定类的相应视图,那么我该怎么做呢?请提供示例代码。

【问题讨论】:

  • 您是否有理由不使用 UITabBarController 来保存 MyServices History、Profile 和 MyRecentRequests 视图控制器?在未登录时,您可以将 LoginPage 视图(或持有它的导航控制器)添加到应用程序窗口。登录后,您可以删除 LoginPage 并添加选项卡控制器。
  • @babbidi 我没有使用 UItab 控制器,因为我只想要 3 个视图。而且我的应用程序只有这些视图我有更多视图,所以从一个屏幕流到另一个屏幕

标签: iphone objective-c ios xcode uitabbar


【解决方案1】:

首先,您是如何从 IB 或代码维护 tabBar 的。下面如果通过代码。您需要为每个 tabItem 分配一个包含所有 viewController 的 tabBar,以下是带有 2 个 tabItem 的示例:

UITabBarController* tabBarController = [[UITabBarController alloc] init];
NSMutableArray *localViewControllersArray = [[NSMutableArray alloc] initWithCapacity:8];

ViewController1* vC1 = [[ViewController1 alloc] init];
UINavigationController* navController1 = [[UINavigationController alloc] initWithRootViewController:vC1];
[vC1 release];      
navController1.tabBarItem.image = [UIImage imageNamed:@"navController1_image.png"];
[localViewControllersArray addObject:navController1];
[navController1 release]; 

ViewController2* vC2 = [[ViewController2 alloc] init];
UINavigationController* navController2 = [[UINavigationController alloc] initWithRootViewController:vC2];
navController2.tabBarItem.image = [UIImage imageNamed:@"navController2_image.png"];
[vC2 release];      
[localViewControllersArray addObject:navController2];
[navController2 release]; 

tabBarController.viewControllers = localViewControllersArray;
    self.window.rootViewController = tabbarController;
[localViewControllersArray release];
    [tabBarController release];

通过这种方式,您可以通过代码维护 tabBar,这样如果选择了选项卡,将显示相应的视图,在此示例中,每个选项卡中都使用导航控制器来提供导航,如果只需要 1 个视图,您可以避免导航控制器..

【讨论】:

  • 我正在维护 IB 的 Tabbar ..我从库中拖了一个标签栏?有 4 个标签栏项目..
  • 如果你通过代码会更好,因为登录后你可以调用一个方法来分配tabBar,初始化并添加到窗口。注销后删除tabBar,释放并显示登录屏幕。这将很容易维护..
  • 但是我只在这些屏幕上使用标签栏...再次从我的服务视图中,视图将继续在没有标签栏的情况下继续移动?所以我应该怎么做?
  • 那么最好用代码实现,从tabBar退出时释放它。实现 appDelegate 中的方法。因为如果它仅在某些情况下使用,那么为什么要从 IB 持有。
  • 所以上面的代码我应该在哪里添加或以哪种方法添加?我需要从库中拖动tabBar并连接任​​何IBoutlet吗?请指导我,我们可以在聊天中继续讨论吗?
【解决方案2】:

为此,以下代码用于动态选择导航控制器并选择要选择的选项卡。

-(void)applicationDidFinishLaunching:(UIApplication *)application {

// Add the tab bar controller's current view as a subview of the window
tabBarController.delegate=self;
tabBarController=[[UITabBarController alloc] init];

mainDashBoard=[[DashBoard alloc] initWithNibName:@"DashBoard" bundle:nil];
mainSearchView=[[SearchView alloc] initWithNibName:@"SearchView" bundle:nil];
mainMoreView=[[MoreView alloc] initWithNibName:@"MoreView" bundle:nil];

UINavigationController *nvCtr0=[[[UINavigationController alloc] init] autorelease];
UINavigationController *nvCtr1=[[[UINavigationController alloc] initWithRootViewController:mainDashBoard] autorelease];
UINavigationController *nvCtr2=[[[UINavigationController alloc] initWithRootViewController:mainSearchView] autorelease];
UINavigationController *nvCtr3=[[[UINavigationController alloc] initWithRootViewController:mainMoreView] autorelease];
UINavigationController *nvCtr4=[[[UINavigationController alloc] init] autorelease];//[[[UINavigationController alloc] initWithRootViewController:nil] autorelease];

tabBarController.viewControllers=[NSArray arrayWithObjects:nvCtr0,nvCtr1,nvCtr2,nvCtr3,nvCtr4,nil];

nvCtr0.tabBarItem.enabled=NO;
nvCtr4.tabBarItem.enabled=NO;
 delegate.tabBarController.selectedIndex = 0;
[window tabBarController.view];
}

这可能有助于创建应用程序

【讨论】: