如何在一般的UIViewController之后设置自定义UIViewController?

时间:2011-01-12 20:31:01

标签: cocoa-touch ipad ios uiview uiviewcontroller

(底部的最终解决方案)

我正在尝试设置一个具有初始登录视图的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];
}

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

NSLogdidFinishLaunchingWithOptions:presentModalViewController方法中添加子视图后,我也放置了displayLoginModalViewController个。两个NSLog都显示在我的控制台中,我只是不知道为什么它没有显示模态视图。

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

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

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

在屏幕上盯着几个小时后,我决定不再顽固,并使用登录作为我的主屏幕,并将主视图显示为模态。这不仅解决了在启动时显示登录的问题,而且还有助于设置我希望能够在不退出应用程序的情况下将用户从应用程序中注销,并简单地从该点释放所有内存使用情况。

2 个答案:

答案 0 :(得分:3)

您应该使用UINavigationController。 大多数应用程序采用这种方法,即使导航栏被隐藏,视图被蒙皮,或者它没有从右边动画,因此通常有一个UInavigationController。

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

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

答案 1 :(得分:1)

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