【问题标题】:iphone - cant push modal views after adding subview to window?iphone - 将子视图添加到窗口后无法推送模态视图?
【发布时间】:2011-05-12 17:32:00
【问题描述】:

在我的应用程序中,我有以下代码,当我的应用程序启动时,第一位运行,并在模式视图中显示登录屏幕。在此之前将我的 rootController 添加到窗口中。

模态视图将允许用户登录、查看条款和条件,然后如果他们接受,则调用 loadMainApp 函数。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    rootController.delegate = self;
    [window addSubview:rootController.view];

    LoginViewController *_loginViewController = [[LoginViewController alloc] initWithNibName:@"LoginView" bundle:[NSBundle mainBundle]];
    self.loginViewController = _loginViewController;
    [_loginViewController release];


    UINavigationController *navi = [[[UINavigationController alloc]initWithRootViewController:loginViewController]autorelease];

    navi.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    [loginViewController release];
    [rootController presentModalViewController:navi animated:YES];

    [self.window makeKeyAndVisible];
    return YES;
}

当用户接受条款和条件时调用下一位:

-(void)loadMainApp:(UIView *)fromView{

    [fromView removeFromSuperview];
    [window addSubview:rootController.view];
    rootController.selectedIndex = 2;
    rootController.delegate = self;

}

从这里我希望能够使用作为模态视图的人员选择器,我尝试使用以下代码:

 ABPeoplePickerNavigationController *picker =
        [[ABPeoplePickerNavigationController alloc]init];
        picker.peoplePickerDelegate = self;

        [rootController presentModalViewController:picker animated:YES];
        [picker release];

但是什么也没有发生,当我尝试从我的 rootController 呈现一个模态视图时,什么也没有显示。

这似乎发生在 applicationDidFinishLaunching 中的这段代码运行后:

LoginViewController *_loginViewController = [[LoginViewController alloc] initWithNibName:@"LoginView" bundle:[NSBundle mainBundle]];
        self.loginViewController = _loginViewController;
        [_loginViewController release];


        UINavigationController *navi = [[[UINavigationController alloc]initWithRootViewController:loginViewController]autorelease];

        navi.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
        [loginViewController release];
        [rootController presentModalViewController:navi animated:YES];

        [self.window makeKeyAndVisible];
        return YES;

如果我根本不显示登录屏幕,而是添加我的 rootController

rootController.delegate = self;
        [window addSubview:rootController.view];

在 applicationDidFinishLaunching 函数中,当我显示人员选择器时一切正常。

我在这里打破了一些基本的东西,或者任何人都可以发现我可能做错了什么?

【问题讨论】:

    标签: iphone ios uinavigationcontroller presentmodalviewcontroller abpeoplepickerview


    【解决方案1】:

    您是否通过dismissModalViewControllerAnimated: 方法正确关闭了第一个模态视图控制器?如果您只是从其父视图中删除模态视图控制器的视图,那么 UIKit 可能会取消很多文​​书工作。

    【讨论】:

      【解决方案2】:

      你真正应该做的是这样的:

      1. 将 rootViewController 添加到 navigationController。然后将 navigationController 添加到窗口中。

      2. 在 rootViewController 的 viewDidLoad 方法中,将 loginViewController 的委托设置为 rootViewController,并将 LoginViewController 的实例显示为模态。

      3. 完成条款接受后,执行 [delegate loginViewControllerFinished];。

      4. 现在在 rootViewController 中,处理 loginViewControllerFinished 方法。这应该包含对 [self dismissModalViewControllerAnimated:YES] 的调用;关闭登录模式视图。然后您应该启动 ABPeoplePickerNavigationController作为模式视图


      在 AppDelegate 中:

      - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
      {
          // Make sure rootViewController is initiated by this point.
      
          UINavigationController *navigationController = [[[UINavigationController alloc] initWithRootViewController:rootViewController] autorelease];
      
          [window addSubview:rootController.view];
          [self.window makeKeyAndVisible];
          return YES;
      }
      

      在 RootViewController 中:

      - (void)viewDidLoad {
        [super viewDidLoad];
      
        LoginViewController *loginViewController = [[[LoginViewController alloc] initWithNibName:@"LoginView" bundle:nil] autorelease];
        loginViewController.delegate = self;
      
        loginViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
        [self presentModalViewController:loginViewController animated:YES];
      }
      
      - (void)loginViewControllerFinished {
        [self dismissModalViewControllerAnimated:YES];
      
        // Here we are closing one modal. And showing another after that.
        ABPeoplePickerNavigationController *peoplePicker = [[[ABPeoplePickerNavigationController alloc] init] autorelease];
        peoplePicker.peoplePickerDelegate = self;
        [self presentModalViewController:peoplePicker animated:YES];
      }
      

      在登录视图控制器中:

      // Make sure LoginViewController has delegate property in header.
      // @property (nonatomic, assign) id delegate;
      // And put this in implementation (.m) file. @synthesize delegate.
      // Don't put release for delegate, since it's not retained. It's only 'assigned'.
      
      - (void)done {
        // Call this when you want to close loginViewController.
        [delegate loginViewControllerFinished];
      }
      

      希望这会有所帮助。

      【讨论】:

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