кнопка создания для якоря представления popover во время выполнения - PullRequest
20 голосов
/ 17 октября 2011

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

У меня есть приложение, которое я портирую с 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, поэтому я настроил начальный вид с помощью панели навигации и кнопки всплывающего окна, как в шаблоне приложения Utility.Но сейчас я застрял.Я не могу понять, как создать эту всплывающую кнопку во время выполнения и заставить ее правильно перейти к представлению popOver.Я могу добавить кнопку следующим образом:

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

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

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

Есть идеи?

Ответы [ 4 ]

13 голосов
/ 22 мая 2012

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

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

enter image description here

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

3 голосов
/ 16 января 2012

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

3 голосов
/ 30 декабря 2011

Мне тоже было любопытно, поэтому я сделал быстрый тестовый проект.Вы правы, кажется, нет способа настроить переход поповера во время выполнения или добавить точку привязки к кнопке, которая не находится в иерархии представлений, с помощью 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.

2 голосов
/ 11 января 2012

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

presentPopover:(UIButton *)sender;

Затем в методе presentPopover произнесите:

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

Так я бы обработал ваш вариант использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...