0

これはトリッキーです。pop/push および present/dismiss メソッドをオーバーライドする UINavigationController のサブクラスがあります。ここでは、UINavigationController サブクラスがポップオーバーに含まれている場合に正しいサイズを設定するように動作をカスタマイズします。派手なことは何もありませんが、すべての ViewController のサブクラスを作成せずに Autolayout を使用するために、このようにしています。

ただし、presentViewController:animated:completion:andの完了ブロックは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 に報告してください (私も同じことをしようとしています)。私は自分で同じバグを発見したので、ここにたどり着きました.Google検索を行って、他の誰かがそれについて話しているかどうかを確認しました.

アーキテクチャが次のような非常に小さなデモ プロジェクトを作成しました。

  • ViewController - メインのビュー コントローラー

    そのビューには、Tap Me というボタンが含まれています。

  • PopoverViewController - ポップオーバーで表示

    メインの ViewController で [Tap Me] をタップすると、このvc、PopoverViewController をコンテンツ ビュー コントローラーとして持つ UIPopoverController が作成されます。そのビューにもボタン 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");
}

ログには「View Controller を提示しようとしています」と「View Controller を提示しました」と表示されますが、「モーダル」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 に答える