Como desativar o botão Editar que aparece no mais seção de um UITabBarController?

StackOverflow https://stackoverflow.com/questions/825066

  •  05-07-2019
  •  | 
  •  

Pergunta

Na minha aplicação (com base no modelo XCode aplicação bar Tab) eu uso um UITabBarController para exibir uma lista de diferentes seções do aplicativo que o acesso do usuário pode.

Por padrão, os UITabBarController exibe um botão 'Mais' na barra de abas quando há mais de 5 itens. Além disso, ele permite que o usuário selecione os itens que ele quer ser visível na barra de guia.

Atualmente eu não posso implementar salvar e carregar o estado do controlador de barra de abas, então eu quero desativar o botão 'Editar'.

Existe alguma maneira de desativar / hide 'Editar' botão da barra que aparece no 'Mais' controlador de navegação de UITabBarController?

Eu tentei:

tabBarController.moreNavigationController.navigationBar.topItem.rightBarButtonItem = nil;

e

tabBarController.moreNavigationController.navigationBar.topItem.rightBarButtonItem.enabled = NO;

mas eles não parecem funcionar.

Foi útil?

Solução

Torne-se um delegado de moreNavigationController (é um UINavigationController) e adicionar o seguinte:

- (void)navigationController:(UINavigationController *)navigationController
        willShowViewController:(UIViewController *)viewController
        animated:(BOOL)animated {

    UINavigationBar *morenavbar = navigationController.navigationBar;
    UINavigationItem *morenavitem = morenavbar.topItem;
    /* We don't need Edit button in More screen. */
    morenavitem.rightBarButtonItem = nil;
}

Agora, ele não aparecerá. A principal coisa a considerar é que o botão Editar aparece não após a criação do controlador, mas antes de exibir a vista, e nós deve sentar-se em silêncio até aquele momento e, em seguida, quando o controlador vai exibir a tela, que vai bater o botão de modo que ele não terá a chance de criá-la novamente. :)

Outras dicas

customizableViewControllers é uma matriz; configurá-lo para a matriz vazia para desativar toda a edição.

tabBarController.customizableViewControllers = [NSArray arrayWithObjects:nil];
tabBarController .customizableViewControllers = nil;

Eu tentei e aqui está um exemplo.

Em AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after application launch.

    // Add the tab bar controller's view to the window and display.
    [self.window addSubview:tabBarController.view];
    [self.window makeKeyAndVisible];

    //setting delegate to disable edit button in more.
    tabBarController.moreNavigationController.delegate = self;

    return YES;
}

Para remover o botão "Editar"

    - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
        UINavigationBar *morenavbar = navigationController.navigationBar;
        UINavigationItem *morenavitem = morenavbar.topItem;
        /* We don't need Edit button in More screen. */
morenavitem.rightBarButtonItem = nil;
}

Em seu AppDelegate.h

@interface TestAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate, UINavigationControllerDelegate>

me corrija se eu estiver errado.

Eu era capaz de começar este trabalho com o seguinte código. Eu criei um CustomTabViewController e depois modificado Classe Identidade do meu Tab Bar Controller em Interface Builder para usar esta classe personalizada. Aqui está o código que ele usa (.h e conteúdo do arquivo .m). A chave é definir a propriedade a zero, o que faz com que o botão Editar para não ser exibida. Para mais detalhes ver: http://developer.apple.com/library/ios/documentation/uikit/reference/UITabBarController_Class/Reference/Reference.html#//apple_ref/occ/instp/UITabBarController/customizableViewControllers "Se a matriz está vazia ou o valor dessa propriedade é nulo, a barra de abas não permite nenhum produto para ser reorganizados."

#import <UIKit/UIKit.h>

@interface CustomTabBarController : UITabBarController {

}
@end

#import "CustomTabBarController.h"


@implementation CustomTabBarController

- (void)viewDidLoad
{
    self.customizableViewControllers = nil;
    [super viewDidLoad];
}   

@end

Isto pode ser alcançado como tal. Não é a solução mais elegante, mas funciona ™.

// Optional UITabBarControllerDelegate method
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
    [self performSelector:@selector(removeEdit) withObject:nil afterDelay:.0001];
}
- (void)removeEdit
{
    tabBarController.moreNavigationController.navigationBar.topItem.rightBarButtonItem = nil;   
}

Basta adicionar uma linha de código no método de ciclo de vida ou seja, a aplicação fez lançamento acabamento:

- (void)applicationDidFinishLaunching:(UIApplication *)application
{ 
    tabBarController.customizableViewControllers=nil;

}

@ m4rkk & @lan terrell que o código não funciona.

Eu não era capaz de obtê-lo, então eu só desativar a barra de navegação completamente.

tabBarController.moreNavigationController.navigationBar.hidden = YES;

Eu não sei sobre iOS4, mas importa se você colocar o código no viewDidLoad vs viewWillAppear.

Ie., Isso vai funcionar.

- (void)viewWillAppear:(BOOL)animated
{
self.customizableViewControllers = nil;
}

