0

私は我慢したモーダルビューからボタンクリックを使用しています:

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

下のストーリーボード付きの iPhone の「clickedButtonAtIndex」メソッドで「View」ボタンをクリックするときに、「[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 を使用して電子メール送信者を実装する前は問題なく機能していました。

次のコードを使用して、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] を呼び出した後に呼び出されると、セグエは発生しません。メール コンポーザー シートは正常に表示されますが、送信またはキャンセルした後、セグエが発生しません。[self displayComposerSheet] への呼び出しをコメントアウトすると、セグエが正常に行われます (ただし、もちろんメールはありません)。

ちなみに、iPad のコードは [self displayComposerSheet] 呼び出しで問題なく動作します。これは、セグエを使用していないためです。

モーダル ダイアログを表示した直後にセグエを実行すると、一般的に機能しますか?

私は iOS 6.1 用の Xcode 4.6 でビルドし、iOS 5.1 にデプロイしています。私の iPhone は 5.1.1 で、iPad は 6.1 です。

4

2 に答える 2

0
  • (void)performSegueWithIdentifier:(NSString *)識別子送信者:(id)送信者 NS_AVAILABLE_IOS(5_0);

ご覧のとおり、このインターフェイスは iOS 5 では使用できません

于 2013-02-05T07:35:15.840 に答える
0

これで Segues の問題が解決されないことはわかっていますが、以前の View Controller に戻ろうとしている場合は、次のようにしてください。

[self dismissViewControllerAnimated:YES completion:nil];
于 2014-03-22T14:14:56.813 に答える