如何在ios中从一个视图导航到另一个视图?
Posted
技术标签:
【中文标题】如何在ios中从一个视图导航到另一个视图?【英文标题】:How to Navigate from one view to another view in ios? 【发布时间】:2013-12-25 06:51:16 【问题描述】:我有带有 4 个选项的标签栏。 在第一个选项卡中,我有一个按钮。当我单击此按钮时,我必须在第二个标签栏中从一个视图移动到另一个视图。
我目前使用的代码是(shipVC
是第二个标签的viewController
):
[shipVC.navigationController pushViewController:cartVC animated:NO];
所以基本上,当按下第一个标签viewController
中的按钮时,我想从第二个标签viewController
中的“X”视图移动到“Y”视图
【问题讨论】:
[self.navigationController pushViewController:cartVC animated:NO ]; 我不在同一个视图中导航 提供更多信息,问题含糊不清(现在) 按下第一个标签栏中的按钮时,我必须从第二个标签栏中的“X”视图移动到“Y”视图 @Madhu :所以一个viewController
中的操作需要在另一个(不相关?)viewController
中体现变化?这可以通过NSNotificationCenter
或使用委托模式来完成。 (两者都很简单)
【参考方案1】:
一种快速的方法是使用NSNotificationCenter
在第一个选项卡的viewController
中的按钮被按下时发布通知。
步骤:
-
在第二个选项卡的
viewController
的-viewDidLoad
方法中:
添加通知观察者并为其设置目标选择器方法
在第一个标签的viewController
的按钮方法中:
发布通知
示例:
您的第二个标签的viewController
类:
-(void)viewDidLoad
[super viewDidLoad];
[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(doTheNavigation)
name:@"AnyNameYouWantForNotification"
object:nil];
-(void)doTheNavigation
[self.navigationController pushViewController:cartVC animated:NO];
//WARNING: don't just push, put a check or else repeated click on the
//button in the 1st tab will push cartVC again and again.
//This will not only warrant a crash but look very ugly
第一个标签的viewController
类中的按钮方法:
-(IBAction)someBtnClick:(UIButton *)sender
//...
//you can use this to post a notification from anywhere now
[[NSNotificationCenter defaultCenter] postNotificationName:@"AnyNameYouWantForNotification"
object:nil];
//...
所以...
单击第一个选项卡中的按钮时,按钮操作(我命名为someBtnClick
)将发布一个名为 AnyNameYouWantForNotification
的通知
第二个选项卡(应该已经加载并准备好了)将监听名称为 AnyNameYouWantForNotification
的通知。
收到此通知后,它将执行链接选择器方法(我命名为doTheNavigation
)
【讨论】:
@Madhu:不客气。通知既简单又足智多谋。苹果文档也很不错:link: NSNotificationCenter Apple Doc【参考方案2】:检查我的答案
-(void)settabbar
UIViewController *viewController1 = [[[viewController1 alloc] initWithNibName:@"viewController1" bundle:nil] autorelease];
UIViewController *viewController2 = [[[viewController2 alloc] initWithNibName:@"viewController2" bundle:nil] autorelease];
UIViewController *viewController3 = [[[viewController3 alloc] initWithNibName:@"viewController3" bundle:nil] autorelease];
navControl1=[[UINavigationController alloc]initWithRootViewController:viewController1];
navControl2=[[UINavigationController alloc]initWithRootViewController:viewController2];
navControl3=[[UINavigationController alloc]initWithRootViewController:viewController3];
navControl1.navigationBar.tintColor=[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8];
navControl2.navigationBar.tintColor=[UIColor blackColor];
navControl3.navigationBar.tintColor=[UIColor blackColor];
self.tabBarController = [[[UITabBarController alloc] init] autorelease];
self.tabBarController.delegate=self;
self.tabBarController.viewControllers = [NSArray arrayWithObjects:navControl1,navControl2,navControl3, nil ];
[[[[self.tabBarController tabBar] items] objectAtIndex:2] setFinishedSelectedImage:[UIImage imageNamed:@""] withFinishedUnselectedImage:[UIImage imageNamed:@""]];
[[[[self.tabBarController tabBar] items] objectAtIndex:0] setTitle:@"view1"];
[[[[self.tabBarController tabBar] items] objectAtIndex:0] setImage:[UIImage imageNamed:@"tab2.png"]];
[[[[self.tabBarController tabBar] items] objectAtIndex:1] setTitle:@"view2"];
[[[[self.tabBarController tabBar] items] objectAtIndex:1] setImage:[UIImage imageNamed:@"tab11.png"]];
[[[[self.tabBarController tabBar] items] objectAtIndex:2] setTitle:@"ciew3"];
[[[[self.tabBarController tabBar] items] objectAtIndex:2] setImage:[UIImage imageNamed:@"tab5.png"]];
[[[[self.tabBarController tabBar] items] objectAtIndex:3] setTitle:@"Maintain Customer"];
[[[[self.tabBarController tabBar] items] objectAtIndex:3] setImage:[UIImage imageNamed:@"tab4.png"]];
[self.tabBarController.tabBar setSelectionIndicatorImage:[UIImage imageNamed:@"trans.png"]];
UIImage* tabBarBackground = [UIImage imageNamed:@""];
[[UITabBar appearance] setBackgroundImage:tabBarBackground];
[[UITabBar appearance] setSelectionIndicatorImage:[UIImage imageNamed:@"trans.png"]];
-(BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController*)viewController
NSLog(@"select : %d",tabBarController.tabBar.selectedItem.tag);
if(self.tabBarController.tabBar.selectedItem.tag==0)
[[self.tabBarController.viewControllers objectAtIndex:0] popViewControllerAnimated:YES];
else if(self.tabBarController.tabBar.selectedItem.tag==1)
[[self.tabBarController.viewControllers objectAtIndex:1] popViewControllerAnimated:YES];
else if(self.tabBarController.tabBar.selectedItem.tag==2)
[[self.tabBarController.viewControllers objectAtIndex:2] popViewControllerAnimated:YES];
else
[(UINavigationController*) viewController popToRootViewControllerAnimated:YES];
return YES;
【讨论】:
【参考方案3】:您还需要在您的 appdelegate 中使用 Naigationcontroller 进行应用
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] ;
HomeViewController *homeView = [[HomeViewController alloc] initWithNibName:@"HomeViewController" bundle:[NSBundle mainBundle]];
[self.navigationController pushViewController:homeView animated:YES];
UINavigationController *navController=[[UINavigationController alloc]initWithRootViewController:homeView];
self.window.rootViewController = navController;
[self.window makeKeyAndVisible];
之后,您的导航栏将出现在您的第一个视图控制器中,然后您就可以导航了。
【讨论】:
我不在同一个视图中导航 如果你想导航其他选项卡,你需要使用它是不可能的:[tabController setSelectedIndex:1]; 当我使用这个方法时 [tabController setSelectedIndex:1];默认情况下,它显示我们放置在堆栈中的最后一个视图。但我希望加载我自己的屏幕 当你点击bottun,然后你想去第二个选项卡,然后在按钮点击动作中写下这段代码。以上是关于如何在ios中从一个视图导航到另一个视图?的主要内容,如果未能解决你的问题,请参考以下文章
如何在我的 Xcode Swift 项目的不同导航堆栈中从一个视图控制器屏幕切换到另一个?