我正在使用分割视图模板创建一个简单的分割视图,当然,它在纵向模式下有一个弹出窗口。我正在使用模板生成的默认代码,该代码添加/删除工具栏项目并设置弹出窗口控制器并将其删除。这两个方法是 splitViewController:willShowViewController:...和 splitViewController:willHideViewController:...

我试图弄清楚如果用户在显示弹出窗口时点击工具栏按钮,如何使弹出窗口消失。如果您点击弹出窗口之外的任何位置,您可以使弹出窗口消失而无需选择项目,但我也希望在用户再次点击按钮时使其消失。

我被困的地方是这样的:似乎没有一种明显、简单的方法来挂钩工具栏按钮的操作。我可以使用调试器得知在按钮上调用的操作是 showMasterInPopover。我承认,我对以编程方式使用选择器还很陌生。

我可以以某种方式编写一个操作并将其设置在工具栏项上,而不覆盖已经存在的操作吗?例如添加一个调用现有操作的操作?或者我是否必须自己编写一个显示/隐藏弹出窗口的操作(现在大概由分割视图控制器在幕后完成的行为???)。

或者我是否缺少一种简单的方法来将此行为添加到此按钮而不更改为我设置的现有行为?

谢谢你!

有帮助吗?

解决方案

因此,原来,你可以做酥料饼通过实现SplitViewController willPresentViewController方法对barButtonItem当点击如下解雇:

- (void) splitViewController:(UISplitViewController *)svc 
           popoverController: (UIPopoverController *)pc
   willPresentViewController: (UIViewController *)aViewController
{
    if (pc != nil) {
        [pc dismissPopoverAnimated:YES];
    }
}

其他提示

因此,barButtonItem将具有UISplitViewController作为目标和showMasterInPopover:作为动作。我找不到它的文档中,所以我有点担心这是不是可以调用它,而是通过改变目标自我(视图控制器)和动作的自定义方法,我把它给了喜欢的工作这样:

- (void)showMasterInPopover:(id)sender {
    // ...insert custom stuff here...
    [splitViewController showMasterInPopover:sender];
}

没有代表做出实时评论。 : - (

@Jann - 我敢肯定什么伊丽莎白想要做的是非常标准。例如,记事本应用程序附带预先加载在iPad关闭和打开的酥料饼当按在左角顶部的工具栏按钮。

下面是我的溶液。它开始了类似greenisus的解决方案,通过挂钩UISplitViewController的工具栏按钮的事件处理程序。我用一个标志在我的控制器来追踪酥料饼是打开还是不行。最后,为了处理这种情况,用户打开酥料饼的情况下,然后通过单击酥料饼的外面关闭它,我实现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和_svcTarget到addess greenisus的忧虑,他可能不会被调用正确的函数。

下面是我的实现。 为简单起见,我已经省略了实例化UISplitViewController和子视图的代码。所有的显示/隐藏相关的代码被示出。

//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布尔将包含一个不正确的值,这将迫使用户点击工具栏按钮两次,再打开酥料饼。为了解决这个问题,实现UIPopoverControllerDelegate方法,如下面的代码段。

//UIPopoverControllerDelegate method
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
    _popoverShowing = FALSE;
    _popover = nil;
}

这花了我永远搞清楚,通过文档挖掘,(我认为)大部分在计算器上的UISplitViewController问题。我希望有人发现它有用。如果是这样,我贪图名声点。 ; - )

也许你都只是它过于复杂,或者我所读过的东西非常不同的比你们想做的事......但也许,这就是你都试图找出这样hardish什么:

-(void)togglePopOverController {

if ([popOverController isPopoverVisible]) {

[popOverController dismissPopoverAnimated:YES];

} else {

[popOverController presentPopoverFromBarButtonItem:bbiOpenPopOver permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

}

}

伊丽莎白写道:

如果您点击弹出窗口之外的任何位置,您可以使弹出窗口消失而无需选择项目,但我也希望在用户再次点击按钮时使其消失。

首先,我要声明的是,我接下来所说的一切都不是针对个人的——事实并非如此。这一切都来自于多年的编程界面设计和苹果人机界面指南的研究(以及拥有一位不断改进的平面设计师) 教我正确的做事方式)。它的意思是反对观点,而不是咆哮。

你所建议的对我来说是一个 UI 方面的问题,并且当苹果审查该应用程序时,这将是一个导致麻烦的问题。你永远不应该让一个已知的 UI 对象执行它不能正常执行的功能(例如:一个按钮 绝不 节目 进而 释放视图/对象/窗口。切换执行此操作)。

例如,导航栏上的放大镜表示搜索(由 Apple 定义)。他们过去并且将来会继续拒绝使用此功能来缩放界面的应用程序。例如: 苹果拒绝 ConvertBot 或者 奥德赛:一行泪 (在页面中搜索)。拒绝中的语言始终相同(粗体标记他们将引用的内容供您使用):

“......以非标准方式使用标准 iPhone/iPod 屏幕图像,可能会导致用户混淆。改变标准 iPhone 图形的行为, 行动, 、图像,或模拟这些图形、动作或图像的失败,都违反了 iPhone 开发者计划协议,该协议要求应用程序遵守人机界面指南。”

另外,如果您真的想要此功能,请问问自己:“为什么?”。如果是因为你自己喜欢,那我真的会跳过它。大多数用户会对这种行为感到困惑,并且不会真正使用它,因为 他们不会知道这是一个使用的选项. 。苹果公司在过去 3 年里一直在培训 iPhoneOS 用户如何使用他们的操作系统和界面元素。作为程序员或设计师,您最不想做的就是花时间尝试培训用户如何使用您的应用程序。他们通常会从设备中删除您的应用程序并转移到另一个类似的应用程序,而不是强迫自己学习 你的 做事的方式。

只是我的 $.02

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top