How can I manually switch between UIViewControllers in storyboard?
我只需要用代码手动查看同一个故事板文件中的UIView控制器。我使用故事板制作所有形式和连接。我的应用程序从导航控制器开始,它提供了我对UIView的访问(LoginViewController的访问),然后转到标签栏控制器,它提供了4个UIViews。根据每个UIView文件,我都有.h和.m文件。我知道Segue方法,它很简单,但我需要手动方法。也许我做错了什么。
我试着用这个方法来推动IBAction中的视图控制器:
1
| [self.view pushViewController:LoginViewController animated:YES]; |
但它犯了一个错误:
Unexpected interface name ‘LoginViewController’: expected expression
我花了很多时间才弄清楚是什么问题,但我没有成功。这是我的RollEnemyController.m文件:
1 2 3 4 5 6 7 8 9 10 11 12
| // RollEnemyController.m
#import"RollEnemyController.h"
#import"LoginViewController.h"
@implementation RollEnemyController;
@synthesize AttackButtonPressed;
- (IBAction)AttackButtonPressed:(id)sender {
LoginViewController* controller = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil];
[self.view pushViewController:controller];
}
@end |
这是头文件:
1 2 3 4 5 6 7 8 9 10
| // RollEnemyController.h
#import <UIKit/UIKit.h>
@interface RollEnemyController : UIViewController
- (IBAction)RollButtonPressed:(id)sender;
@property (weak, nonatomic) IBOutlet UIButton *AttackButtonPressed;
@end |
- 很难说你提供的产品有什么问题。是否可以提供更多的代码?
- // RollEnemyController.m #import"RollEnemyController.h" #import"LoginViewController.h" @implementation RollEnemyController; @synthesize AttackButtonPressed; - (IBAction)AttackButtonPressed:(id)sender { LoginViewController* controller = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil]; [self.view pushViewController:controller]; } @end
- 你能更新你原来的帖子,并添加正确格式的代码吗?它将帮助那些希望帮助的人。
- 是的,对不起,我是新来的
我猜你用的是UINavigationController。然后你可以这样做:
1 2
| LoginViewController *controller = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil];
[self.navigationController pushViewController:controller animated:YES]; |
更新:
如果使用的是UIStoryboard,则可以设置新的viewcontroller的标识符,然后将其推送到导航控制器上。要设置标识符,请选择视图,打开属性检查器,然后设置标识符(在我的示例中为"loginidentifier")。然后你可以这样做:
1 2
| LoginViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"LoginIdentifier"];
[self.navigationController pushViewController:controller animated:YES]; |
作为旁注,我看到您的方法使用大写字符。您可能应该尽量避免这种情况,而应该在方法名称中使用低首字符。既然你说你在学习Objective-C,那么你应该在这里查看一下这个很棒的主题:so:link。
更新2:
这是一个zip文件,其中有一个项目显示如何执行此操作。-)
- 当我使用init而不是initWithNibName:@"LoginViewController" bundle:nil时,它是有效的,但它创建了一个空视图。我需要在故事板中推动现有视图。您的解决方案导致运行时错误终止应用程序,原因是未捕获异常"nsInternalConsistenceyException",原因:"无法在包中加载nib:"nsbundle
- 您的.xib文件名是什么?在initWithNibName:bundle:中传递的字符串是.xib文件的名称,没有".xib"。或者,您是否有这个视图控制器的.xib文件?(您在Interface Builder中创建的一个。)
- 我说是XIB的时候犯了个错误。我使用故事板制作所有形式和连接。我的应用程序在导航控制器中启动,它提供对uiview(loginviewcontroller)的访问,然后转到选项卡栏控制器,该控制器提供4个uiview。
- 哦,我明白了。我会更新我的答案。
- @Kokoko,你让它工作了吗?:)
- 不,没用。如果有人用2个ui视图、2个按钮创建一个简单的项目并展示它的工作原理,那就太好了。你能帮我吗?
- @Kokoko:好吧,我做了一个小项目,展示如何做。我用链接更新了我的答案。它还显示了如何更改为UITabBar。:)
- 非常感谢你。我已经想不起来了。我会尽快看到那个项目并回答你。
- 再次感谢!效果很好。更容易理解它是如何在正确的项目中工作的。
- @小子:太好了!很高兴我能帮忙。-)
- 感谢您的项目实例,出色的工作!谢谢您。
- 谢谢,这对我很有吸引力!
- 你就是那个人!!!!
- @Matsr:当我下载你的zip并运行时,当我单击Swap to second view时不会发生任何事情。
- @法辛帕克,这很奇怪。我只是在这里重新下载并在iOS5和iOS6模拟器上运行它,它工作正常。在运行项目之前,您是否更改了项目中的任何内容?
- @夫人:不……我只是在Xcode中解压打开。如果有任何疑问,我会再试一次,并回复您。但是我知道如何处理故事板。
- @Matsr,谢谢你的源代码!
- 下载了示例项目,效果很好!但是,您在哪里创建变量self.navigationcontroller的实例呢????
- @MHITC:我暂时没有访问Xcode的权限,我不记得项目是如何布置的,但它可能是XIB或故事板的一个实例。
你好,试着用这个代码
故事板放置id="xxx*name desire"标记使用Storyboarid
1 2 3 4 5
| UIStoryboard * storyboard = self.storyboard;
DetailViewController * detail = [storyboard instantiateViewControllerWithIdentifier: @"xxx * Name Desire"];
[self.navigationController pushViewController: detail animated: YES]; |
你在评论中提到你正在使用UIStoryboard。你知道UIStoryboardSegue吗?你只需要控制从按钮拖动到下一个视图控制器就可以建立一个segue。然后可以选择过渡类型。请注意,视图控制器必须是故事板中UINavigationController的一部分,才能执行"推"动画。
- 是的,我知道这很简单。但是我正在学习obj-c,我想知道如何用代码来完成它。
在本声明中:
1
| [self.view pushViewController:LoginViewController animated:YES]; |
看来你在努力推动一门课。你应该推一个对象,你的实际控制器:
1 2
| LoginViewController* controller = [[LoginViewController alloc] init...];
[self.view pushViewController:controller animated:YES]; |
这至少可以编译,如果其余的都可以,还可以提供第二个控制器。
编辑:
我漏了一分。您正在将视图控制器推到视图上。这毫无意义,您应该将控制器推到导航控制器上:
1 2
| <AppDelegate> *del = (AppDelegate*)[UIApplication sharedApplication].delegate;
[del.navigationController pushViewController:controller animated:YES]; |
至少,如果您是从基于导航的模板(它创建了一个引用导航控制器的应用程序委托)创建项目的,这是正确的。否则,请提供有关如何创建导航控制器的详细信息。
- LoginViewController* controller = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil]; [self.view pushViewController:controller];我已经尝试过了,但是仍然有,并且有错误:例如,消息的接收器类型'uiview'没有声明带有选择器'pushviewcontroller:'的方法
- UIView没有名为pushViewController:animated:的方法。这意味着你不能从self.view中调用它(这是UIView)。你宁愿用这一行:[self presentViewController:controller animated:YES completion:nil]。
- 我编辑了我的答案以提供完整的细节…@夫人:谢谢!我没有注意到这是一种观点,课堂上的事情引起了我所有的注意。