【问题标题】:UISplitViewController displayModeButtonItem()UISplitViewController displayModeButtonItem()
【发布时间】:2014-09-15 16:27:11
【问题描述】:

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

func displayModeButtonItem() -> UIBarButtonItem?

【问题讨论】:

    标签: swift ios8


    【解决方案1】:

    我是这样自己解决的:

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

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

    【讨论】:

    • 你把初始化的barButtonItem分配给哪个navigationItem?
    • 这个答案应该被题主接受为正确答案。
    【解决方案2】:

    我在我的解决方案上结合了 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
        }
    

    【讨论】:

    • 为什么不使用svc 函数参数而不是强制解开splitViewController 成员属性?除此之外,这看起来不错。我试试看。
    【解决方案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;
            }
        }
    

    【讨论】:

      【解决方案4】:

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

      您必须在主视图的导航控制器上设置“标题”属性。

      请注意,这与在主视图的导航项上设置 Back 和 Title 文本不同。导航项上的设置将不起作用。

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

      【讨论】:

        【解决方案5】:

        我尝试了 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()
        }
        

        【讨论】:

          【解决方案6】:

          这个文本是通过Interface Builder在Master View Controller中设置Navigation Item的“Back Button”文本属性设置的@

          【讨论】:

          • 对不起,这种方法在 Xcode 9.2 / iOS 11 / Swift 4 中不起作用
          • 这实际上确实用于更改按钮文本。要提供图像,请使用above 中的方法。
          【解决方案7】:

          我也有同样的问题。

          这就是我要解决的方法,我会更新我的结果。

          displayModeButtonItem 返回的UIBarButtonItemUISplitViewController 适时管理。因此,您所做的任何更改都会被阻止。

          但是有一个新的委托函数:

          - (UISplitViewControllerDisplayMode)targetDisplayModeForActionInSplitViewController:(UISplitViewController *)svc
          

          我将创建我自己的UIBarButtonItem,它将根据此函数的触发时间而改变。

          然后我会让它酌情触发显示模式。

          【讨论】:

            【解决方案8】:

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

            在DetailViewController,nondrawer,overlay view,你只需要声明它,并且将你自定义按钮的action和target指向和UISplitViewController的按钮一样

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

            【讨论】:

              【解决方案9】:

              上述所有解决方案的问题是没有显示后退按钮图像,至少在我尝试创建自己的自定义栏按钮项的项目中没有。使用 UISplitViewController displayModeButtonItem 并设置主视图控制器左栏按钮项目补充后退按钮项目时(controller.navigationItem.leftItemsSupplementBackButton = YES),小

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2023-03-10
                • 2015-06-23
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-04-16
                • 1970-01-01
                相关资源
                最近更新 更多