如何在通用 UIViewController 之后设置自定义 UIViewController?

Posted

技术标签:

【中文标题】如何在通用 UIViewController 之后设置自定义 UIViewController?【英文标题】:How to set up a custom UIViewController after a general UIViewController? 【发布时间】:2011-01-12 20:31:00 【问题描述】:

(底部的最终解决方案)

我正在尝试设置一个具有初始登录视图的 iPad 应用程序。当用户单击该操作时,它应该重定向到主视图。 最初我正在设置一个 UIViewController 来处理登录视图。从那里我想使用自定义视图控制器显示下一组视图。

我正在创建一个处理 loginView 的 LoginViewController,将此视图从 AppDelegate 添加到窗口中:

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

    loginViewController = [[LoginViewController alloc] init];
    [self.window addSubview:loginViewController.loginView];
    [self.window makeKeyAndVisible];

    return YES;

我的 LoginViewController 的接口如下:

@interface LoginViewController : UIViewController 
    UIView *loginView;
    UITextField *usernameTextField;
    UITextField *passwordTextField;
    UIButton *submitButton;

@property (nonatomic, retain) IBOutlet UIView *loginView;
@property (nonatomic, retain) IBOutlet UITextField *usernameTextField;
@property (nonatomic, retain) IBOutlet UITextField *passwordTextField;
-(IBAction)submit;
-(void)setupTextFields;
@end

我试图做的是在我的 LoginViewController 中添加一个 HomeViewController,它将扩展 UIViewController 类,这样当我的 loginView 中的操作按钮被按下时,它会加载新的自定义视图控制器。

但是当我这样做时,由 HomeViewController 处理的初始显示图像呈现不正确。当它应该是纵向时,它似乎显示横向,反之亦然。

我希望登录视图显示在视图堆栈的底部,以便在单击注销操作时能够返回此登录视图。

我认为我解决这个问题的方法是错误的。谁能引导我找到最好的解决方案?我怎样才能做到这一点?


在遵循@Jonah 提出的解决方案后,我已将homeViewController 切换为在AppDelegate 中创建的,并调用displayLoginModalViewController,如下所示:

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

    homeViewController = [[HomeViewController alloc] init];
    [homeViewController displayLoginModalViewController];
    [self.window addSubview:homeViewController.homeView];
    [self.window makeKeyAndVisible];

    return YES;

我的displayLoginModalViewController的实现如下:

-(void)displayLoginModalViewController
    LoginViewController *loginViewController = [[LoginViewController alloc] init];
    loginViewController.modalPresentationStyle = UIModalPresentationFullScreen;
    loginViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    [self presentModalViewController:loginViewController animated:YES];

我确实尝试在将homeView 添加到窗口之前和之后调用displayLoginModalViewController 方法,但它没有呈现模态视图。我觉得我在这里缺少一些东西。当从 homeView 按下注销操作时,该方法会渲染模态视图,而不是在应用启动时。

我还在didFinishLaunchingWithOptions:presentModalViewController: 方法中添加子视图之后放置了NSLogs。 NSLogs 都显示在我的控制台中,我只是不知道为什么它没有显示模态视图。

================================================ ==============================================

感谢您提供的选项。我决定走模态路线。不幸的是,当我最初设置它时,我以错误的方式解决了这个问题。

当涉及到模态视图时,显然它们需要用户交互。这意味着它们只能在用户完成操作后呈现。当我第一次想将登录设置为模态视图并将我的主视图保持为主视图时,无法在启动时显示模态视图。它需要采取行动。

盯着屏幕看了几个小时后,我决定不再固执,将登录用作我的主屏幕,并将主页视图显示为模态。这不仅解决了启动时显示登录的问题,而且有助于设置我希望能够在不退出应用的情况下让用户退出应用并从那时起释放所有内存使用量。

【问题讨论】:

【参考方案1】:

您应该改用 UINavigationController。 大多数应用都采用这种方法,即使 navigationBar 被隐藏、视图被蒙皮或者它没有从右侧动画,那里通常有一个 UInavigationController。

它负责将 viewControllers 相互叠加的结构、内存、显示等。另一种方法是手动执行 UINavigationController 执行的操作。 这将涉及您的 viewController 有一个变量来存储下一个 viewController,然后将第二个 viewControllers 视图添加到第一个 viewController ...(这是很多工作,所以尽量避免这种方法成为您的基础)

这是一个必读。我浏览了不同的 viewController 容器以及何时使用它们——这正是你在事情变得非常复杂之前需要的东西。 ViewController Programming Guide

【讨论】:

我也必须支持你的答案。我最终将两者结合起来。从 loginViewController 呈现一个 navigationController 的模态视图控制器。 酷。希望你让它以内存/可维护的方式运行。 viewController 容器就像 cocoa touch 框架中的一种模式,如果您熟悉它们,它将有助于开发时间和用户的易用性:)【参考方案2】:

登录视图非常适合模态视图控制器。看看 UIViewController 的 -presentModalViewController: 作为一种机制,用于在当前填充您的窗口的任何其他视图控制器的“顶部”呈现您的登录视图控制器。

【讨论】:

当我按下注销按钮时会发生什么?我是否只是再次显示模态视图? 我认为您的选择非常适合我想做的事情。如何让应用程序在实例化时加载我的模态视图控制器。我将一些代码放在 initWithNibName 方法中,但似乎没有加载它。 在您的应用程序委托的-application:didFinishlaunchingWithOptions: 创建您的 HomeViewController 并将其添加到窗口。然后实例化一个 LoginViewController,就像您在发布的示例中所做的那样,并将其传递给您的 HomeViewController 实例的 -presentModalViewController:animated: 方法。然后,您的 HomeViewController 将在其自身之上显示 LoginViewController。然后 LoginViewController 可以自行关闭或通知 HomeViewController 登录已完成,HomeViewController 可以使用 -dismissModalViewControllerAnimated: 关闭它。 我已经更新了我的问题中的信息。它仍然没有在启动时呈现模态视图。

以上是关于如何在通用 UIViewController 之后设置自定义 UIViewController?的主要内容,如果未能解决你的问题,请参考以下文章

如何将通用链接连接到 UIViewController?

通用 UIViewController

iOS 7 通用后台 UIViewController

如何继承 UIViewController 的子类

有没有一种通用的方法来通知所有在 UIViewController 级别开始和移动的触摸?

如何在 phonegap 项目的闪屏后添加 UIViewController?