1

嗨,我有一个 modalview 控制器,在用户成功登录后会在主菜单上弹出。这用于需要保存在 userdefaults 上的其他角色。模态被正确地解除,但之后它没有通过 -viewdidappear 方法。我对其进行了编程,以便在选择角色后,它将加载整个主菜单,其中包含基于角色的填充数据。我曾经做过“presentViewController:roleVC”而不是模态,但决定不再使用它,因为我无法修改 VC 的大小(我希望它以模态样式显示)。无论如何,使用 presentViewController,父 VC 会通过 -viewdidappear,这对我之前非常有效。现在我不确定如何强制它在关闭模式后再次通过 viewdidappear 。

这里有一些屏幕使它更容易理解。

在此处输入图像描述

这就是我在该主菜单的 viewdidappear 中的内容。(....将直接流量 VC)

if([[NSUserDefaults standardUserDefaults] objectForKey:@"role"] == nil){
        /*UIViewController *roleVC = [storyboard instantiateViewControllerWithIdentifier:@"SBIDRoleViewController"];
        [self presentViewController:roleVC animated:YES completion:^{}];*/
        UIViewController *roleVC = [storyboard instantiateViewControllerWithIdentifier:@"SBIDRoleViewController"];
        roleVC.modalPresentationStyle = UIModalPresentationFormSheet;
        roleVC.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
        [self presentViewController:roleVC animated:YES completion:nil];
        roleVC.view.superview.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;
        roleVC.view.superview.bounds = CGRectMake(0, 0, 500, 600);
    }else{
        if([[NSUserDefaults standardUserDefaults] integerForKey:@"role"] == 1){
            MainAdminDashboardViewController *adminVC = (MainAdminDashboardViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"MainAdminDashboardViewControllerID"];
            [self presentViewController:adminVC animated:NO completion:nil];
        }else{
            [self performSegueWithIdentifier:@"SeguePushToMatsFromSwitchBoard" sender:self];
        }
    }

如您所见,segue 在分配角色后被推送。

这是单击按钮时的关闭

- (IBAction)btnRole1:(id)sender {
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    [prefs setInteger:2 forKey:@"role"];
    [self dismissViewControllerAnimated:YES completion:nil];
}

当这个按钮被点击之前(使用presentviewcontroller),它会通过viewdidappear。现在没有了。关于如何处理这个问题的任何建议?我很新,所以一切都乱七八糟,所以任何关于处理这个问题的最佳实践的建议也很重要。

谢谢!

编辑: 另外,为了清楚起见,当我在没有编辑其 modalproperties 的情况下执行 presentViewController 时(例如,roleVC.modalPresentationStyle = UIModalPresentationFormSheet;)它会关闭 VC,然后会通过 viewdidappear。这就是我之前调用它的方式,并且在我关闭它后它会点击 viewdidappear。

UIViewController *roleVC = [storyboard instantiateViewControllerWithIdentifier:@"SBIDRoleViewController"];
            [self presentViewController:roleVC animated:YES completion:^{}];

更新: 所以我尝试在弹出窗口上放置一个协议(委托)。我的问题是这个,如果它试图调用一个segue,它可以完美地工作,这样它就可以替换细节视图。但是,我想在 Splitviewcontroller 之上有一些完全不同的东西,所以我会调用 presentViewcontroller。它不会出现。

这是我的代码。

这是模态VC(角色控制器)

@protocol RoleViewDelegate<NSObject>
-(void)dismissVC;
@end
@interface RoleViewVC : UIViewController
@property(nonatomic, strong) id roleViewDelegate;

关于VC的实施

-(IBAction)role1:(id)sender{
   if(roleViewDelegate != nil){
       [roleViewDelegate dismissVC];
   }
}

在调用它们的 VC 上

-(void)dismissVC{
   [self dismissViewControllerAnimated:YES completion:nil];
   UISToryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
   // pop up another VC that contains tabbed menus to replace Split View
   AdminMenuViewController *adminVC = [storyboard instantiateViewControllerWithIdentifier:@"SBIDAdminVC"];

   [self presentViewController:adminVC animated:YES completion:nil]
}
4

1 回答 1

0

对于那些在弹出视图控制器时可能遇到相同问题并且在关闭后需要做其他事情的人,我使用这个解决了它

https://stackoverflow.com/a/7194182/639713

基本上,放置一个延迟,因为出于某种原因,模态视图控制器需要一些时间才能被删除。我添加了一个委托,它将调用另一个发生延迟的方法。

于 2013-04-10T13:18:59.947 回答