0

这个很棘手。我有一个 UINavigationController 的子类,它覆盖了 pop/push 和 present/dismiss 方法。如果 UINavigationController 子类包含在弹出框中,我在这里自定义行为以设置正确的大小。没什么太花哨的,但我这样做是为了不编写所有 ViewController 的子类并使用 Autolayout。

但是,and 的完成块presentViewController:animated:completion:dismissViewControllerAnimated:completion:没有被执行。这是奇怪的部分:在 iPhone 上完全相同的代码可以正常工作,但在 iPad 上没有执行这些块。这是一个代码示例。

@interface SBNavigationController : UINavigationController

@end

@implementation SBNavigationController

- (void) presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion
{
    if ([viewControllerToPresent isKindOfClass:[UINavigationController class]])
    {
        UINavigationController *nav = (UINavigationController *) viewControllerToPresent;
        [nav.topViewController setContentSizeForViewInPopover:kFullSizePopover];

    } else
    {
        [viewControllerToPresent setContentSizeForViewInPopover:kFullSizePopover];
    }

    viewControllerToPresent.modalPresentationStyle = UIModalPresentationCurrentContext;
    [super presentViewController:viewControllerToPresent animated:flag completion:completion];
}

- (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion ;
{
    [super dismissViewControllerAnimated:flag completion:completion];
}
@end

使用它的代码是这样的:

@implementation SBInviteFBContactViewController

...

- (void) createInviteByMailViewController
{
    SBInviteMailViewController *mailInvite = [[SBInviteMailViewController alloc] initWithDelegate:self userInfo:_userInfo];

    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:mailInvite];

    [self.navigationController presentViewController:navController
                                            animated:YES
                                          completion:^{

                                              NSLog(@"presentViewController:");

                                          }];

}

#pragma mark SBInviteMailProtocol

- (void) invitedMailContacts:(NSArray *)contacts;
{
    [self.navigationController dismissViewControllerAnimated:YES
                                                  completion:^{
                                                      NSLog(@"animation Ended");
                                                      if (contacts) {
                                                          [self.delegate invitedMailContact:contacts];
                                                          [self popViewControllerAnimated:YES];
                                                      }
                                                  }];
}

...

@end

有任何想法吗?

4

2 回答 2

1

这似乎是一个巨大的错误。请向 Apple 报告(我也将这样做)。我在这里找到了自己的方式,因为我自己也发现了同样的错误,并进行了谷歌搜索以查看是否有其他人在谈论它。

我创建了一个非常小的演示项目,其架构是这样的:

  • ViewController - 主视图控制器

    它的视图包含一个按钮 Tap Me。

  • PopoverViewController - 出现在 popover 中

    当您在主 ViewController 中点击 Tap Me 时,它​​会创建一个 UIPopoverController,并使用vc PopoverViewController 作为其内容视图控制器;它的视图也包含一个按钮 Tap Me。

  • PopoverViewController2 - 在同一个弹出窗口中“模态”呈现

    PopoverViewController2 将其modalPresentationStyle设置为,UIModalPresentationCurrentContext因此它可以出现在弹出框内。当您在弹出窗口中点击 Tap Me 时,PopoverViewController 会调用presentViewController:....

这是代码:

- (IBAction)doTapMe:(id)sender {
    NSLog(@"about to present view controller");
    [self presentViewController:[PopoverViewController2 new] animated:YES completion:^{
        NSLog(@"in completion handler"); // never called!
    }];
    NSLog(@"did present view controller");
}

日志显示“即将呈现视图控制器”和“确实呈现视图控制器”,但“完成处理程序中”从未出现,即使“模态”视图控制器的视图出现在弹出窗口中就好了。

(此外,更改为animated:NO不仅不能解决问题,还会导致视觉故障。)

于 2013-04-22T01:20:54.350 回答
0

UIModalPrsentationCurrentContext仅当您针对 iOS 3.2 或更高版本进行编译时,该样式才可用。无法想象这是问题所在。

的文档UIModalPrsentationCurrentContext还说:

在弹出窗口中呈现视图控制器时,仅当过渡样式为 UIModalTransitionStyleCoverVertical 时才支持此呈现样式。尝试使用不同的转换样式会触发异常。但是,如果父视图控制器不在弹出窗口中,您可以使用其他转换样式(部分卷曲转换除外)。

这是一个奇怪的问题。

你有没有机会在 iPhone 和 iPad 上运行不同版本的 iOS?

于 2013-01-15T18:05:09.460 回答