有人知道如何更改从UISplitViewController委托返回的按钮的文本(和外观?):
func displayModeButtonItem() -> UIBarButtonItem?
答案 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)
答案 5 :(得分:1)
我有同样的问题。
这就是我要解决的问题,我会更新我的搜索结果。
UIBarButtonItem
返回的displayModeButtonItem
由UISplitViewController
在其自己的美好时光中管理。因此,您所做的任何更改都会被阻止。
但是有一个新的委托功能:
- (UISplitViewControllerDisplayMode)targetDisplayModeForActionInSplitViewController:(UISplitViewController *)svc
我将创建自己的UIBarButtonItem
,它会根据此函数何时触发而发生变化。
然后我会根据需要触发显示模式。
答案 6 :(得分:1)
我想通过在displayModeButtonItem中显示标题的正确解决方案来更新它。此方法显示后退箭头以及正确的文本。从我所知道的,上述大多数解决方案最后都不包括后箭头。我尝试过几种不同的设置,但是当主视图再次打开和关闭时(iPad Portrait),它总是被擦除,只留下我的后箭头。
您必须设置"标题"主视图的navigationController上的属性。
请注意,这与在主视图的导航项上设置后退和标题文本不同。导航项目的设置将无效。
答案 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)时,小<符号出现在左侧栏按钮项目标题之前。有了自定义的,它没有。