【问题标题】:MFMailComposeViewController modal view just before segue prevents segueMFMailComposeViewController 模态视图就在 segue 阻止 segue 之前
【发布时间】:2013-01-20 01:17:44
【问题描述】:

我正在使用我忍受的模态视图中的按钮单击:

UIAlertView *   alert =
    [[UIAlertView alloc] initWithTitle: title
                               message: reason
                              delegate: self
                     cancelButtonTitle: @"New"
                     otherButtonTitles: @"View", nil];
    [alert show];

当点击下面的“clickedButtonAtIndex”方法中的“查看”按钮时,我调用了“[self performSegueWithIdentifier:@"ModalSaleDetail1" sender:self];"

- (void) alertView: (UIAlertView *) alertView clickedButtonAtIndex: (NSInteger) buttonIndex
{
    if ([alertView.title isEqualToString: @"Successful"]) {
        switch (buttonIndex) {
            case 0:     //  New transaction
            {
                if ([self.currentSale.lastStatus isEqualToString:@"approved"]) {
                    [self displayComposerSheet];
                }
                [self clearTransaction:nil];
                break;
            }
            case 1:     //  View Transaction Details
            {
                NSLog(@"User wants to view transaction details.");
                self.currentSale.cardNumber = self.currentSale.cardNumber.bulletRedacted;
                self.cardNumberField.text = self.displayCardNumberView.text = self.currentSale.cardNumber;

                if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {  // device is iPad
                    self.tabBarController.selectedViewController = [self.tabBarController.viewControllers objectAtIndex:1];
                    UISplitViewController *splitVC = (UISplitViewController *)(self.tabBarController.selectedViewController);
                    UINavigationController *navC = [[splitVC viewControllers] lastObject];
                    APSaleDetailViewController *salesDVC = (APSaleDetailViewController *)navC.topViewController;
                    // If came here from new sale set to self.currentSale, otherwise do not
                    if (!salesDVC.currentSale) {
                        salesDVC.currentSale = self.currentSale;
                    }
                    salesDVC.apNewTVC = self;
                    if ([self.currentSale.lastStatus isEqualToString:@"approved"]) {
                        [self displayComposerSheet];
                    }
                } else {                                                                        // device is iPhone
                    if ([self.currentSale.lastStatus isEqualToString:@"approved"]) {
                        [self displayComposerSheet];
                    }
                    [self performSegueWithIdentifier:@"ModalSaleDetail1" sender:self];
                }
                break;
            }
            default:
            {
                NSAssert1(NO, @"Unknown alert button %d", buttonIndex);
            }
        }
    } else if .....

在我使用 MFMailComposeViewController 实现我的电子邮件发件人之前,这个 segue 运行良好。

我使用以下代码显示 MFMailComposeViewController 的模式视图:

// Displays an email composition interface. Populates all the Mail fields.
-(void)displayComposerSheet
{
    MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
    picker.mailComposeDelegate = self;

    [picker setSubject:@"Receipt for credit card transaction"];

    // Set up recipients
    NSArray *toRecipients = [NSArray arrayWithObject:self.currentSale.emailAddress];

    [picker setToRecipients:toRecipients];

    UIGraphicsBeginImageContext(self.view.frame.size);
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage * image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    NSData * imageData = UIImageJPEGRepresentation(image, 1.0);

    if ( [MFMailComposeViewController canSendMail] ) {
        NSString *emailBody = @"Your credit card transaction summary and signature:";
        [picker setMessageBody:emailBody isHTML:NO];
        [picker addAttachmentData:imageData mimeType:@"image/jpeg" fileName:@"attachment"];
        NSData *myData = UIImagePNGRepresentation(self.signatureImage);
        [picker addAttachmentData:myData mimeType:@"image/png" fileName:@"Autograph"];
        [self presentModalViewController:picker animated:YES];
    }
}

现在,当 [self performSegueWithIdentifier:@"ModalSaleDetail1" sender:self] 在调用 [self displayComposerSheet] 后被调用时,不会发生任何转场。电子邮件编写器表正确显示,但在我发送或取消它后,segue 不会发生。如果我注释掉对 [self displayComposerSheet] 的调用,segue 就会发生(但当然没有电子邮件)。

顺便说一下,iPad 代码可以很好地与 [self displayComposerSheet] 调用配合使用,因为它不使用 segue。

在呈现模态对话框后立即执行转场是否正常工作?

我正在为 iOS 6.1 构建 Xcode 4.6 并部署到 iOS 5.1。我的 iPhone 运行 5.1.1,我的 iPad 运行 6.1。

【问题讨论】:

    标签: iphone ios modalviewcontroller segue


    【解决方案1】:
    • (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender NS_AVAILABLE_IOS(5_0);

    你看,这个界面在 iOS 5 中不可用

    【讨论】:

    • 其实是“iOS 5.0及以后版本可用”。请注意,我说过如果我删除对 [self displayComposerSheet] 的调用,则执行 segue 没有问题。上面的符号 NS_AVAILABLE_IOS(5_0) 表示它在 5.0 中可用。不过还是谢谢。
    • 这里还有其他人有想法吗?
    【解决方案2】:

    我知道,这并不能解决您使用 Segues 的问题,但如果您想回到以前的 View Controller,试试这个:

    [self dismissViewControllerAnimated:YES completion:nil];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-08
      • 2012-04-23
      • 1970-01-01
      • 2012-01-20
      • 2017-05-13
      相关资源
      最近更新 更多