UISplitViewController displayModeButtonItem()

时间:2014-09-15 16:27:11

标签: swift ios8

有人知道如何更改从UISplitViewController委托返回的按钮的文本(和外观?):

func displayModeButtonItem() -> UIBarButtonItem?

9 个答案:

答案 0 :(得分:19)

我以这种方式为自己解决了这个问题:

UIBarButtonItem(image: UIImage(named:"home"),
            landscapeImagePhone: UIImage(named:"home"),
            style: UIBarButtonItemStyle.Plain,
            target: splitViewController.displayModeButtonItem().target,
            action: splitViewController.displayModeButtonItem().action)

我在AppDelegate而不是splitViewController.displayModeButtonItem()中使用它,它对我来说很好。

答案 1 :(得分:5)

我在我的解决方案中结合了josh&voluntas88的解决方案。

首先,您需要使用UISplitViewControllerDelegate方法 func targetDisplayModeForActionInSplitViewController(_ svc: UISplitViewController) -> UISplitViewControllerDisplayMode 然后添加自定义的UIBarButtonItem。这是我的解决方案:

func targetDisplayModeForActionInSplitViewController(svc: UISplitViewController) -> UISplitViewControllerDisplayMode {
        if svc.displayMode == UISplitViewControllerDisplayMode.PrimaryHidden || svc.displayMode == UISplitViewControllerDisplayMode.PrimaryOverlay {
            self.navigationItem.leftBarButtonItem = UIBarButtonItem(image: UIImage(named:"menu.png"),
                landscapeImagePhone: UIImage(named:"menu.png"),
                style: UIBarButtonItemStyle.Plain,
                target: self.splitViewController!.displayModeButtonItem().target,
                action: self.splitViewController!.displayModeButtonItem().action)
        }else {
// disable button on landscape
            if UIApplication.sharedApplication().statusBarOrientation == UIInterfaceOrientation.LandscapeLeft || UIApplication.sharedApplication().statusBarOrientation == UIInterfaceOrientation.LandscapeRight {
                self.navigationItem.leftBarButtonItem?.enabled = false
            }
        }
        return UISplitViewControllerDisplayMode.Automatic
    }

答案 2 :(得分:3)

在targetDisplay中执行此操作可以实现,但在旋转结束时可以看到删除/添加按钮,最好在splitViewController中执行此操作:willChangeToDisplayMode:displayMode但请记住,这也应该在viewDidLoad上处理因为在启动时没有调用该委托方法。

 - (void)splitViewController:(UISplitViewController *)svc willChangeToDisplayMode:(UISplitViewControllerDisplayMode)displayMode
    {
        if (displayMode == UISplitViewControllerDisplayModePrimaryHidden || displayMode == UISplitViewControllerDisplayModePrimaryOverlay) {
            self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Lista" style:UIBarButtonItemStylePlain target:self.splitViewController.displayModeButtonItem.target action:self.splitViewController.displayModeButtonItem.action];
        } else {
           self.navigationItem.leftBarButtonItem = nil;
        }
    }

答案 3 :(得分:2)

我尝试了EmilDo的解决方案,但未显示导航按钮。我稍微更改了解决方案,并使用以下代码:

DetailViewController:

override func viewDidLayoutSubviews() {
    if splitViewController!.displayMode == UISplitViewControllerDisplayMode.PrimaryHidden || splitViewController!.displayMode == UISplitViewControllerDisplayMode.PrimaryOverlay {
        let displayModeButton = splitViewController!.displayModeButtonItem()
        let searchButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Search, target: displayModeButton.target, action: displayModeButton.action)
        navigationItem.leftBarButtonItem = searchButton
    } else {
        navigationItem.leftBarButtonItem = nil
    }
}

SplitViewController:

func splitViewController(svc: UISplitViewController, willChangeToDisplayMode displayMode: UISplitViewControllerDisplayMode) {
    svc.view.setNeedsLayout()
}

答案 4 :(得分:2)

通过Interface Builder Visual guide

在主视图控制器中设置导航项的“后退按钮”文本属性来设置此文本。

答案 5 :(得分:1)

我有同样的问题。

这就是我要解决的问题,我会更新我的搜索结果。

UIBarButtonItem返回的displayModeButtonItemUISplitViewController在其自己的美好时光中管理。因此,您所做的任何更改都会被阻止。

但是有一个新的委托功能:

- (UISplitViewControllerDisplayMode)targetDisplayModeForActionInSplitViewController:(UISplitViewController *)svc

我将创建自己的UIBarButtonItem,它会根据此函数何时触发而发生变化。

然后我会根据需要触发显示模式。

答案 6 :(得分:1)

我想通过在displayModeButtonItem中显示标题的正确解决方案来更新它。此方法显示后退箭头以及正确的文本。从我所知道的,上述大多数解决方案最后都不包括后箭头。我尝试过几种不同的设置,但是当主视图再次打开和关闭时(iPad Portrait),它总是被擦除,只留下我的后箭头。

您必须设置"标题"主视图的navigationController上的属性。

请注意,这与在主视图的导航项上设置后退和标题文本不同。导航项目的设置将无效。

select the navigation controller for the master view, then set the "Title Property in the Attributes Inspector"

答案 7 :(得分:0)

所以我正在寻找一种方法在我的UISplitViewController上实现一个自定义按钮,该按钮显示RootViewController(侧抽屉或覆盖,无论它被调用)。我来到这个页面,问题是更改从UISplitViewControllerDelegate发送的按钮。似乎没有可以在该委托中实现的调用,但您可以将按钮设置为自定义栏按钮项

在DetailViewController上,非抽屉覆盖视图,您只需要声明它并将自定义按钮的动作和目标指向与UISplitViewController的按钮相同

self.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Add, target: self.splitViewController!.displayModeButtonItem().target, action: self.splitViewController!.displayModeButtonItem().action) 

答案 8 :(得分:0)

以上所有解决方案的问题在于,不显示后退按钮图像,至少在我尝试创建自定义栏按钮项目的项目中没有显示。当使用UISplitViewController displayModeButtonItem并设置主视图控制器左栏按钮项以补充后退按钮项(controller.navigationItem.leftItemsSupplementBackButton = YES)时,小<符号出现在左侧栏按钮项目标题之前。有了自定义的,它没有。