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

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

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

每个屏幕都有自己的viewController

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

我目前的做法是 -

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

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

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

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

谢谢!

【问题讨论】:

  • 看看UITabBarController,除了登录可能有用
  • 是的,但是标签栏显示在底部,对吗?

标签: ios objective-c cocoa-touch uiviewcontroller


【解决方案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】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多