我该如何在Storyboard中手动切换UIViewController?

24
我只需要用代码手动查看同一storyboard文件中的UIView控制器。我使用storyboard来创建所有表单和连接。我的应用程序在导航控制器中启动,该控制器为我提供对UIView(LoginViewController)的访问,然后它转到选项卡栏控制器,该控制器提供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

很难说出你提供的代码有什么问题。能否提供更多的代码呢? - 5StringRyan
`// 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`
- kokoko
你能否更新原始帖子并正确格式化添加这段代码?这将有助于其他人提供帮助。 - 5StringRyan
4个回答

108

我猜你正在使用一个UINavigationController。那么你可以这样简单地操作:

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

更新:

如果你正在使用UIStoryboard,你可以设置你的新视图控制器的标识符,然后将其推入你的导航控制器。要设置标识符,请选择你的视图,在属性检查器中打开,然后设置标识符(在我的例子中为“LoginIdentifier”)。接下来,你可以执行以下操作:

LoginViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"LoginIdentifier"];
[self.navigationController pushViewController:controller animated:YES];
作为旁注,我注意到您的方法使用大写字母。您应该尽量避免这种情况,而是在方法名中使用首字母小写。由于您说正在学习Objective-C,因此您应该在这里查看SO上的这个绝妙线程:link
更新2:这里是一个演示如何做到这一点的项目的zip文件。 :-)

非常感谢。我已经为了解决这个问题而烦恼得头都大了。我会尽快查看那个项目并回复你的。 - kokoko
再次感谢!它运行得很好。在正确的项目中理解它的工作方式要容易得多。 - kokoko
@kokoko:太好了!很高兴我能帮到你。 :-) - matsr
@matsr:当我下载您的压缩包并运行时,当我点击“切换到第二个视图”时什么也没有发生。 - Fahim Parkar
@mh-itc:目前我无法访问Xcode,也记不清项目的布局方式了,但可能是来自xib或storyboard的实例。 - matsr
显示剩余8条评论

4

你好,尝试使用以下代码

在故事板中放置ID =“xxx * Name Desire”的标记,使用Storyboard ID

UIStoryboard * storyboard = self.storyboard;

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

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

1

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


是的,我知道那很简单。但我正在学习Obj-C,想知道如何用代码实现它。 - kokoko

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];

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


我尝试了以下代码,但仍然出现错误:接收器类型'UIView'的实例消息没有声明具有选择器'pushViewController:'的方法LoginViewController* controller = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil]; [self.view pushViewController:controller]; - kokoko
2
UIView 没有名为 pushViewController:animated: 的方法。这意味着您无法从 self.view(即 UIView)调用它。相反,您应该使用以下代码行: [self presentViewController:controller animated:YES completion:nil] - matsr
我编辑了我的答案以提供全部细节... @ matsr:谢谢!我没有注意到那是视图,类的事情引起了我的注意。 - sergio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接