10

それぞれがいくつかのフィールドを含むフォームのコレクションを作成しています。一部のフィールドはUITextField、日付を表示する です。DatePickerTextFieldの子孫であるという新しいクラスを作成しましたUITextField。がタップされたときに、コントロールが に表示されるDatePickerTextFieldようにしたいと思います。UIDatePickerpopover

私の質問は、ストーリーボードを使用して実装するにはどうすればよいpopoverですか? シーンに特定の可視コントロールがある場合、セグエを実行できます。しかし、アクティブになるpopoverインスタンス化されたものにアタッチできるジェネリックをシーンで表現するにはどうすればよいでしょうか?DatePickerTextField

4

5 に答える 5

36

どのコントロールにも接続されていないセグエを作成できますが、コードからポップオーバーのアンカー ポイントを指定する方法はないと思います。別のオプションは、セグエに接続されていない ViewController を作成することです。ストーリーボードを編集するときは、ポップオーバーに配置される ViewController を作成し、それを選択してUtilities ペイン-> Attributes Inspectorに移動します。SizeFreeformに、Status BarNoneに設定し、コードから ViewController をインスタンス化するために使用される一意の識別子を指定します。ビューを選択し、[ユーティリティ] ペイン-> [サイズ インスペクター] に移動して、ViewController のサイズを変更できるようになりました。.

その後、コードからポップオーバーを作成できます:

- (IBAction)buttonPressed:(id)sender {
    UIView *anchor = sender;
    UIViewController *viewControllerForPopover = 
        [self.storyboard instantiateViewControllerWithIdentifier:@"yourIdentifier"];

    popover = [[UIPopoverController alloc] 
               initWithContentViewController:viewControllerForPopover];
    [popover presentPopoverFromRect:anchor.frame 
                             inView:anchor.superview 
           permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}

buttonPressed1 つの注意点は、クラスの ivar として popover への参照を保持する必要があることです。そうしないと、復帰後に UIPopoverController が解放され、割り当てが解除されるため、クラッシュします。

@interface MyViewController : UIViewController {
//  ...
    UIPopoverController *popover;
//  ...
}
于 2012-06-22T20:33:00.807 に答える
2

それで、私は同様の問題を抱えていました。他の人が恩恵を受ける可能性がある場合に備えて、私はstackoverflowから多くの恩恵を受けているので、それを共有すると考えました.

このソリューションを使用すると、カスタマイズ可能なポップオーバー セグエのアンカーを設定できます。また、セグエをモーダルにするかどうかを構成することもできます (外部コンテキストを薄暗くすることでセグエを防ぐ方法が見つからなかったので、誰かがその方法を知っていれば、聞いてみたいと思います)。これは、ポップオーバー コントローラーのパススルー ビューを設定することによって実現されます。また、ソース ビュー コントローラーのビューではなく、カスタム ビューを指定するための容量も追加しました (この容量が必要だったため)。この部分はソリューションにとって重要ではありません。

DynamicPopoverSegue.h

@interface DynamicPopoverSegue : UIStoryboardPopoverSegue

@property BOOL isModal;
@property UIView* sourceView;
@property CGRect anchor;

@end

DynamicPopoverSegue.m

@implementation DynamicPopoverSegue

- (void)perform
{
   if (!self.popoverController.popoverVisible)
   {
      UIViewController* dst = (UIViewController*)self.destinationViewController;
      UIViewController* src = (UIViewController*)self.sourceViewController;

      UIView* inView =  _sourceView ? _sourceView : src.view;

      self.popoverController.contentViewController = dst;
      if (!_isModal)
      {
         [self.popoverController setPassthroughViews:[[NSArray alloc] initWithObjects:inView, nil]];
      }
      [self.popoverController presentPopoverFromRect:_anchor
                                              inView:inView
                            permittedArrowDirections:UIPopoverArrowDirectionAny
                                            animated:YES];
   }
}

@end

次に、ストーリーボードでセグエを「カスタム」に設定し、セグエ クラスを「DynamicPopoverSegue」に設定します。私の場合、ビュー内の動的レイヤーに関連付けたかったため、アンカーを設定できなかったため、ビューコントローラーの下のバーにあるビューコントローラーアイコンからビューコントローラーへのコントロールクリックでセグエを作成しましたpopupover を表示するために使用します。

ポップオーバー セグエを呼び出すには:

[self performSegueWithIdentifier:@"MyPopoverSegue" sender:self];

ポップオーバー セグエを設定するには:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
   if ([[segue identifier] isEqualToString:@"MyPopoverSegue"])
   {
      DynamicPopoverSegue* popoverSegue = (DynamicPopoverSegue*)segue;
      // set the anchor to wherever you want it to be
      popoverSegue.anchor = _destinationFrame;
   }
}
于 2014-09-04T16:27:31.633 に答える
0

私のSWIFTプロジェクトにJonnywhoからの回答を使用しました。必要な場合:

SWIFTバージョンは次のとおりです。

    let anchor: UIView = sender
    var viewControllerForPopover = self.storyboard?.instantiateViewControllerWithIdentifier("GameAboutViewController") as! UIViewController?


    let popover = UIPopoverController(contentViewController: viewControllerForPopover!)
    popover.presentPopoverFromRect(anchor.frame, inView: anchor, permittedArrowDirections: UIPopoverArrowDirection.Any, animated: true)
于 2015-07-25T15:47:10.520 に答える
0
- (IBAction)pressItemChooseOprateRoom:(id)sender {
    if (isPad){
        // UIView *anchor = sender;
        UIViewController *viewControllerForPopover =
        [self.storyboard instantiateViewControllerWithIdentifier:@"OperateRoomList"];

        _myPopover = [[UIPopoverController alloc]
                      initWithContentViewController:viewControllerForPopover];

        CGRect rc=[self getBarItemRc:sender];
        [_myPopover presentPopoverFromRect:rc
                                    inView:self.view
                  permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

        [MLControl shared].popover =self;
        // [self perfformSegueWithIdentifier:SEGUE_POP_OPERATEROOM sender:self];
    }else{
        [self iphoneOpenOperateRoomList];
        /* [self performSegueWithIdentifier:@"iPhonePushOperateRoom" sender:self];
         */
    }
}

-(void)iphoneOpenOperateRoomList{
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"OperateRoomList"];
    //        if (!index.showTabBar) {
    //            vc.hidesBottomBarWhenPushed = YES;
    //        }

    [self.navigationController pushViewController:vc animated:YES];
}
于 2015-01-13T07:28:07.090 に答える