Как я могу подключить к методу действия для кнопки панели инструментов Popover iPad?

StackOverflow https://stackoverflow.com/questions/2588425

Вопрос

Я использую шаблон 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top