Как я могу подключить к методу действия для кнопки панели инструментов Popover iPad?
-
24-09-2019 - |
Вопрос
Я использую шаблон Split View для создания простого разделенного представления, который, конечно, имеет попуклад в портретном режиме. Я использую код по умолчанию, сгенерированный шаблоном, который добавляет / удаляет элемент панели инструментов и устанавливает контроллер POPOVER и удаляет его. Эти два метода составляют VishViewController: WillShowviewController: ... и SplitViewController: WillHideViewController: ...
Я пытаюсь выяснить, как заставить топоверку исчезнуть, если пользователь нажал на кнопку панели инструментов, пока отображается POPOVER. Вы можете заставить крышку исчезнуть, не выбирая элемент, если вы нажмете в любом месте в любом месте за пределами POPOVER, но я также хотел бы заставить его исчезнуть, если пользователь снова нажал кнопку.
Там, где я застрял это: там, кажется, не очевидно, простой способ подключить к действию для кнопки панели инструментов. Я могу сказать, используя отладчик, что действие, которое называется кнопкой, является ShowMasterInPopover. И я новичок, чтобы работать с селекторами программно, я признаю.
Могу ли я как-то написать действие и установить его на элемент панели инструментов, не переопределяя действие, которое уже там? Например, добавьте действие, которое называет тот, который там там? Или я должен был бы написать действие, которое показывает / скрывает лаповертую (поведение, которое делается за кулисами, предположительно, контроллером разделения просмотра сейчас ???).
Или я упускаю простой способ добавить это поведение к этой кнопке, не изменив существующее поведение, которое устанавливается для меня?
Спасибо!
Решение
Итак, оказывается, что вы можете уволить запасы при нажатии на Barbuttonitem, реализуя метод SplitViewController WillpresentviewController следующим образом:
- (void) splitViewController:(UISplitViewController *)svc
popoverController: (UIPopoverController *)pc
willPresentViewController: (UIViewController *)aViewController
{
if (pc != nil) {
[pc dismissPopoverAnimated:YES];
}
}
Другие советы
Итак, Барбутенитем будет иметь UISPLITViewController как цель и ShowMasterInPopover: как действие. Я не могу найти его в документации, поэтому я немного волнуюсь, это не в порядке, чтобы называть это, но я получил его на работу, изменив цель на себя (контроллер представления) и действие на пользовательский метод, как это:
- (void)showMasterInPopover:(id)sender {
// ...insert custom stuff here...
[splitViewController showMasterInPopover:sender];
}
У вас нет репутации, чтобы сделать реальный комментарий. :-(
@Jann - я уверен, что Элизабет хочет сделать, это довольно стандартно. Например, приложение Notes, которое поставляется предварительно загруженным на iPad, закрывает и открывает popover при нажатии кнопки панели инструментов в верхнем левом углу.
Ниже приведен мое решение. Начинается подобно решению решений Grenisus, подключая UISplitViewController
Обработчик кнопки панели инструментов. Я использую флаг в моем контроллере для отслеживания того, открыт ли пление или нет. Наконец, чтобы справиться с случаем, когда пользователь открывает запасы, затем закрывает его, нажав за пределы POPOVER, я реализую UIPopoverControllerDelegate
протокол.
Во-первых, интерфейс контроллера:
@interface LaunchScene : NSObject <UISplitViewControllerDelegate, UIPopoverControllerDelegate>
{
UISplitViewController* _splitViewController; //Shows list UITableView on the left, and details on the right
UIToolbar* _toolbar; //Toolbar for the button that will show the popover, when in portrait orientation
SEL _svcAction; //The action from the toolbar
id _svcTarget; //The target object from the toolbar
UIPopoverController* _popover; //The popover that might need to be dismissed
BOOL _popoverShowing; //Whether the popover is currently showing or not
}
-(void) svcToolbarClicked: (id)sender;
Я использую _svcaction и _svcccctarget для привязки Grenisus «беспокоит, что он не может звонить правильному функции.
Ниже приведена моя реализация. Для краткости я пропустил код, который создает экземпляр UISPLITVIVECONTROLLER и SOUPViews. Все, что показан код, связанный с Show / Hide.
//the master view controller will be hidden so hook the popover
- (void)splitViewController:(UISplitViewController*)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem*)barButtonItem forPopoverController:(UIPopoverController*)pc
{
_popoverShowing = FALSE;
if(_toolbar == nil)
{
//set title of master button
barButtonItem.title = @"Title goes here";
//Impose my selector in between the SVController, and the SVController's default implementation
_svcTarget = barButtonItem.target;
_svcAction = barButtonItem.action;
barButtonItem.target = self;
barButtonItem.action = @selector(svcToolbarClicked:);
//create a toolbar
_toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 1024, 44)];
[_toolbar setItems:[NSArray arrayWithObject:barButtonItem] animated:YES];
}
//add the toolbar to the details view (the second controller in the splitViewControllers array)
UIViewController* temp = [_splitViewController.viewControllers objectAtIndex:1];
[temp.view addSubview:_toolbar];
}
Вот моя функция, которая отвечает на панель инструментов нажмите. Это обрабатывает так, чтобы пользовательские нажатия и переключатели кнопки панели инструментов.
-(void) svcToolbarClicked: (id)sender
{
if(_popoverShowing)
{
[_popover dismissPopoverAnimated:TRUE];
}
else
{
//Perform the default SVController implementation
[_svcTarget performSelector:_svcAction];
}
//Toggle the flag
_popoverShowing = !_popoverShowing;
}
Некоторые функции от uisplitviewcontrollerDelegate
//the master view (non-popover) will be shown again (meaning it is going to landscape orientation)
- (void)splitViewController:(UISplitViewController*)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)button
{
//remove the toolbar
[_toolbar removeFromSuperview];
}
// the master view controller will be displayed in a popover (i.e. the button has been pressed, and the popover is about to be displayed.
//Unfortunately triggers when the popover is ALREADY displayed.
- (void)splitViewController:(UISplitViewController*)svc popoverController:(UIPopoverController*)pc willPresentViewController:(UIViewController *)aViewController
{
_popover = pc; //Grab the popover object
_popover.delegate = self;
}
Приведенный выше код достаточно для большинства случаев. Однако, если пользователь открывает запасы, то уводит, нажав в другое место на экране, _popoverShowing
Boolean будет содержать неверное значение, которое заставит пользователю использовать кнопку панели инструментов дважды, чтобы повторно открыть запасы. Чтобы исправить это, реализуйте UIPopoverControllerDelegate
Метод, как фрагмент ниже.
//UIPopoverControllerDelegate method
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
_popoverShowing = FALSE;
_popover = nil;
}
Это вообще взяло меня навсегда, чтобы выяснить, копая документы и (я думаю) большинство вопросов UISPLITVIVEWViewController на StackoverFlow. Я надеюсь, что кто-то найдет это полезным. Если это так, я желаю точек репутации. ;-)
Может быть, вы все просто усложняете его слишком много или я прочитал что-то совсем другое, чем вы, ребята, хотели сделать ... Но, возможно, это то, что вы все пытались понять, что
-(void)togglePopOverController {
if ([popOverController isPopoverVisible]) {
[popOverController dismissPopoverAnimated:YES];
} else {
[popOverController presentPopoverFromBarButtonItem:bbiOpenPopOver permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
}
Элизабет пишет:
Вы можете заставить крышку исчезнуть, не выбирая элемент, если вы нажмете в любом месте в любом месте за пределами POPOVER, но я также хотел бы заставить его исчезнуть, если пользователь снова нажал кнопку.
Прежде всего, позвольте мне сказать, что никто из того, что я собираюсь сказать, должен быть принят лично - это не значит так. Все это происходит от лет разработки интерфейсов программирования и изучает руководящие принципы человеческого интерфейса Apple (а также имея графический дизайнер, который является постоянно пытающийся Чтобы научить меня правильному способу делать вещи). Это подразумевается как противоположная точка зрения, а не как разглагольство.
То, что вы предлагаете, это проблема UI-WISE для меня, и будет проблемой, которая вызывает проблемы, когда Apple отзывы приложение. Вы никогда не должны иметь известное ui-объект выполнить функцию, которую она не выполняет нормально (например, кнопка: кнопка никогда выставка а потом Выпускает вид / объект / окно. Переключает это сделать).
Например, увеличительное стекло на Navbar означает поиск (как определено Apple). Они имеют в прошлом и будут продолжаться в будущем, отказываются от приложений, которые используют это для увеличения интерфейса. Например: Apple отклоняет конверто или Одиссея: след слез (Найдите на страницу для нее). Язык в отклонении всегда одинаково (смелая маркировка того, что они будут ссылаться на ваше использование):
«... использует стандартные изображения экрана iPhone / iPod нестандартным способом, потенциально в результате путаницы пользователя. Изменение поведения стандартной графики iPhone, Действия, И имитации или моделирующие сбои этой графики, действий или изображений являются нарушением программного соглашения о разработке iPhone, которое требует приложений для соблюдения руководящих принципов человеческого интерфейса ».
Кроме того, если вы действительно хотите эту функцию, спросите себя: «Почему?». Если это потому, что вы, сами, как это, то я бы действительно пропустил его. Большинство пользователей будут путать такого поведения и на самом деле не использовали его, потому что Они не знали бы, что это была возможность использовать. Отказ Apple провела последние 3 года подготовки пользователей iPhoneOS, как использовать их ОС и элементы интерфейса. Последнее, что вы, как программист или дизайнер, хотите сделать, это провести время, пытаясь тренировать пользователя о том, как использовать свое приложение. Как правило, они будут удалять ваше приложение с их устройства и переместиться в другое подобное приложение вместо того, чтобы заставлять себя учиться твой способ делать вещи.
Только мой $ 0,02