Подтвердить что ты не робот

Кнопка создания для якоря с открытым окном во время выполнения

Это может быть невозможно, но я надеюсь, что у кого-то появится идея, как это сделать.

У меня есть приложение, которое я переношу с iPhone только на Universal. На iPhone я использую приложение с вкладками. Я использую три вкладки для отображения нормальных данных. У меня есть четвертая вкладка, которая отображается только при выполнении определенных условий. Чтобы добавить вкладку, выполните следующие действия:

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) 
{
    UITabBarController *tabController = (UITabBarController *) self.rootViewController;
    NSMutableArray* newArray = [NSMutableArray arrayWithArray: tabController.viewControllers];
    [newArray addObject: [theStoryboard instantiateViewControllerWithIdentifier: @"AdditionalView-Phone"]];
    [tabController setViewControllers:newArray animated:YES];
}

Для iPad у меня достаточно места на начальном представлении, чтобы отображать все, начиная с основных трех вкладок в интерфейсе iPhone. Поэтому мне нужно только одно (небольшое) представление для дополнительных данных. Я хотел сделать это, используя представление popOver, поэтому я установил начальное представление с помощью панели Nav и кнопки Popover, как в шаблоне Utility App. Но теперь я застрял. Я не могу понять, как создать эту кнопку popover во время выполнения и сделать так, чтобы segue отображался в popOver. Я могу добавить такую ​​кнопку:

UIBarButtonItem *flipButton = [[UIBarButtonItem alloc] initWithTitle: @"Modem" style: UIBarButtonItemStylePlain target: self action: @selector(togglePopover:)];
self.navBar.topItem.rightBarButtonItem = flipButton;

но я получаю исключение: "NSInternalInconsistencyException", причина: "UIStoryboardPopoverSegue должен быть представлен из элемента кнопки панели или вида". Я уверен, что это потому, что у меня нет набора привязок для popOver segue. Кнопка не существует в раскадровке, поэтому я не могу ее установить. И я не могу найти API, чтобы установить его во время выполнения.

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

Любые идеи?

4b9b3361

Ответ 1

У меня была такая же проблема, и я решил ее создать с помощью UIBarButtonItem в Storyboard для контроллера вида, но не являюсь частью иерархии представлений.

В IB перетащите элемент панели на темную панель под представлением диспетчера просмотра, отбросьте его рядом с значками "Первый ответчик" и "Просмотр контроллера". Создайте (сильный) IBOutlet для него. Затем создайте отступ от него к контроллеру представления назначения, перетащив его из пункта кнопки панели в пункт назначения. Кажется, это единственный способ установить его как якорь. Выбор его как якоря для существующего segue не работает (выглядит как ошибка IB).

enter image description here

В viewDidLoad вы можете назначить этот элемент панели кнопок на navigationItem (или там, где вам нравится), и segue работает как ожидалось.

Ответ 2

Мне тоже было интересно, поэтому я сделал быстрый тестовый проект. Вы правы, не существует способа настроить popover segue во время выполнения или добавить точку привязки к кнопке, которая не находится в иерархии представлений с помощью Interface Builder.

Моим решением было установить все в IB с помощью UIBarButtonItem, видимого и связанного с свойством IBOutlet, а затем удалить его из панели навигации в -viewDidLoad:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.navigationItem.rightBarButtonItem = nil;
}

Затем я просто добавляю его или удаляю, нажимая еще одну кнопку:

- (IBAction)toggleBarButtonItem:(id)sender
{
    UIBarButtonItem *item = (self.navigationItem.rightBarButtonItem == nil) ?  self.popoverBarButtonItem : nil;
    [self.navigationItem setRightBarButtonItem:item animated:YES];
}

Вы можете условно сохранить или удалить кнопку в -viewDidLoad тем же способом. Сегмент остается привязанным к UIBarButtonItem.

Ответ 3

Я попытаюсь сделать фиктивное представление о том, что размер и форма представлений, из которых я хочу представить popover, прокрутите его до целевой цели segue, а затем переместите представление в нужное положение в prepareForSegue:sender:

Ответ 4

Я не уверен, что это именно то, что вы хотите, но это то, что я буду делать. Создайте кнопку и настройте ее с помощью какой-либо цели/действия. Вызвать этот метод цели/действия

presentPopover:(UIButton *)sender;

Затем в методе currentPopover скажите

UIViewController *customAdditionalViewController = [[MySpecialVC alloc] init];
//Configure the customAdditionalViewController
//Present the customAdditionalViewController in a Popover
UIPopoverController *popover = [[UIPopoverController alloc] initWithViewController:customAdditionalViewController];
//Set popover configurations
[popover presentPopoverFromRect:sender.frame inView:self.view permittedArrowDirections:/*whatever you want*/ animated:YES];

Вот как я буду обрабатывать ваш прецедент.