如何在故事板中手动切换UIViewControllers?

时间:2011-12-01 20:51:06

标签: iphone ios xcode uiviewcontroller ios5

我只需要使用代码手动查看同一故事板文件中的UIView控制器。我使用故事板制作所有表格和连接。我的应用程序从导航控制器开始,它使我能够访问UIViewLoginViewController),然后转到标签栏控制器,它提供4 UIViews。根据每个UIView我有.h.m个文件。我知道segue方法,很简单,但我需要手动方法。也许我做错了什么。

我试图使用此方法在IBAction中推送视图控制器:

[self.view pushViewController:LoginViewController animated:YES];

但它出错了:

  

意外的接口名称'LoginViewController':期望的表达式

花了很多时间才弄清楚出了什么问题,但我没有成功。 这是我的RollEnemyController.m文件:

//  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

这是头文件:

//  RollEnemyController.h

#import <UIKit/UIKit.h>

@interface RollEnemyController : UIViewController

- (IBAction)RollButtonPressed:(id)sender;
@property (weak, nonatomic) IBOutlet UIButton *AttackButtonPressed;

@end

4 个答案:

答案 0 :(得分:108)

我猜你正在使用UINavigationController。然后你可以这样做:

LoginViewController *controller = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil];
[self.navigationController pushViewController:controller animated:YES];

<强>更新

如果您使用的是UIStoryboard,则可以设置新viewcontroller的标识符,然后将其推送到navigationController。要设置标识符,请选择视图,打开“属性”检查器,然后设置标识符(在我的示例中为“LoginIdentifier”)。然后你可以这样做:

LoginViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"LoginIdentifier"];
[self.navigationController pushViewController:controller animated:YES];

作为旁注,我看到你正在为你的方法使用大写字符。您可能应该尝试避免这种情况,而是在方法名称中使用降低的第一个字符。既然你说你正在学习Objective-C,你应该在SO link上查看这个很棒的主题。

更新2:

Here是一个zip文件,其中包含一个显示如何执行此操作的项目。 : - )

答案 1 :(得分:4)

你好试着使用这段代码

故事板放ID =“xxx *名称欲望” 标记使用StoryboarID

UIStoryboard * storyboard = self.storyboard;

DetailViewController * detail = [storyboard instantiateViewControllerWithIdentifier: @ "xxx * Name Desire"];

[self.navigationController pushViewController: detail animated: YES];

答案 2 :(得分:1)

在此声明中:

[self.view pushViewController:LoginViewController animated:YES];

您似乎正在尝试推送。你应该推送一个对象,你的实际控制器:

LoginViewController* controller = [[LoginViewController alloc] init...];
[self.view pushViewController:controller animated:YES];

这至少会编译,如果所有其余的都没问题,也会给你第二个控制器。

编辑:

我错过了一点。您正在将视图控制器推送到视图。这没有任何意义,你应该将控制器推到导航控制器上:

<AppDelegate> *del = (AppDelegate*)[UIApplication sharedApplication].delegate;
[del.navigationController pushViewController:controller animated:YES];

至少,如果您是从基于导航的模板创建项目(这将创建一个带有对导航控制器的引用的应用程序委托),那么这是真的。否则,请提供有关如何创建导航控制器的详细信息。

答案 3 :(得分:1)

您在评论中提到您正在使用UIStoryboard。你知道UIStoryboardSegue吗?所有你必须控制 - 从按钮拖动到下一个视图控制器以建立segue。然后您可以选择过渡类型。请注意,您的视图控制器需要成为故事板中UINavigationController的一部分才能执行“推送”动画。