Как использовать раскадровку, чтобы сделать поповер, который можно использовать в коде?

Я создаю коллекцию форм, каждая из которых содержит несколько полей. Некоторые поляUITextFieldы, которые будут отображать дату. Я создал новый класс под названиемDatePickerTextFieldпотомокUITextField, КогдаDatePickerTextField прослушивается, я хотел бы дляUIDatePicker контроль, чтобы появиться вpopover.

У меня вопрос, как я могу использовать раскадровку для реализацииpopover? Я могу сделать переход, когда есть определенный, видимый элемент управления в сцене. Но как я представляю общийpopover в сцене, которую я могу прикрепить к любому экземпляруDatePickerTextField что становится активным?

Ответы на вопрос(5)

Добавьте UIView в док сцены.

Вы можете добавить его как подпредставление к любому существующему представлению на контроллере представления.

Затем вы можете переключать его свойство isHidden по своему усмотрению.

Вы можете добавить несколько таких подпредставлений и создать множество таких всплывающих окон.

Этот метод избавит вас от настройки нового View Controller и использования сегментов.

Только что использовал ответ от Джонни, для моего проекта SWIFT. Если вам это нужно:

Вот 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)
Решение Вопроса

Вы можете создать segue, который не связан ни с одним элементом управления, но я не думаю, что был бы способ указать точку привязки для popover из кода. Другим вариантом является создание ViewController, который не связан ни с каким переходом. При редактировании раскадровки создайте ViewController, который будет помещен в popover, выберите его и перейдите кUtilities pane- & GT;Attributes Inspector, ЗадаватьSize вFreeform, Status Bar вNoneукажите уникальныйIdentifier это будет использоваться для создания экземпляра ViewController из кода. Теперь вы можете изменить размер ViewController, выбрав его View и перейдя кUtilities pane- & GT;Size Inspector.

После этого вы можете создать поповер из кода:

- (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];
}

Одним из предостережений является то, что вам нужно хранить ссылку на popover как ivar вашего класса, в противном случае он будет аварийно завершать работу, потому что UIPopoverController будет освобожден и освобожден послеbuttonPressed возвращает:

@interface MyViewController : UIViewController {
//  ...
    UIPopoverController *popover;
//  ...
}
 David U22 июн. 2012 г., 22:48
Благодарю. Именно то, что мне нужно. Я собираюсь попробовать вашу первую идею, чтобы увидеть, становится ли отправитель вызова executeSegueWithIdentifier якорем. Если это не сработает, я перейду ко второй идее.

Таким образом, у меня была похожая проблема, и в случае, если другие могли бы извлечь выгоду, я решил, что поделюсь ею, так как я очень выигрываю от stackoverflow.

Это решение позволяет вам установить привязку настраиваемого перехода popover. Это также позволяет вам сконфигурировать переход, чтобы он был модальным или нет (я не мог найти способ предотвратить переход путем затемнения внешнего контекста, поэтому, если кто-то знает, как это сделать, мне было бы интересно услышать его); это достигается установкой сквозных видов для контроллера поповера. Я также добавил возможность указывать пользовательское представление, а не представление исходного viewcontroller (так как мне требовалась эта возможность); эта часть не критична для решения.

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

Затем вы просто устанавливаете для своего перехода значение & quot; Custom & quot; в раскадровке и установите для класса segue значение «DynamicPopoverSegue». В моем случае, так как я хотел связать его с динамическими слоями в представлении, я не мог установить привязку, поэтому я создал переход, щелкнув по значку контроллера представления на панели под моим контроллером представления в контроллере представления, которым я был используя, чтобы представить всплывающее окно.

Чтобы позвонить Sever Segue:

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

И настроить поповер segue:

- (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;
   }
}
 12 нояб. 2014 г., 17:16
Это не сработало для меня: когда показывается поповер, прикосновение за его пределами не закрывает его, как должно
- (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];
}

Ваш ответ на вопрос