0

アプリケーションにいくつかのポップオーバーがあり、どのポップオーバーが閉じられたかを判断するのが困難です。UIPopOvers に相当する「タグ」機能はありますか?

NSLogpopoverContorllerDidDismissPopover メソッドで popoverController を使用して、それぞれのメモリ参照を確認できますが、役に立ちません。

#pragma mark - Popover controller delegates
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
    NSLog(@"Popover dismised %@", popoverController);
}
4

3 に答える 3

1

ここからの抜粋:

私が質問を理解していれば、基本的にノーです - そしてそれは腹立たしいです。一方では、一度に 1 つのポップオーバーのみを表示する必要があると言われます。一方、そのポップオーバーへの参照を自動的に取得することはありません。したがって、ポップオーバーが表示された時点で、現在のポップオーバー コントローラへの参照を手動で格納するのはあなた次第です。したがって、ポップオーバー コントローラーの管理は非常に精巧でぎこちなくなります。システムがあなたに代わってやるべきことを、あなたはあらゆる種類の仕事をしているのです。

iOSはこのように面白いです。iOS 4 には、現在のファーストレスポンダーを知らせる呼び出しがないことを思い出しました。明らかに、システムはファーストレスポンダーが誰であるかを知っているのに、なぜ教えてくれないのでしょうか? それはちょっとばかげています。これは似ています。システムは、あなたと共有しない有用なものを明確に知っています。メートル。

于 2013-03-19T13:49:56.383 に答える
0

ポップオーバーを区別する方法はたくさんあります。それらのいくつかをリストします:

  1. あなたはについて尋ねていtagます。すべてのポップオーバーにはコンテンツビューコントローラーがあり、このコントローラーにはタグ付け可能なビューがあることに注意してください。ただし、ビューを区別するために魔法の整数タグを使用することは、一般的に議論の余地があります。

  2. ポップオーバーのタイプをコントローラーの変数/プロパティに保存します(例:enum。これが最も簡単な方法です。

  3. ポップオーバーに必要な情報を追加しますが、それについては賢くしてください。

@interface MyPopoverController : UIPopoverController 

@property (nonatomic, copy, readwrite) void (^dissmissHandler)(void);

@end

@implementation MyPopoverController 

- (id)initWithContentViewController:(UIViewController*)contentView {
   self = [super initWithContentViewController:contentView];

   if (!self) {
      return nil;
   }

   self.delegate = self;

   return self;
}

- (void)popoverControllerDidDismissPopover:(UIPopoverController*)popover {
    assert(popover == self);

    if (self.dissmissHandler) {
       self.dissmissHandler();
    }
}

@end

MyPopoverController* popover = [MyPopoverController alloc] initWithContentViewController:...];
popover.dissmissHandler = ^{
   ...
};

于 2013-03-19T14:09:28.803 に答える
0

@Anoop が述べたように、通常、一度に表示できるポップオーバーは 1 つだけです。

contentViewController考えられる解決策の 1 つは、ポップ オーバーでプロパティを確認することです。各View Controllerの参照を保存している場合、次のようなことができます:

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
    if ( popoverController.contentViewController == self.someUIViewController ) {
        // do stuff
    }
    else if ( popoverController.contentViewController == someoTherViewController ) {
       //
    }
    NSLog(@"Popover dismised %@", popoverController);
}

各コンテンツ ビュー コントローラーへの参照を格納できない場合 (または単に良い考えではない場合) は、いつでもその型を確認できます。

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
    if ( [popoverController.contentViewController isKindOfClass:[MyAwesomeViewController class]] ) {
        // do stuff
    }
    else if ( [popoverController.contentViewController isKindOfClass:[MyOtherViewController class]] ) {
        //
    }
    NSLog(@"Popover dismised %@", popoverController);
}

設計の観点からはおそらくより良い別の解決策として、ポップ オーバーに含まれるビュー コントローラーにデリゲートを渡すことが考えられます。詳細はこちら。このようにして、表示されたView ControllerはデータをメインのView Controllerに送り返すことができます。

于 2013-03-19T13:56:43.897 に答える