Como desativar o botão Editar que aparece no mais seção de um UITabBarController?
-
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.
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
}
}
}