如何在 Cocoa Touch 中的任意两个 ViewController 之间进行转换?

Posted

技术标签:

【中文标题】如何在 Cocoa Touch 中的任意两个 ViewController 之间进行转换?【英文标题】:How to transition between any two ViewControllers in Cocoa Touch? 【发布时间】:2015-03-02 07:01:03 【问题描述】:

我是相当新的 ios 开发人员。例如,我的应用有多个 viewControllers -

登录屏幕 主屏幕/我的个人资料屏幕 排行榜/排名屏幕 等等..

每个屏幕都有自己的viewController

用动画在任意两个任意viewControllers 之间转换的最佳方式是什么?

我目前的做法是 -

    保留对AppDelegate.m 中每个viewController 的引用 根据需要不断更改窗口的根控制器

这既麻烦又似乎效率很低,而且我不太确定如何在此处合并动画过渡。

我看到了UINavigationController 的一些示例,但它看起来像是一个“堆栈”视图,您可以进入然后退出。我不想在此处保留历史记录,只需从任何视图切换到另一个视图即可。

有什么好的方法可以做到这一点?

谢谢!

【问题讨论】:

看看UITabBarController,除了登录可能有用 是的,但是标签栏显示在底部,对吗? 【参考方案1】:

试试这个代码。

AppDelegate.h

#import <UIKit/UIKit.h>
#import "LoginViewController.h"

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (strong,nonatomic) UINavigationController *navigationController;
@property (strong,nonatomic) LoginViewController *loginVC;

@end

AppDelegate.m

#import "AppDelegate.h"
#import "LoginViewController.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.

   self.loginVC = [[LoginViewController alloc]initWithNibName:nil bundle:nil];
   self.loginVC.title = @"Login Page";

   self.navigationController = [[UINavigationController alloc]initWithRootViewController:self.loginVC];

   self.window.rootViewController = self.navigationController;
   [self.window makeKeyAndVisible];

LoginViewController.h

#import <UIKit/UIKit.h>
#import "MyProfileViewController.h"

@interface LoginViewController : UIViewController

@property (strong,nonatomic)MyProfileViewController *myProfileVC;

@end

LoginViewController.m 文件中的登录按钮操作

- (IBAction)pushMyProfileView:(id)sender

    self.myProfileVC = [[MyProfileViewController alloc]initWithNibName:nil bundle:nil];
    [self.navigationController pushViewController:self.myProfileVC animated:YES];

【讨论】:

所以这对于在两个特定视图之间转换很有用,但是如果我有 8 个视图控制器,例如,每个视图控制器都需要存储对其他 7 个的引用。【参考方案2】:

基本上你可以通过以下方式实现:

    Apple 容器(UINavigationController、UITabbarController、UISplitController) 遏制 API 使用“普通”视图控制器和模态展示

Containment API 可能是您正在寻找的,您创建一个 UIViewController 负责管理其子视图控制器的呈现。这里是Apple Documentation,里面有很多例子。

【讨论】:

【参考方案3】:

作为初学者,我认为最简单的解决方案是使用Storyboard 并在视图控制器之间创建一个segue。

在您的 ViewController 中,您应该重写 prepareForSegue: 方法以将数据传递给 segue.destinationViewController

【讨论】:

以上是关于如何在 Cocoa Touch 中的任意两个 ViewController 之间进行转换?的主要内容,如果未能解决你的问题,请参考以下文章

Cocoa Touch 中的 MVC:视图和模型如何交互?

Cocoa Touch 中的两种方法“按住按钮”

如何解决 Cocoa touch 框架中的符号名称冲突

cocoa 和 cocoa touch的区别

我如何在 Cocoa Touch 库中使用故事板

在 Cocoa/Cocoa Touch 中监控目录