Отображение UISplitViewControllerModeButtonItem()

Кто-нибудь знает способ изменить текст (и внешний вид?) кнопки, возвращаемой делегатом UISplitViewController:

func displayModeButtonItem() -> UIBarButtonItem?

Ответ 1

Я решил это для себя таким образом:

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

Я использую это в AppDelegate вместо splitViewController.displayModeButtonItem(), и он отлично работает для меня.

Ответ 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
    }

Ответ 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

У меня такая же проблема.

Вот как я собираюсь это решить, я обновлю свои результаты.

UIBarButtonItem, возвращаемый displayModeButtonItem, управляется UISplitViewController в свое время. Поэтому любые сделанные вами изменения блокируются.

Однако есть новая функция делегата:

- (UISplitViewControllerDisplayMode)targetDisplayModeForActionInSplitViewController:(UISplitViewController *)svc

Я собираюсь создать свой собственный UIBarButtonItem, который изменится в зависимости от того, когда эта функция срабатывает.

Затем я заставлю его запустить режим отображения.

Ответ 5

Этот текст задается установкой свойства текста "Назад Button" элемента навигации в главном контроллере просмотра через построитель интерфейса Визуальный путеводитель

Ответ 6

Я хотел обновить это с помощью правильного решения, чтобы показать заголовок в displayModeButtonItem. Этот метод показывает обратную стрелку, а также соответствующий текст. Большинство из вышеперечисленных решений не включают в себя обратную стрелку в конце, из того, что я мог сказать. Я попытался установить это несколько разных способов, но его всегда удаляли, когда главное представление открывалось и закрывалось снова (iPad Portrait), оставляя меня только со стрелкой назад.

Вы должны установить свойство "Заголовок" на навигационном контроллере Master View.

Обратите внимание, что это отличается от установки текстов "Назад" и "Заголовок" в навигационном элементе главного представления. Настройка на навигационном элементе НЕ будет работать.

выберите контроллер навигации для главного представления, затем установите "Свойство заголовка в инспекторе атрибутов"

Ответ 7

Итак, я искал способ реализовать пользовательскую кнопку на моем UISplitViewController, кнопку, которая показывает RootViewController (боковой ящик или наложение, независимо от его имени). Я пришел на эту страницу, и вопрос заключается в том, чтобы изменить кнопку, которая отправляется из UISplitViewControllerDelegate. Похоже, что нет никакого вызова, который вы можете реализовать в этом делетете, но вы можете просто установить кнопку как элемент пользовательской панели.

В элементе DetailViewController, в режиме просмотра без наложения, вам просто нужно объявить его и указать действие и цель вашей настраиваемой кнопки, чтобы они были такими же, как кнопка UISplitViewController

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

Ответ 8

Проблема со всеми вышеперечисленными решениями заключается в том, что обратное изображение кнопки не отображается, по крайней мере, не в моем проекте, где я пытался создать свой собственный элемент панели кнопок. При использовании UISplitViewController displayModeButtonItem и установки элемента управления левой кнопкой мыши главного контроллера для дополнения элемента кнопки "Назад" (controller.navigationItem.leftItemsSupplementBackButton = YES) символ появляется перед заголовком элемента левой кнопки. С обычным, это не так.

Ответ 9

Я попробовал решение 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()
}