您好我在用户成功登录后会在主菜单上弹出一个模态视图控制器。这用于需要保存在用户默认的其他角色。模态被正确解散,但之后不会通过-viewdidappear方法。我对它进行了编程,以便在选择角色后,它将加载整个主菜单,其中包含基于角色的填充数据。我以前做了一个“presentViewController:roleVC”而不是模态,但决定不再使用它,因为我无法修改VC的大小(我希望它以模态样式显示)。无论如何,使用presentViewController,父VC会通过-viewdidappear,这对我来说非常适合。现在我不确定在解雇模态后如何强制它再次通过viewdidappear。
这是一些让人们更容易理解的屏幕。
这就是我的viewdid出现在主菜单中的内容。 (....将直接交通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(例如,roleVC.modalPresentationStyle = UIModalPresentationFormSheet;)的情况下进行 presentViewController 时,它将关闭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]
}
答案 0 :(得分:0)
对于那些在弹出viewcontrollers时可能遇到同样问题并且在解雇后需要做其他事情的人,我用这个解决了它
https://stackoverflow.com/a/7194182/639713
基本上,放置一个延迟,因为某些原因它需要一些modalviewcontroller被删除。我添加了一个委托,它将调用另一个延迟发生的方法。