无法在iOS7中显示模态视图控制器

13

我试图将系统定义的视图控制器(MFMailComposeViewController、TWTweetComposeViewController等)显示为模态视图。

但是在iOS 7中这些视图控制器不会出现(它们可以在iOS 5和iOS 6上运行)。

由我创建的视图控制器在iOS 7中出现(例如HogeViewController)。

我没有在viewDidLoadviewWillAppear中调用presentViewController:animated:completion

有人有什么想法吗?

控制台日志:

init错误域=NSCocoaErrorDomain代码=4097,“无法完成操作。(Cocoa错误4097。)”

或者

_serviceViewControllerReady:error: 错误域=NSCocoaErrorDomain代码=4097,“无法完成操作。(Cocoa错误4097。)”

或者

Unbalanced calls to begin/end appearance transitions for .

TWTweetComposeViewController(不出现)

TWTweetComposeViewController *viewController = [[TWTweetComposeViewController alloc]init];
viewController.completionHandler = ^(TWTweetComposeViewControllerResult result){
    NSLog(@"Result : %d",result);
};
[self presentViewController:viewController animated:YES completion:NULL];

日志

结果:0

MFMailComposeViewController(短暂出现并很快关闭)

- (void)send:(NSString*)email{
    if ([MFMailComposeViewController canSendMail]) {
        MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
        picker.mailComposeDelegate = self;

        NSArray *toRecipients = @[email];
        [picker setToRecipients:toRecipients];

        [picker setSubject:@"Subject"];
        [picker setMessageBody:@"Body" isHTML:NO];
        [self.navigationController presentViewController:picker animated:YES completion:NULL];
    }
}

- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error {
    [self dismissViewControllerAnimated:YES completion:^{
        NSLog(@"error:%@,result:%d",error.description,result);
    }];
}

记录

_serviceViewControllerReady:error: 错误域=NSCocoaErrorDomain,代码=4097,“操作无法完成。(Cocoa错误4097。)” 开始/结束出现转换调用不平衡 for . error:(null),result:0


你能否尝试在转换中设置animated:no? - Woodstock
关于TWTweetComposeViewController没有任何区别。 关于MFMailComposeViewController,它不会出现ViewController并且崩溃(EXC_BAD_ACCESS)。 - Yu Tamura
我遇到了完全相同的问题,但只在iPhone上出现。 iPad对我来说没有展示相同的问题。除非有其他消息,否则我认为这是一个iOS 7的错误。如果您在结束委托方法上设置断点,则邮件控制器的结果为MFMailComposeResultCancelled。 - Ryan
我们只在运行iOS 7.0.2(11A501)的iPhone 5s上看到这个问题。编译完全相同的代码并在iPhone 5上运行不会显示该问题。构建仅为32位,因此这不是我们应用程序中的64位问题。但是,在使用arm64编译我们的应用程序时,这些视图会正确显示。有人可以确认吗? - flo_muc
我在使用UIActivityViewController和SLComposeViewController时,在相同的情况下得到了相同的行为。 - Dima
显示剩余2条评论
10个回答

24

结果发现问题只在自定义UIBarButtons时出现。如果我们在运行于iPhone 5s上的32位应用程序中使用以下内容,则会出现问题:

[[UIBarButtonItem appearance] setTitlePositionAdjustment:UIOffsetMake(0, 1.0)
                                           forBarMetrics:UIBarMetricsDefault];
略过该行代码可以解决这个问题。我们已经提交了一份报告。

1
谢谢您的回复。我已经移除了 [[UITabBarItem appearance] setTitlePositionAdjustment:UIOffsetMake(0, -1)]; 并修复了这个问题! - Yu Tamura
1
我已经报告了这个问题,以及rdar://15165678。 - Alex Pretzlav
5
这太疯狂了,我为你在苹果的代码中发现漏洞而鼓掌。 - runmad
在QLPreviewController中也遇到了同样的问题。在低于7版本中自定义UIBarButtonItem的titlePosition可以解决我的问题。 - Ian Hoar
我在使用UISearchBar外观API时也有同样的经历。[searchBarApperance setPositionAdjustment:UIOffsetMake(100, 0) forSearchBarIcon:UISearchBarIconClear]; - Sonny Saluja
显示剩余2条评论

7

如果您在项目设置中没有为64位(arm64)编译,则会出现此问题。尽管对于某些人来说,这可能不是一个选项,因为目前Google Analytics不支持64位设备。


我在这里吃了之前的话;由于错误的构建设置,一旦修复后,就能够为64位构建,这个问题就解决了。点赞...;-) - wkhatch

3

您可以通过一些子类化方法避免这个问题。在我的情况下,我也遇到了相同的问题,罪魁祸首是:

[[UISearchBar appearance] setSearchTextPositionAdjustment:UIOffsetMake(15.0f, 0.0f)];

我已经在使用UISearchBar的子类,所以我将其更改为:

[[KA_SearchBar appearance] setSearchTextPositionAdjustment:UIOffsetMake(15.0f, 0.0f)];

这解决了我的问题。只在 iPhone 5s,iOS 7.0.3 上测试过。


雷达编号为 rdar://15461545。 - Sean Mahan

2
我在相同的情况下遇到了相同的行为。在我的情况下,这是由于使用UITableView的“setSeparatorInset”外观选择器引起的。去掉它可以解决问题。这看起来肯定是苹果端的一个错误,但至少有一个解决方法。 这个问题显示有人遇到了类似的问题,在他们的情况下,去掉UISearchBar外观选择器可以解决问题。因此,某些UIAppearance选择器存在问题。

1
这篇文章帮助我找到了类似问题的解决方案。但我的问题与选项卡栏无关,所以我想分享一下,如果其他人遇到这个问题:

当点击表格单元格时,邮件模态框会打开,但会立即关闭。在我的情况下,这段代码导致了问题:

[[UILabel appearanceWhenContainedIn:[UITableViewHeaderFooterView class], nil] setFont:[UIFont systemFontOfSize:17.0]];

我把它删除了,现在一切都正常!


0

这个问题发生在iPad air(64位)上,当应用程序没有编译为64位架构时。我遇到的问题是每个尝试使用UIOffsetMake / UIOffsetZero的UIAppearance选择器都无法正常工作! 例如

    [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(1.0, 1.0) forBarMetrics:UIBarMetricsDefault];

或者

    [[UITableViewCell appearance] setSeparatorInset:UIEdgeInsetsMake(0, 5, 0, 5)];

我认为这是苹果代码中的一个错误,我尝试了几个方法但都没有起作用。最好您可以注释掉在UIAppearance选择器中设置setInsets的地方。


0
在我的情况下,以下代码将在64位机器或模拟器上引起相同的问题。希望能帮助遇到这个问题的人。
if ([UITableViewCell instancesRespondToSelector:@selector(setSeparatorInset:)]) {
    [[UITableViewCell appearance] setSeparatorInset:UIEdgeInsetsZero];
}

0

当我使用64位模拟器或iPhone 5s时,使用SLComposeViewController分享到Facebook或Twitter时遇到了相同的错误,然后我删除了每一行使用"appearance"的代码,例如[UITableViewCell appearance]或[UIBarButtonItem appearance],然后一切都正常运行。


0

我将Xcode更新到了5.1版本,现在它可以正常工作了。


你能提供更多细节吗? - bjb568

0

NSXPCConnectionInterrupted = 4097。看起来这个错误是暂时的,建议您的代码重试该命令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接