Se você usar NavigationController como seu 1º ViewController e pressionar um dos botões para entrar UITabBarController. Em seguida, além de adicionar o código abaixo,

- (void)navigationController:(UINavigationController *)navigationController
        willShowViewController:(UIViewController *)viewController
        animated:(BOOL)animated 
{
    UINavigationBar *morenavbar = navigationController.navigationBar;
    UINavigationItem *morenavitem = morenavbar.topItem;
    /* We don't need Edit button in More screen. */
    morenavitem.rightBarButtonItem = nil;
}

Você precisa adicionar esta "if" para evitar o botão Editar aparece quando você clique 5º ViewControllers e acima.

if (self.selectedIndex >= 4) 
{
    self.customizableViewControllers = nil;
}

Ao aqueles que trabalham com Xcode maior que 4,0 (Eu estou trabalhando em Xcode 4.2 for Snow Leopard):

Verifique em primeiro lugar onde você mudar a matriz de pontos de vista pela última vez. Eu acho que não importa em qual método você definir o seu customizableView-Array para nil. Maçãs descrição diz:

Importante: Adicionar ou remover controladores de vista em sua interface de barra de abas também redefine a matriz de customizáveis ??Veja controladores para o valor padrão, permitindo que todos os controladores de vista para ser personalizado novamente. Portanto, se você fazer modificações no imóvel viewControllers (diretamente ou chamando os setViewControllers: animado: Método). E ainda querem limitar os controladores de vista personalizáveis, você também deve atualizar a matriz de objetos na propriedade customizableViewControllers

Ela trabalhou para mim, então por favor experimentá-lo. Eu encontrei esta descrição aqui: link para a descrição em developer.apple.com no capítulo "Prevenir a Personalização de Tabs".

Um iPhone 6 Plus permitirá que mais botões na barra de guia no modo paisagem do que no retrato. Infelizmente isso significa que redefine a matriz customizableViewControllers sempre que o dispositivo é girado, e nenhuma das respostas aqui trabalharam para mim.

Eu já tinha minha própria subclasse UITabBarController e substituindo os métodos setter e getter para customizableViewControllers era a única maneira confiável para remover o botão Editar na tela Mais:

- (NSArray *)customizableViewControllers
{
    return nil;
}

- (void)setCustomizableViewControllers:(NSArray*)controllers
{
    //do nothing
}

Esta é uma adição tardia mas eu acho que é uma contribuição útil. A resposta de Aleks N pode criar uma situação onde o rightBarButtonItem é removido para cada controlador de vista sob o título "Mais Tab" (como Bao Lei mencionado). Gostaria de recomendar usando o Código de Bao Lei, mas com a diferença de implenting isso que o didShowViewController método delegado.

Como seu código existe agora, os usuários tocando na guia "Mais" para retornar à base de UIMoreViewController tabela pode causar rightBarButtonItem de que pertencem a outras viewControllers a ser definido a zero.

- (void)navigationController:(UINavigationController *)navigationController
       didShowViewController:(UIViewController *)viewController
                    animated:(BOOL)animated
{
    if (navigationController.viewControllers.count == 1)
    {
        UINavigationBar *morenavbar = navigationController.navigationBar;
        UINavigationItem *morenavitem = morenavbar.topItem;
        /* We don't need Edit button in More screen. */
        morenavitem.rightBarButtonItem = nil;
    }
}

A distinção é pequeno, mas ele me levou uma quantidade considerável de tempo para encontrar este bug.

obras resposta Aleks de N, mas eu gostaria de modificar um pouco

- (void)navigationController:(UINavigationController *)navigationController
      willShowViewController:(UIViewController *)viewController
                    animated:(BOOL)animated
{
    if (navigationController.viewControllers.count == 1)
    {
        UINavigationBar *morenavbar = navigationController.navigationBar;
        UINavigationItem *morenavitem = morenavbar.topItem;
        /* We don't need Edit button in More screen. */
        morenavitem.rightBarButtonItem = nil;
    }
}

Uma vez que este método de delegado é chamado toda vez que quando um controlador de vista é empurrado ou bateu nessa pilha vista. Quando estamos empurrando outros pontos de vista sobre este "mais" controlador de vista, nós não queremos fazer isso.

A única solução que funcionou para mim

self.moreNavigationController.navigationBar.topItem?.rightBarButtonItem?.title = ""
self.moreNavigationController.navigationBar.topItem?.rightBarButtonItem?.isEnabled = false

Eu tentei a maioria destas soluções e foi correndo em um problema onde o botão editar voltaria ao girar o dispositivo. A rotação iria repor de volta para o primeiro controlador de vista, então quando voltei para o mais controlador de vista, o botão editar estava lá. A melhor solução era para se tornar o UITabBarControllerDelegate e definir o botão da barra de direito da qualquer hora nil mais controlador de vista tornou-se o controlador de vista selecionado. Esse é um trabalho para iOS 11-12.

final class DashboardController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()

        delegate = self
    }
}

extension DashboardController: UITabBarControllerDelegate {
    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
        if viewController == moreNavigationController {
            moreNavigationController.navigationBar.topItem?.rightBarButtonItem = nil
        }
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top